Hello,

LOL. Seriously the Jsr301StateManagerImpl is the wrong answer. 99.99999% of the code is shared and only a private inner class contains the change. I'll figure something out.

actually, I was just kidding but nevertheless noone said that the Jsr301StateManagerImpl isn't allowed to inherit from the "plain" StateManagerImpl.

That said, I'm not sure it's the import necessarily. But I'll trace though it to see what I've got. I know that the ExternalContextUtils has the imports on the portlet classes and it loads fine in a servlet only environment. I may have to get at the class using reflection or something to prevent it from preloading.

Although I'm quite sure that the import statement causes this behaviour, you're right, that it's not necessarily true. However, the class definition somehow depends on PortletNamingUIViewRoot _directly_. As I've already mentioned, you just have to introduce an additional indirection to prevent preloading (for example by introducing a Jsr301StateManagerUtils class - just don't use a nested class).

regards,
Bernhard

On 02/20/2008 +0100,
"Scott O'Bryan" <[EMAIL PROTECTED]> wrote:
LOL. Seriously the Jsr301StateManagerImpl is the wrong answer. 99.99999% of the code is shared and only a private inner class contains the change. I'll figure something out.

That said, I'm not sure it's the import necessarily. But I'll trace though it to see what I've got. I know that the ExternalContextUtils has the imports on the portlet classes and it loads fine in a servlet only environment. I may have to get at the class using reflection or something to prevent it from preloading.

Scott

Bernhard Huemer wrote:
Hello,

that's because there's a dependency to PortletNamingContainerUIViewRoot even if you're using this StateManager in a Servlet environment (due to the import). In order to overcome this issue Scott could introduce an additional indirection so that the class Portlet..UIViewRoot will only be loaded if Trinidad is running in the appropriate environment (for example by introducing a Jsr301StateManagerImpl ;-)).

regards,
Bernhard

On 02/20/2008 +0100,
"Matthias Wessendorf" <[EMAIL PROTECTED]> wrote:
Hi Scott,

On Feb 20, 2008 5:26 PM, Scott O'Bryan <[EMAIL PROTECTED]> wrote:
The Apache MVN website says this about providing a "compile only" library:

    "The scope you should use for this is |provided|. This indicates to
    Maven that the dependency will be provided at run time by its
    container or the JDK, for example.

    "Dependencies with this scope will not be passed on transitively,
nor will they be bundled in an package such as a WAR, or included in
    the runtime classpath.

This library is a runtime only library and is only needed when running
in the portlet environment.  Currently Trinidad's demo's aren't portlet
compatible. Until I'm able to do some of this work, I would much rather
this API (and the subsequent impl) not be added to the demo.

I get a "java.lang.NoClassDefFoundError:
javax/portlet/faces/component/PortletNamingContainerUIViewRoot" when
running the demos...
(on 1.2.6.1 branch)
(trinidad-demos in jetty => mvn clean jetty:run -PjettyConfig)

when I change the dependency (as suggested) to compile, after building
Trinidad again, all works fine.

Also, the 301-fix is now here:
-1.0.x trunk
-1.2.6.1 branch

not in 1.2_x trunk

-Matthias

-Matthias

Scott


Matthias Wessendorf wrote:
also...
doesn't this belong to the 12x trunk ?
My understanding is that the JSR 301 is kind of depending on JSF 1.2

-M

On Feb 20, 2008 3:31 PM, Matthias Wessendorf <[EMAIL PROTECTED]> wrote:

Hi,


       <dependency>
+        <groupId>org.apache.myfaces.portlet-bridge</groupId>
+        <artifactId>portlet-bridge-api</artifactId>
+        <version>1.0.0-alpha</version>
+        <scope>provided</scope>
+      </dependency>

I wonder fi is the right scope.
Pretty much all containers don't really ship that JAR.

-M




+
+      <dependency>
         <groupId>org.apache.myfaces.core</groupId>
         <artifactId>myfaces-api</artifactId>
         <version>${myfaces.version}</version>

Modified: myfaces/trinidad/trunk/trinidad-impl/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/pom.xml?rev=629242&r1=629241&r2=629242&view=diff ==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/pom.xml (original)
+++ myfaces/trinidad/trunk/trinidad-impl/pom.xml Tue Feb 19 13:35:43 2008
@@ -206,6 +206,11 @@
     </dependency>

     <dependency>
+      <groupId>org.apache.myfaces.portlet-bridge</groupId>
+      <artifactId>portlet-bridge-api</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.myfaces.trinidad</groupId>
       <artifactId>trinidad-build</artifactId>
     </dependency>

Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/application/StateManagerImpl.java URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/application/StateManagerImpl.java?rev=629242&r1=629241&r2=629242&view=diff ============================================================================== --- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/application/StateManagerImpl.java (original) +++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/application/StateManagerImpl.java Tue Feb 19 13:35:43 2008
@@ -51,6 +51,11 @@

 import java.io.IOException;

+import javax.portlet.faces.annotation.PortletNamingContainer;
+import javax.portlet.faces.component.PortletNamingContainerUIViewRoot;
+
+import org.apache.myfaces.trinidad.util.ExternalContextUtils;
+
 /**
  * StateManager that handles a hybrid client/server strategy:  a
  * SerializedView is stored on the server, and only a small token
@@ -966,6 +971,17 @@
         UIViewRoot newRoot = (UIViewRoot)
fc.getApplication().createComponent(UIViewRoot.COMPONENT_TYPE);

+ //This code handles automatic namespacing in a JSR-301 environment
+        if(ExternalContextUtils.isPortlet(fc.getExternalContext()))
+        {
+ //To avoid introducing a runtime dependency on the bridge, + //this method should only be executed when we have a portlet + //request. If we do have a portlet request then the bridge
+          //should be available anyway.
+          newRoot = _getPortletRoot(newRoot);
+        }
+
+
// must call restoreState so that we setup attributes, listeners,
         // uniqueIds, etc ...
         newRoot.restoreState(fc, viewRootState);
@@ -984,6 +1000,37 @@

       return null;
     }
+
+    /**
+ * This should only be executed if we are currently in a Portlet Request. + * If executed, this method introduces a dependency on the JSR-301 bridge + * which is required for Trinidad to run in a portal environment. If this + * method is not run, then the bridge api's remain optional at runtime.
+     *
+     * This method checks the current UIViewRoot to see if it is a
+ * PortletNamingContainer. If it is, then this class simply returns the + * UIViewRoot. If it does not then the current UIViewRoot is used to create
+     * a new PortletNamingContainerUIViewRoot.
+     */
+    private UIViewRoot _getPortletRoot(UIViewRoot root)
+    {
+      Class<? extends UIViewRoot> rootClass = root.getClass();
+ //If the current root is not the real UIViewRoot object in faces then + //is no need to escape it. It is assumed it handles namespacing on its + //own. This is the same as the logic in the JSR-301 Bridge spec.
+      if(rootClass == UIViewRoot.class)
+      {
+ _LOG.fine("Creating PortletUIViewRoot for use with the portal.");
+        root = new PortletNamingContainerUIViewRoot(root);
+      }
+
+ //TODO: Do we need a warning here if the view root is not annotated + //properly? This could happen if another renderkit is involved and does + //not correctly implement JSR-301. This will NOT be an issue in Trin only
+      //environments.
+      return root;
+    }
+
   }






--
Matthias Wessendorf

further stuff:
blog: http://matthiaswessendorf.wordpress.com/
sessions: http://www.slideshare.net/mwessendorf
mail: matzew-at-apache-dot-org













Reply via email to