1 Reply Latest reply on Feb 14, 2007 5:48 AM by przemjaskier

    Polimorphism problem

      Polimorphism problem

      ** Problem: I cannot customize content of a template, depending on a type of returned hibernate @Entity.

      ** Environment: MyFaces 1.1.4, Facelets 1.1.12, Seam 1.1.6, Hibernate 3.2.1.

      ** Situation:
      I have three Hibernate entities:
      1. Item - annotated with @Inheritance(strategy=InheritanceType.SINGLE_TABLE), @DiscriminatorColumn, @DiscriminatorValue, @Entity
      public void getProperty();
      isExtendedFlagSet(); //returning true only when this is instance of
      //ExtendedItem below (I need such flags in
      //general)
      2. ExtendedItem extends Item - annotated with @DiscriminatorValue, @Entity
      public void getExtendedProperty();
      3. ItemHolder - annotated with @Entity
      Item getItem();

      And an EVENT scope backer:
      currentItemProvider getting ItemHolder proxies/instances from Hibernate.

      And two jsf+facelets templates, which I want to render different in case when ItemHolder.getItem()
      returns instance if ExtendedItem than when it returns instance of Item.

      ** My (not working completely) solution:

      Using custom, render-time-if component, which renders children when "currentItemProvider.itemholder.item.extendedFlagSet" is true,
      enable fragment of page:

      <h:outputText value="#{currentItemProvider.itemholder.item.property}"/>
      <mycomp:renderTimeIf condition="#{currentItemProvider.itemholder.item.extendedFlagSet}">


      <h:outputText value="#{currentItemProvider.itemholder.item.extendedProperty}"/>

      </mycomp:renderTimeIf>

      1. WORKS OK, when placed in a render-time loop of ui:repeat. Different item appear
      on a page rendered according to their isExtendedFlagSet value

      2. But DOESN'T work when put in compile-time ui:decorate or direct in a template. I get:

      SEVERE: Error Rendering View[/itemDetails.xhtml]
      javax.faces.el.PropertyNotFoundException: /WEB-INF/templates/itemtemplate.xhtml @18,132 value="#{currentItemProvider.itemholder.item.extendedProperty}":
      Bean: package.Item$$EnhancerByCGLIB$$b215fa4e, property: extendedProperty
      at com.sun.facelets.el.LegacyValueBinding.getValue(LegacyValueBinding.java:58)
      at javax.faces.component.UIOutput.getValue(UIOutput.java:77)
      at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getStringValue(RendererUtils.java:217)
      at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.renderOutput(HtmlTextRendererBase.java:69)
      at org.apache.myfaces.shared_impl.renderkit.html.HtmlTextRendererBase.encodeEnd(HtmlTextRendererBase.java:57)
      at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)


      ** Question: how to deal with such instance-dependent customization? I have a huge, complex domain (above is only a simplified illustration)
      and would gladly stay with this consistent isFlasSet() approach, but if it should be done in a different way, please suggest.

      Regards,
      Przemek