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 48DA210B7B for ; Fri, 14 Feb 2014 07:46:05 +0000 (UTC) Received: (qmail 21534 invoked by uid 500); 14 Feb 2014 07:46:03 -0000 Delivered-To: apmail-myfaces-users-archive@myfaces.apache.org Received: (qmail 20716 invoked by uid 500); 14 Feb 2014 07:46:02 -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 19795 invoked by uid 99); 14 Feb 2014 07:45:58 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Feb 2014 07:45:58 +0000 X-ASF-Spam-Status: No, hits=1.0 required=5.0 tests=FREEMAIL_REPLY,RCVD_IN_DNSWL_NONE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of Chummer_Rene@gmx.net designates 212.227.15.15 as permitted sender) Received: from [212.227.15.15] (HELO mout.gmx.net) (212.227.15.15) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Feb 2014 07:45:48 +0000 Received: from [87.149.185.95] by 3capp-gmx-bs16 with HTTP; Fri, 14 Feb 2014 08:45:28 +0100 MIME-Version: 1.0 Message-ID: From: "Rene Perschon" To: "MyFaces Discussion" Subject: Aw: Re: Re: Problems with a custom component when migrating from Glassfish(mojarra) to TomEE Content-Type: multipart/mixed; boundary=refeiks-4d06378e-0ffe-4cef-9fa8-8f6fc425c687 Date: Fri, 14 Feb 2014 08:45:27 +0100 Importance: normal Sensitivity: Normal In-Reply-To: References: , X-UI-Message-Type: mail X-Priority: 3 X-Provags-ID: V03:K0:k4brPG5zm7l0iFQAyY6zUd99215xwyroWu2YJCj+xPd lNU/MBRh5k0BOOSGCSJzr8I7IRyK4mLdAxw3zrM6qxU2Wq6i6O RkRmSIrqeUaYM6sZPsRx11/4RGOsJwPrzp0n+/95WLJs0YmwPw pNYdZ1rtsgf584IKEVrthr6HgmjWfKvJHS7LAB626b+PWZvE/G VmWsBTNyK66iBrbTl/CkG/WkSevsokEamOB2CphYxt55/HMMzx u7jsn08q37aVNBSsuw4UGR8qpZrKTwkWbVONuZ7aUUIYZeFQpj D2wD1c= X-Virus-Checked: Checked by ClamAV on apache.org --refeiks-4d06378e-0ffe-4cef-9fa8-8f6fc425c687 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Yes, here it is. It's a two-stage component which displays a hierarchical (= 2 levels) selection choice. =C2=A0 =C2=A0 Gesendet:=C2=A0Donnerstag, 13. Februar 2014 um 16:57 Uhr Von:=C2=A0"Howard W. Smith, Jr." An:=C2=A0"MyFaces Discussion" Betreff:=C2=A0Re: 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 wrot= e: > 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=C3=A9n" > 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 managed > > beans at same time). Thomas, Romain, Mark Struberg, and others provide= d > > great help and motivation. Apache tomee, MyFaces, tomcat user mail lis= ts > > 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 and > > Leonardo motivated me to start the migration after reading about the > > performance comparison between Mojarra and MyFaces. Mark Struberg blog= , > 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 n= ot > in > > > the API packages. So you have to rebuild all this functionality with= out > > > 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 Tom= EE. > > Now > > > > the problem is that this application contains a custom component > which > > > was > > > > unfortunately coded with hard dependencies on com.sun.faces classe= s > > > (maven > > > > dependency jsf-impl). > > > > > > > > Now my question is how can i port this component in such a way tha= t > 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=C3=A9 > > > > > > > > > > --refeiks-4d06378e-0ffe-4cef-9fa8-8f6fc425c687--