Return-Path: X-Original-To: apmail-myfaces-users-archive@www.apache.org Delivered-To: apmail-myfaces-users-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8CE5E10B9D for ; Fri, 14 Feb 2014 07:49:48 +0000 (UTC) Received: (qmail 36872 invoked by uid 500); 14 Feb 2014 07:49:47 -0000 Delivered-To: apmail-myfaces-users-archive@myfaces.apache.org Received: (qmail 36528 invoked by uid 500); 14 Feb 2014 07:49:46 -0000 Mailing-List: contact users-help@myfaces.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "MyFaces Discussion" Delivered-To: mailing list users@myfaces.apache.org Received: (qmail 36519 invoked by uid 99); 14 Feb 2014 07:49:46 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Feb 2014 07:49:46 +0000 X-ASF-Spam-Status: No, hits=2.5 required=5.0 tests=FREEMAIL_REPLY,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of karl.kilden@gmail.com designates 209.85.219.54 as permitted sender) Received: from [209.85.219.54] (HELO mail-oa0-f54.google.com) (209.85.219.54) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Feb 2014 07:49:40 +0000 Received: by mail-oa0-f54.google.com with SMTP id i4so14167520oah.13 for ; Thu, 13 Feb 2014 23:49:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=HLJ9AjRLj+TY+OGQ13gXpKmRu9DhejKSOSw2D3sJpd8=; b=Kppj6jEEZhMaLwS4GTox+J3heDurpOfrb63Rpi5cS+DVxb1Q0Ieew/aQo4t59FMjrD 2FLKhh9VVkmleLRYnvQ1Y0THrMiTy6nrS3D3zojKc/KmAeBdAdsj/geeViavW5kOghfo AUvM8V+h2tj70oIws30xobnWjGuRY6YhTSFa4tNRe77N7/CuBpnyrzfn0WmOzxqegD5U 4Pmr3AmvF2PQ4zHRsJ5LwPMo9PyNeowlht++f4LB3U7iTka44ztvJxUlr46GkQwJVNPQ KDYlWA62tz60INRe/U3EzjT/JIKQtjRabEkwhXpo+EwS/wYgEp2rCAhB0nlSYvohyBr2 FiPw== MIME-Version: 1.0 X-Received: by 10.60.98.40 with SMTP id ef8mr5266943oeb.13.1392364159769; Thu, 13 Feb 2014 23:49:19 -0800 (PST) Received: by 10.76.81.102 with HTTP; Thu, 13 Feb 2014 23:49:19 -0800 (PST) In-Reply-To: References: Date: Fri, 14 Feb 2014 08:49:19 +0100 Message-ID: Subject: Re: Re: Re: Problems with a custom component when migrating from Glassfish(mojarra) to TomEE From: =?ISO-8859-1?Q?Karl_Kild=E9n?= To: MyFaces Discussion Content-Type: multipart/alternative; boundary=089e013a182224200004f2590beb X-Virus-Checked: Checked by ClamAV on apache.org --089e013a182224200004f2590beb Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Rene, I at least can't see anything. Another thing to think about it what impl stuff you have actually worked with? I mean mojarra should have about the same stuff as myfaces? To make myself clear, what does the components and stuff you extend really belong to? Shouldn't be impossible to find equivalents in myfaces... On 14 February 2014 08:45, Rene Perschon wrote: > Yes, here it is. It's a two-stage component which displays a hierarchical > (2 levels) selection choice. > > > > Gesendet: Donnerstag, 13. Februar 2014 um 16:57 Uhr > Von: "Howard W. Smith, Jr." > An: "MyFaces Discussion" > Betreff: Re: Re: Problems with a custom component when migrating from > Glassfish(mojarra) to TomEE > do you have a screen capture or some type of demo of the Select component= ? > > > > On Thu, Feb 13, 2014 at 8:39 AM, Rene Perschon > wrote: > > > I don't think a TagHandler or a custom component can do what that code > > does. It's used to display a Select in a very specific way. > > > > > > > > Gesendet: Donnerstag, 13. Februar 2014 um 14:29 Uhr > > Von: "Karl Kild=E9n" > > An: "MyFaces Discussion" > > Betreff: Re: Problems with a custom component when migrating from > > Glassfish(mojarra) to TomEE > > Have you considered a custom tagHandler / composite component instead? > > > > I took a quick look but I don't recognize much sorry. > > > > > > On 13 February 2014 14:09, Howard W. Smith, Jr. > >wrote: > > > > > I think Leonardo, Gerhard, or one of the other committers may provide > her > > > some good help, just to get another MyFaces user, especially when one > is > > > migrating from Mojarra to MyFaces. > > > > > > @Renee, +1 your goal/request. > > > > > > I migrated from Mojarra to MyFaces, first, and then 2 months later, I > > > migrated from Glassfish to tomee (and JSF managed beans to CDI manage= d > > > beans at same time). Thomas, Romain, Mark Struberg, and others provid= ed > > > great help and motivation. Apache tomee, MyFaces, tomcat user mail > lists > > > are definitely the place to be. > > > > > > But I didn't have code dependent on the Mojarra library like you do. > > Still, > > > it took me about a week to migrate from Mojarra to MyFaces. Thomas an= d > > > Leonardo motivated me to start the migration after reading about the > > > performance comparison between Mojarra and MyFaces. Mark Struberg blo= g, > > why > > > is OpenWebBeans so fast, motivated me to migrate to CDI and tomee. :-= ) > > > > > > I love high performance, that's why I opted to use MyFaces, tomee, > > > OpenWebBeans, and JUEL. > > > > > > Wishing you much success. > > > On Feb 13, 2014 7:23 AM, "Thomas Andraschko" < > > andraschko.thomas@gmail.com> > > > wrote: > > > > > > > I don't think that anyone will port your complete code and give you= a > > > > complete solution ;) > > > > > > > > The biggest problem is AFAIR that the renderer implementations are > not > > in > > > > the API packages. So you have to rebuild all this functionality > without > > > > dependencies to the Impl. > > > > > > > > e.g. > > > > Attribute,AttributeManager -> String[] with attribute namens > > > > Move all the utils functions to your own code > > (Util.componentIsDisabled, > > > > RenderKitUtils.getSelectItems. etc.) > > > > > > > > The most code doesn't really depent on the IMPL code. > > > > > > > > > > > > 2014-02-13 12:44 GMT+01:00 Rene Perschon : > > > > > > > > > Hi everyone! > > > > > > > > > > I'm currently migrating an application from Glassfish 3.1.1 to > TomEE. > > > Now > > > > > the problem is that this application contains a custom component > > which > > > > was > > > > > unfortunately coded with hard dependencies on com.sun.faces class= es > > > > (maven > > > > > dependency jsf-impl). > > > > > > > > > > Now my question is how can i port this component in such a way th= at > > it > > > is > > > > > independent from any concrete JSF implementation (or at least in > > such a > > > > way > > > > > that it works with MyFaces). > > > > > > > > > > Here's the component: > > > > > > > > > > import java.io.IOException; > > > > > import java.util.Iterator; > > > > > import java.util.Map; > > > > > > > > > > import javax.faces.component.UIComponent; > > > > > import javax.faces.component.UINamingContainer; > > > > > import javax.faces.component.ValueHolder; > > > > > import javax.faces.context.FacesContext; > > > > > import javax.faces.context.ResponseWriter; > > > > > import javax.faces.convert.Converter; > > > > > import javax.faces.model.SelectItem; > > > > > import javax.faces.model.SelectItemGroup; > > > > > > > > > > import com.sun.faces.renderkit.Attribute; > > > > > import com.sun.faces.renderkit.AttributeManager; > > > > > import com.sun.faces.renderkit.RenderKitUtils; > > > > > import com.sun.faces.renderkit.html_basic.MenuRenderer; > > > > > import com.sun.faces.util.RequestStateManager; > > > > > import com.sun.faces.util.Util; > > > > > > > > > > /** > > > > > * {@inheritDoc}. > > > > > */ > > > > > public class CustomSelectManyCheckboxListRenderer extends > > MenuRenderer > > > > > { > > > > > /** {@inheritDoc}. */ > > > > > private static final Attribute[] ATTRIBUTES =3D > > > > > > > > > AttributeManager.getAttributes(AttributeManager.Key.SELECTMANYCHECKBOX); > > > > > /** Representing the border string. */ > > > > > private static final String BORDER =3D "border"; > > > > > /** Representing the tr string. */ > > > > > private static final String TR =3D "tr"; > > > > > /** Representing the td string. */ > > > > > private static final String TD =3D "td"; > > > > > /** Representing the label string. */ > > > > > private static final String LABEL =3D "label"; > > > > > /** Representing the newline string. */ > > > > > private static final String NEWLINE =3D "\n"; > > > > > /** Representing the tab string. */ > > > > > private static final String TAB =3D "\t"; > > > > > /** Representing the class string. */ > > > > > private static final String CLASS =3D "class"; > > > > > /** Representing the style string. */ > > > > > private static final String STYLE =3D "style"; > > > > > /** Representing the valign string. */ > > > > > private static final String VALIGN =3D "valign"; > > > > > > > > > > > > > > > // ---------------------------------------------------------- > > > Public > > > > > Methods > > > > > > > > > > > > > > > @Override > > > > > public void encodeEnd(FacesContext context, UIComponent component= ) > > > > > throws IOException > > > > > { > > > > > > > > > > rendererParamsNotNull(context, component); > > > > > > > > > > if (!shouldEncode(component)) > > > > > { > > > > > return; > > > > > } > > > > > > > > > > ResponseWriter writer =3D context.getResponseWriter(); > > > > > assert (writer !=3D null); > > > > > > > > > > String alignStr; > > > > > Object borderObj; > > > > > boolean alignVertical =3D false; > > > > > int border =3D 0; > > > > > > > > > > > > > > > > > > > > if (null !=3D component.getAttributes().get("layout")) > > > > > { > > > > > alignStr =3D (String) > > > component.getAttributes().get("layout"); > > > > > alignVertical =3D alignStr.equalsIgnoreCase("pageDirection"); > > > > > } > > > > > > > > > > if (null !=3D component.getAttributes().get(BORDER)) > > > > > { > > > > > borderObj =3D component.getAttributes().get(BORDER); > > > > > border =3D (Integer) borderObj; > > > > > } > > > > > > > > > > Converter converter =3D null; > > > > > if (component instanceof ValueHolder) > > > > > { > > > > > converter =3D ((ValueHolder)component).getConverter(); > > > > > } > > > > > > > > > > renderBeginText(component, border, alignVertical, context, > > > true); > > > > > > > > > > Iterator items =3D > > > > > RenderKitUtils.getSelectItems(context, component); > > > > > > > > > > Object currentSelections =3D getCurrentSelectedValues(component); > > > > > Object[] submittedValues =3D > > > getSubmittedSelectedValues(component); > > > > > Map attributes =3D component.getAttributes(); > > > > > OptionComponentInfo optionInfo =3D > > > > > new OptionComponentInfo((String) > > > > > attributes.get("disabledClass"), > > > > > (String) > > > > > attributes.get("enabledClass"), > > > > > (String) > > > > > attributes.get("unselectedClass"), > > > > > (String) > > > > > attributes.get("selectedClass"), > > > > > > > > > Util.componentIsDisabled(component), > > > > > isHideNoSelection(component)); > > > > > int idx =3D -1; > > > > > while (items.hasNext()) > > > > > { > > > > > SelectItem curItem =3D items.next(); > > > > > idx++; > > > > > // If we come across a group of options, render them as a > > > > > nested > > > > > // table. > > > > > if (curItem instanceof SelectItemGroup) > > > > > { > > > > > // write out the label for the group. > > > > > if (curItem.getLabel() !=3D null) > > > > > { > > > > > if (alignVertical) > > > > > { > > > > > writer.startElement(TR, component); > > > > > } > > > > > writer.startElement(TD, component); > > > > > writer.writeText(curItem.getLabel(), component, > > > > LABEL); > > > > > writer.endElement(TD); > > > > > if (alignVertical) > > > > > { > > > > > writer.endElement(TR); > > > > > } > > > > > > > > > > } > > > > > if (alignVertical) > > > > > { > > > > > writer.startElement(TR, component); > > > > > } > > > > > writer.startElement(TD, component); > > > > > writer.writeText(NEWLINE, component, null); > > > > > renderBeginText(component, 0, alignVertical, > > > > > context, false); > > > > > // render options of this group. > > > > > SelectItem[] itemsArray =3D > > > > > ((SelectItemGroup) curItem).getSelectItems(); > > > > > for (int i =3D 0; i < itemsArray.length; ++i) > > > > > { > > > > > renderOption(context, > > > > > component, > > > > > converter, > > > > > itemsArray[i], > > > > > currentSelections, > > > > > submittedValues, > > > > > alignVertical, > > > > > i, > > > > > optionInfo); > > > > > } > > > > > renderEndText(component, alignVertical, context); > > > > > writer.endElement(TD); > > > > > if (alignVertical) > > > > > { > > > > > writer.endElement(TR); > > > > > writer.writeText(NEWLINE, component, null); > > > > > } > > > > > } > > > > > else > > > > > { > > > > > renderOption(context, > > > > > component, > > > > > converter, > > > > > curItem, > > > > > currentSelections, > > > > > submittedValues, > > > > > alignVertical, > > > > > idx, > > > > > optionInfo); > > > > > } > > > > > } > > > > > > > > > > renderEndText(component, alignVertical, context); > > > > > > > > > > } > > > > > > > > > > // ------------------------------------------------------- > > > Protected > > > > > Methods > > > > > > > > > > > > > > > /** > > > > > * {@inheritDoc} > > > > > */ > > > > > @Override > > > > > protected boolean isBehaviorSource(FacesContext ctx, > > > > > String behaviorSourceId, > > > > > String componentClientId) > > > > > { > > > > > > > > > > if (behaviorSourceId =3D=3D null) > > > > > { > > > > > return false; > > > > > } > > > > > char sepChar =3D UINamingContainer.getSeparatorChar(ctx); > > > > > String actualBehaviorId =3D > > > > > behaviorSourceId.substring(0, > > > > > behaviorSourceId.lastIndexOf(sepChar)); > > > > > return (actualBehaviorId.equals(componentClientId)); > > > > > > > > > > } > > > > > > > > > > /** > > > > > * {@inheritDoc} > > > > > */ > > > > > protected void renderBeginText(UIComponent component, int border, > > > > > boolean alignVertical, FacesContext > > > > > context, > > > > > boolean outerTable) throws > > > IOException > > > > > { > > > > > ResponseWriter writer =3D context.getResponseWriter(); > > > > > assert (writer !=3D null); > > > > > > > > > > writer.startElement("table", component); > > > > > if (border !=3D Integer.MIN_VALUE) > > > > > { > > > > > writer.writeAttribute(BORDER, border, BORDER); > > > > > } > > > > > > > > > > // render style and styleclass attribute on the outer table > > > > > instead of > > > > > // rendering it as pass through attribute on every option in > > > the > > > > > list. > > > > > if (outerTable) > > > > > { > > > > > // render "id" only for outerTable. > > > > > if (shouldWriteIdAttribute(component)) > > > > > { > > > > > writeIdAttributeIfNecessary(context, writer, > > > component); > > > > > } > > > > > String styleClass =3D (String) component.getAttributes().get( > > > > > "styleClass"); > > > > > String style =3D (String) > > > component.getAttributes().get(STYLE); > > > > > if (styleClass !=3D null) > > > > > { > > > > > writer.writeAttribute(CLASS, styleClass, CLASS); > > > > > } > > > > > if (style !=3D null) > > > > > { > > > > > writer.writeAttribute(STYLE, style, STYLE); > > > > > } > > > > > } > > > > > writer.writeText(NEWLINE, component, null); > > > > > > > > > > if (!alignVertical) > > > > > { > > > > > writer.writeText(TAB, component, null); > > > > > writer.startElement(TR, component); > > > > > writer.writeText(NEWLINE, component, null); > > > > > } > > > > > > > > > > } > > > > > > > > > > /** > > > > > * {@inheritDoc} > > > > > */ > > > > > protected void renderEndText(UIComponent component, > > > > > boolean alignVertical, > > > > > FacesContext context) throws > > > IOException > > > > > { > > > > > > > > > > ResponseWriter writer =3D context.getResponseWriter(); > > > > > assert (writer !=3D null); > > > > > > > > > > if (!alignVertical) > > > > > { > > > > > writer.writeText(TAB, component, null); > > > > > writer.endElement(TR); > > > > > writer.writeText(NEWLINE, component, null); > > > > > } > > > > > writer.endElement("table"); > > > > > > > > > > } > > > > > > > > > > /** > > > > > * {@inheritDoc} > > > > > */ > > > > > protected void renderOption(FacesContext context, > > > > > UIComponent component, > > > > > Converter converter, > > > > > SelectItem curItem, > > > > > Object currentSelections, > > > > > Object[] submittedValues, > > > > > boolean alignVertical, > > > > > int itemNumber, > > > > > OptionComponentInfo optionInfo) throws > > > > > IOException > > > > > { > > > > > > > > > > String valueString =3D getFormattedValue(context, component, > > > > > curItem.getValue(), > > > > > converter); > > > > > > > > > > Object valuesArray; > > > > > Object itemValue; > > > > > if (submittedValues !=3D null) > > > > > { > > > > > valuesArray =3D submittedValues; > > > > > itemValue =3D valueString; > > > > > } > > > > > else > > > > > { > > > > > valuesArray =3D currentSelections; > > > > > itemValue =3D curItem.getValue(); > > > > > } > > > > > > > > > > RequestStateManager.set(context, > > > > > > > > > > RequestStateManager.TARGET_COMPONENT_ATTRIBUTE_NAME, > > > > > component); > > > > > > > > > > boolean isSelected =3D isSelected(context, component, itemValue, > > > > > valuesArray, converter); > > > > > if (optionInfo.isHideNoSelection() && > > > > > curItem.isNoSelectionOption() && > > > > > currentSelections !=3D null && > > > > > !isSelected) > > > > > { > > > > > return; > > > > > } > > > > > > > > > > ResponseWriter writer =3D context.getResponseWriter(); > > > > > assert (writer !=3D null); > > > > > > > > > > if (alignVertical) > > > > > { > > > > > writer.writeText(TAB, component, null); > > > > > writer.startElement(TR, component); > > > > > writer.writeText(NEWLINE, component, null); > > > > > } > > > > > writer.startElement(TD, component); > > > > > writer.writeAttribute(VALIGN, "top", VALIGN); > > > > > writer.writeText(NEWLINE, component, null); > > > > > > > > > > writer.startElement("input", component); > > > > > writer.writeAttribute("name", component.getClientId(context), > > > > > "clientId"); > > > > > String idString =3D component.getClientId(context) + > > > > > UINamingContainer.getSeparatorChar(context) + > > > > > Integer.toString(itemNumber); > > > > > writer.writeAttribute("id", idString, "id"); > > > > > > > > > > writer.writeAttribute("value", valueString, "value"); > > > > > writer.writeAttribute("type", "checkbox", null); > > > > > > > > > > if (isSelected) > > > > > { > > > > > writer.writeAttribute(getSelectedTextString(), > > > Boolean.TRUE, > > > > > null); > > > > > } > > > > > > > > > > // Don't render the disabled attribute twice if the 'parent' > > > > > // component is already marked disabled. > > > > > if (!optionInfo.isDisabled()) > > > > > { > > > > > if (curItem.isDisabled()) > > > > > { > > > > > writer.writeAttribute("disabled", true, "disabled"); > > > > > } > > > > > } > > > > > > > > > > // Apply HTML 4.x attributes specified on UISelectMany > > > component > > > > > to all > > > > > // items in the list except styleClass and style which are > > > > > rendered as > > > > > // attributes of outer most table. > > > > > RenderKitUtils.renderPassThruAttributes(context, > > > > > writer, > > > > > component, > > > > > ATTRIBUTES, > > > > > > > > > > getNonOnClickSelectBehaviors(component)); > > > > > > > > > > RenderKitUtils.renderXHTMLStyleBooleanAttributes(writer, > > > > > component); > > > > > > > > > > RenderKitUtils.renderSelectOnclick(context, component, true); > > > > > > > > > > writer.endElement("input"); > > > > > > > > > > //-------------------------------------------------------- > > > > > // New stuff for event selecting > > > > > //-------------------------------------------------------- > > > > > > > > > > writer.endElement(TD); > > > > > > > > > > // starting the label td > > > > > writer.startElement(TD, component); > > > > > writer.writeAttribute(VALIGN, "top", VALIGN); > > > > > writer.writeAttribute("width", "80px", "width"); > > > > > writer.writeAttribute(STYLE, "padding-top:4px", STYLE); > > > > > > > > > > String itemLabel =3D curItem.getLabel(); > > > > > if (itemLabel =3D=3D null) > > > > > { > > > > > itemLabel =3D valueString; > > > > > } > > > > > > > > > > writer.writeText(" ", component, null); > > > > > writer.startElement(LABEL, component); > > > > > writer.writeAttribute("for", component.getClientId() + ":" + > > > > > itemNumber, "for"); > > > > > if (!curItem.isEscape()) > > > > > { > > > > > // It seems the ResponseWriter API should > > > > > // have a writeText() with a boolean property > > > > > // to determine if it content written should > > > > > // be escaped or not. > > > > > writer.write(itemLabel); > > > > > } > > > > > else > > > > > { > > > > > writer.writeText(itemLabel, component, null); > > > > > } > > > > > writer.endElement(LABEL); > > > > > > > > > > isSelected(context, component, itemValue, valuesArray, > > > > converter); > > > > > // if (isSelected(context, component, itemValue, > > > valuesArray, > > > > > converter)) > > > > > // { > > > > > // // selected > > > > > // } > > > > > // else > > > > > // { > > > > > // // not selected > > > > > // } > > > > > writer.endElement(TD); > > > > > > > > > > // starting the description td > > > > > writer.startElement(TD, component); > > > > > writer.writeAttribute(VALIGN, "top", VALIGN); > > > > > writer.writeAttribute(STYLE, "padding-top:4px", STYLE); > > > > > > > > > > String itemLabelDesc =3D curItem.getDescription(); > > > > > if (itemLabelDesc =3D=3D null) > > > > > { > > > > > itemLabelDesc =3D ""; > > > > > } > > > > > writer.writeText(" ", component, null); > > > > > if (!curItem.isEscape()) > > > > > { > > > > > // It seems the ResponseWriter API should > > > > > // have a writeText() with a boolean property > > > > > // to determine if it content written should > > > > > // be escaped or not. > > > > > writer.write(itemLabelDesc); > > > > > } > > > > > else > > > > > { > > > > > writer.writeText(itemLabelDesc, component, null); > > > > > } > > > > > > > > > > writer.endElement(TD); > > > > > > > > > > //-------------------------------------------------------- > > > > > // New stuff for event selecting end > > > > > //-------------------------------------------------------- > > > > > > > > > > writer.writeText(NEWLINE, component, null); > > > > > if (alignVertical) > > > > > { > > > > > writer.writeText(TAB, component, null); > > > > > writer.endElement(TR); > > > > > writer.writeText(NEWLINE, component, null); > > > > > } > > > > > } > > > > > > > > > > > > > > > // ------------------------------------------------- Package > > > Private > > > > > Methods > > > > > > > > > > /** > > > > > * {@inheritDoc} > > > > > */ > > > > > String getSelectedTextString() > > > > > { > > > > > return "checked"; > > > > > } > > > > > } > > > > > > > > > > > > > > > Any help is appreciated! > > > > > Thanks! > > > > > > > > > > Ren=E9 > > > > > > > > > > > > > > > --089e013a182224200004f2590beb--