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." <smithh032...@gmail.com>
An: "MyFaces Discussion" <users@myfaces.apache.org>
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 <chummer_r...@gmx.net> 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én" <karl.kil...@gmail.com>
> An: "MyFaces Discussion" <users@myfaces.apache.org>
> 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. <smithh032...@gmail.com
> >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 provided
> > 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 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.tho...@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 <chummer_r...@gmx.net>:
> > >
> > > > 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 classes
> > > (maven
> > > > dependency jsf-impl).
> > > >
> > > > Now my question is how can i port this component in such a way that
> 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 =
> > > >
> > AttributeManager.getAttributes(AttributeManager.Key.SELECTMANYCHECKBOX);
> > > > /** Representing the border string. */
> > > > private static final String BORDER = "border";
> > > > /** Representing the tr string. */
> > > > private static final String TR = "tr";
> > > > /** Representing the td string. */
> > > > private static final String TD = "td";
> > > > /** Representing the label string. */
> > > > private static final String LABEL = "label";
> > > > /** Representing the newline string. */
> > > > private static final String NEWLINE = "\n";
> > > > /** Representing the tab string. */
> > > > private static final String TAB = "\t";
> > > > /** Representing the class string. */
> > > > private static final String CLASS = "class";
> > > > /** Representing the style string. */
> > > > private static final String STYLE = "style";
> > > > /** Representing the valign string. */
> > > > private static final String VALIGN = "valign";
> > > >
> > > >
> > > > // ----------------------------------------------------------
> > Public
> > > > Methods
> > > >
> > > >
> > > > @Override
> > > > public void encodeEnd(FacesContext context, UIComponent component)
> > > > throws IOException
> > > > {
> > > >
> > > > rendererParamsNotNull(context, component);
> > > >
> > > > if (!shouldEncode(component))
> > > > {
> > > > return;
> > > > }
> > > >
> > > > ResponseWriter writer = context.getResponseWriter();
> > > > assert (writer != null);
> > > >
> > > > String alignStr;
> > > > Object borderObj;
> > > > boolean alignVertical = false;
> > > > int border = 0;
> > > >
> > > >
> > > >
> > > > if (null != component.getAttributes().get("layout"))
> > > > {
> > > > alignStr = (String)
> > component.getAttributes().get("layout");
> > > > alignVertical = alignStr.equalsIgnoreCase("pageDirection");
> > > > }
> > > >
> > > > if (null != component.getAttributes().get(BORDER))
> > > > {
> > > > borderObj = component.getAttributes().get(BORDER);
> > > > border = (Integer) borderObj;
> > > > }
> > > >
> > > > Converter converter = null;
> > > > if (component instanceof ValueHolder)
> > > > {
> > > > converter = ((ValueHolder)component).getConverter();
> > > > }
> > > >
> > > > renderBeginText(component, border, alignVertical, context,
> > true);
> > > >
> > > > Iterator<SelectItem> items =
> > > > RenderKitUtils.getSelectItems(context, component);
> > > >
> > > > Object currentSelections = getCurrentSelectedValues(component);
> > > > Object[] submittedValues =
> > getSubmittedSelectedValues(component);
> > > > Map<String, Object> attributes = component.getAttributes();
> > > > OptionComponentInfo optionInfo =
> > > > 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 = -1;
> > > > while (items.hasNext())
> > > > {
> > > > SelectItem curItem = 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() != 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 =
> > > > ((SelectItemGroup) curItem).getSelectItems();
> > > > for (int i = 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 == null)
> > > > {
> > > > return false;
> > > > }
> > > > char sepChar = UINamingContainer.getSeparatorChar(ctx);
> > > > String actualBehaviorId =
> > > > 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 = context.getResponseWriter();
> > > > assert (writer != null);
> > > >
> > > > writer.startElement("table", component);
> > > > if (border != 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 = (String) component.getAttributes().get(
> > > > "styleClass");
> > > > String style = (String)
> > component.getAttributes().get(STYLE);
> > > > if (styleClass != null)
> > > > {
> > > > writer.writeAttribute(CLASS, styleClass, CLASS);
> > > > }
> > > > if (style != 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 = context.getResponseWriter();
> > > > assert (writer != 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 = getFormattedValue(context, component,
> > > > curItem.getValue(),
> > > > converter);
> > > >
> > > > Object valuesArray;
> > > > Object itemValue;
> > > > if (submittedValues != null)
> > > > {
> > > > valuesArray = submittedValues;
> > > > itemValue = valueString;
> > > > }
> > > > else
> > > > {
> > > > valuesArray = currentSelections;
> > > > itemValue = curItem.getValue();
> > > > }
> > > >
> > > > RequestStateManager.set(context,
> > > >
> > > > RequestStateManager.TARGET_COMPONENT_ATTRIBUTE_NAME,
> > > > component);
> > > >
> > > > boolean isSelected = isSelected(context, component, itemValue,
> > > > valuesArray, converter);
> > > > if (optionInfo.isHideNoSelection() &&
> > > > curItem.isNoSelectionOption() &&
> > > > currentSelections != null &&
> > > > !isSelected)
> > > > {
> > > > return;
> > > > }
> > > >
> > > > ResponseWriter writer = context.getResponseWriter();
> > > > assert (writer != 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 = 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 = curItem.getLabel();
> > > > if (itemLabel == null)
> > > > {
> > > > itemLabel = 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 = curItem.getDescription();
> > > > if (itemLabelDesc == null)
> > > > {
> > > > itemLabelDesc = "";
> > > > }
> > > > 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é
> > > >
> > >
> >
>

Reply via email to