Uploaded image for project: 'Seam 2'
  1. Seam 2
  2. JBSEAM-2221

Introduce way to retrieve proxy object of a Seam JavaBean Component

    Details

    • Type: Feature Request
    • Status: Open (View Workflow)
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: Core
    • Labels:
      None

      Description

      The EJB programming model requires that a Session Bean never passes a "this"-pointer to other client objects. Instead,
      javax.ejb.SessionContext provides a method getBusinessObject(). If a SessionBean wants to pass a reference pointing to itself to other clients, it first has to retrieve its own EJB object reference by calling SessionContext.getBusinessObject() which it then can pass to other beans. This reference returned by javax.ejb.SessionContext.getBusinessObject() is the equivalent to Java's this pointer.

      With respect to Seam's interceptor framework, such a feature is missing as far as normal JavaBean components are concerned. It leads to subtle programming errors:

      Consider the implementation of org.jboss.seam.framework.Query. getDataModel():
      /**

      • Wrap the result set in a JSF {@link DataModel}

        *

      • Delegates to {@link DataModels#getDataModel(Query)}

        *
        */
        @Transactional
        public DataModel getDataModel()

        Unknown macro: { if (dataModel==null) { dataModel = DataModels.instance().getDataModel(this); } return dataModel; }

      This method method passes a "this"-reference to the org.jboss.seam.faces.dataModels Seam-component.
      But this can lead to a behavior not expected by the programmer. If the (Entity)Query-component gets instantiated as a conversation-scoped component, Seam wraps the ManagedEntityIdentityInterceptor around this Query component.
      After each method invocation intercepted by the ManagedEntityIdentityInterceptor, the ManagedEntityIdentityInterceptor saves wrappers for all contained Entity references in the conversation context and sets the corresponding reference fields in the Query component to null.

      Now, consider again above implementation of Query.getDataModel(). Because a "this" pointer is passed to the dataModels-component, any calls conducted by the datamodel-component via this reference won't be routed through the ManagedEntityIdentity interceptor. Hence, when the datamodel-component calls the Query-component via the Java-this pointer it received previously, the ManagedEntityIdentity won't be invoked and in turn the Entity reference fields in the Query-component won't be restored.

      This leads to a bug as described in JBSEAM-1814. In order to fix that bug, we would have to change the implementation of Query. getDataModel(). Rather than passing the Java-this pointer to the dataModels component, the correct implementation would be as follows. The Query component would first have to retrieve a reference to its own proxy object, which it then could pass to the dataModels component.

      Summary: For JavaBean Seam components we need a feature similar to SessionContext.getBusinessObject(), to enable a JavaBean Seam component to pass a proxy reference to itself to other Seam components instead of passing directly the Java-this pointer.

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  Unassigned
                  Reporter:
                  wschwendt Wolfgang Schwendt
                • Votes:
                  5 Vote for this issue
                  Watchers:
                  3 Start watching this issue

                  Dates

                  • Created:
                    Updated: