0 Replies Latest reply on May 26, 2007 6:27 AM by Tony Herstell

    Enum Internationalised

    Tony Herstell Master

      This is probably obvious to all of you, but taken me days to get this working (and still not sure how!).

      Inside an Entity I have an internationalised enum (as I am hoping to persist a value of its kind with the Entity):

      @SuppressWarnings("serial")
      @Entity // Defines this as an Entity that is a class mapped toDate the Datastore.
      @Name("booking") // Name used within SEAM for an instance of this class.
      public class Booking implements Serializable {
      
       public enum OrganisationKind {
       PRIVATE_BOOKING ("booking_private"),
       PRIVATE_BOOKING_OPEN ("booking_private_open"),
       NON_PROFIT_ORG ("booking_non_profit_org"),
       COMMERCIAL ("booking_commercial_org"),
       OPEN_EVENT ("booking_open_event"); // Only booked by Selwyn Equestrian Staff
       private final String inlLabel;
       OrganisationKind(String inlLabel) {
       this.inlLabel = inlLabel;
       }
       public String getInlLabel() { return inlLabel; }
       }
      
      ...
       private OrganisationKind organisationKind;
      ...
      



      I have a controller that requires this enum to be displayed as selectOneRadio... these routines handle the selection:
       public Map getOrganisationKindList();
      
       public Booking.OrganisationKind getSelectedOrganisationKind();
      
       public void setSelectedOrganisationKind(Booking.OrganisationKind orgKind); not use I need this one as the Change fires ok
      
       public void selectedOrganisationKindChanged(ValueChangeEvent event);
      


      The Impl:
      ...
       /**
       * The currently selected Booking Type
       */
       private Booking.OrganisationKind selectedOrganisationKind;
      
      ...
      
       public Map getOrganisationKindList() {
       Map<String,Booking.OrganisationKind> choices = new HashMap<String,Booking.OrganisationKind>();
       for (Booking.OrganisationKind type : Booking.OrganisationKind.values()) {
       choices.put(messages.get(type.getInlLabel()), type);
       }
       return choices;
       }
      
       public Booking.OrganisationKind getSelectedOrganisationKind() {
       return selectedOrganisationKind;
       }
      
       public void setSelectedOrganisationKind(Booking.OrganisationKind orgKind) {
       this.selectedOrganisationKind = orgKind;
       }
      
       public void selectedOrganisationKindChanged(ValueChangeEvent event) {
       if (event.getNewValue() != null) {
       Booking.OrganisationKind theOrganisationKind = Booking.OrganisationKind.valueOf(event.getNewValue().toString());
       selectedOrganisationKind = theOrganisationKind;
       } else {
       log.error("null new event passed in. Error!");
       }
       }
      
      



      The screen shows all this using:
      <ice:panelGrid columns="1" styleClass="center">
       <ice:selectOneRadio
       value="#{availabilityController.selectedOrganisationKind}"
       valueChangeListener="#{availabilityController.selectedOrganisationKindChanged}"
       partialSubmit="true"
       layout="pageDirection"
       converter="#{enumTypeConverter}">
       <f:selectItems value="#{availabilityController.organisationKindList}"/>
       </ice:selectOneRadio>
      </ice:panelGrid>
      



      Now... I have to provide a Converter (no idea if this is right.. and the screen seems to find this without outjecting it to the view at all!!):
      @Intercept(InterceptionType.NEVER)
      @SuppressWarnings("serial")
      @Stateless // A new component is created or re-initialised and re-used each time it is called.
      @Name("enumTypeConverter") // Name used within SEAM for an instance of this class.
      // All stateless session beans belong to the Stateless Context Scope
      public class EnumTypeConverterImpl implements EnumTypeConverter {
      
       @SuppressWarnings("unchecked")
       public Object getAsObject(FacesContext context, UIComponent comp, String value) throws ConverterException {
       Class enumType = comp.getValueBinding("value").getType(context);
       return Enum.valueOf(enumType, value);
       }
      
       public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {
       if (object == null) {
       return null;
       }
       Enum type = (Enum) object;
       return type.toString();
       }
      
      }
      


      Anyhow, it may help some poor sap in the future!

      FINALLY GOT TO USE INTERNATIONALISED ENUMS!!!


      From the screen:
      O open booking (Selwyn Equestrian Centre staff only)
      O commercial booking (e.g. NZ Elite Horse Auctions Ltd.)
      O private booking but open to anyone (cost is per horse - max of 4 places)
      O non profit booking (Dressage Canterbury etc.)
      O private booking (cost is for Arena) <<---Selected
      
      
      Result (on screen and in controller) = PRIVATE_BOOKING
      


      :)