[jboss-user] [JBoss Seam] - EnumConverter for multi-select lists

pgmjsd do-not-reply at jboss.com
Thu May 17 06:20:10 EDT 2007


Hi everyone.   I'd like to contribute the following converter.   It allows you to use a multi-select list with enum values.   I just took the existing EnumConverter and added come code to look for the s:selectItems control that has a value which is a list or array of enums.

I put something up on my own wiki about it here:
http://shrubbery.mynetgear.net/wiki/Select_lists_with_Seam#Multi-select_from_an_enum

And here's the code:

  | package eg;
  | 
  | import javax.faces.component.*;
  | import javax.faces.context.*;
  | import javax.faces.convert.*;
  | import javax.faces.el.ValueBinding;
  | import java.util.List;
  | import java.util.Collection;
  | 
  | /**
  |  * Converter for enum multi-selects.
  |  * <br>User: Joshua Davis
  |  * Date: May 16, 2007
  |  * Time: 7:25:58 AM
  |  */
  | public class EnumListConverter implements Converter
  | {
  |     @SuppressWarnings({"unchecked"})
  |     public Object getAsObject(FacesContext context,
  |                               UIComponent comp,
  |                               String value)
  |         throws ConverterException
  |     {
  |         ValueBinding binding = comp.getValueBinding("value");
  |         Class enumType = binding.getType(context);
  |         if (enumType.isEnum())  // Single enum?
  |             return Enum.valueOf(enumType, value);
  |         else    // List of enums.
  |         {
  |             // Find the s:selectItems so we can get the enum.
  |             List children = comp.getChildren();
  |             for (Object child : children)
  |             {
  |                 if (child instanceof UIComponent)
  |                 {
  |                     UIComponent c = (UIComponent) child;
  |                     ValueBinding b = c.getValueBinding("value");
  |                     Class t = b.getType(context);
  |                     // Array of enums: use the component type.
  |                     if (t.isArray() && t.getComponentType().isEnum())
  |                     {
  |                         t = t.getComponentType();
  |                         return Enum.valueOf(t,value);
  |                     }
  |                     else
  |                     {
  |                         Object v = b.getValue(context);
  |                         // Collection of enum values, get the type of the first element.
  |                         if (v instanceof Collection)
  |                         {
  |                             t = ((Collection) v).iterator().next().getClass();
  |                             return Enum.valueOf(t,value);
  |                         }
  |                     }
  |                 }
  |             }
  |             throw new ConverterException("Unable to find selectItems with enum values!");
  |         }
  |     }
  | 
  |     public String getAsString(FacesContext context,
  |                               UIComponent component,
  |                               Object object)
  |         throws ConverterException
  |     {
  |         if (object == null) {
  |             return null;
  |         }
  | 
  |         return ((Enum) object).name();
  |     }
  | 
  | }
  | 

After registering it with facelets, it can be used like this:

  | <h:selectManyCheckbox id="roles" 
  |                       layout="pageDirection" value="#{person.roles}"
  |                       required="true">
  |     <s:selectItems value="#{enumLists.roleArray}" var="role"
  |                    label="#{role}"/>
  |     <s:convertEnum/>
  | </h:selectManyCheckbox>
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4046424#4046424

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4046424



More information about the jboss-user mailing list