You are viewing a plain text version of this content. The canonical link for it is here.
Posted to wsrp4j-dev@portals.apache.org by dl...@apache.org on 2006/12/10 22:09:46 UTC

svn commit: r485259 - in /portals/wsrp4j/trunk/consumer-proxyportlet: ./ src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ src/java/org/apache/wsrp4j/consumer/proxyportlet/template/ src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspee...

Author: dlouzan
Date: Sun Dec 10 13:09:44 2006
New Revision: 485259

URL: http://svn.apache.org/viewvc?view=rev&rev=485259
Log:
- Added support for producer template processing using a plugin system. Currently working plugin for PlutoPortal

Added:
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposer.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerService.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerServiceFactory.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposer.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposerService.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalControlParameter.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposer.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposerService.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalURL.java
Modified:
    portals/wsrp4j/trunk/consumer-proxyportlet/pom.xml
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ProxyPortlet.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/URLTemplateComposerImpl.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/util/Constants.java
    portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/log4j.properties
    portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/wsrp4j-config.properties

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/pom.xml
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/pom.xml?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/pom.xml (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/pom.xml Sun Dec 10 13:09:44 2006
@@ -38,6 +38,10 @@
                 <include>Messages.properties</include>
             </includes>
         </resource>
+        <resource>
+            <directory>src/webapp/WEB-INF/classes</directory>
+            <filtering>true</filtering>
+        </resource>
     </resources>
     <plugins>
       <plugin>
@@ -91,6 +95,12 @@
         <artifactId>commons-beanutils</artifactId>
         <groupId>commons-beanutils</groupId>
         <version>${commons-beanutils.version}</version>
+    </dependency>
+    <dependency>
+        <artifactId>pluto</artifactId>
+        <groupId>org.apache.pluto</groupId>
+        <version>${pluto.version}</version>
+        <scope>provided</scope>
     </dependency>
   </dependencies>
 </project>

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ProxyPortlet.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ProxyPortlet.java?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ProxyPortlet.java (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/ProxyPortlet.java Sun Dec 10 13:09:44 2006
@@ -79,8 +79,8 @@
 import org.apache.wsrp4j.commons.consumer.interfaces.portlet.PortletKey;
 import org.apache.wsrp4j.commons.consumer.interfaces.portlet.WSRPPortlet;
 import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.URLGenerator;
-import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.
-        URLTemplateComposer;
+import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.URLRewriter;
+import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.URLTemplateComposer;
 
 import org.apache.wsrp4j.commons.consumer.driver.portlet.PortletKeyImpl;
 import org.apache.wsrp4j.commons.consumer.driver.user.UserImpl;
@@ -429,13 +429,22 @@
                 URLGenerator urlGenerator = 
                         URLGeneratorImpl.getInstance(renderResponse, 
                         getPortletConfig());
+                
                 URLTemplateComposer templateComposer = 
                         consumerEnv.getTemplateComposer();
                 if(templateComposer != null) {
                     templateComposer.setURLGenerator(urlGenerator);
+                    /* For testing, hardcode the subclass */
+                    if (templateComposer instanceof URLTemplateComposerImpl) {
+                        ((URLTemplateComposerImpl) templateComposer).setCurrentRequest(request);
+                        ((URLTemplateComposerImpl) templateComposer).setCurrentResponse(renderResponse);
+                    }
+                }
+                URLRewriter urlRewriter =
+                        consumerEnv.getURLRewriter();
+                if (urlRewriter != null) {
+                    urlRewriter.setURLGenerator(urlGenerator);
                 }
-                
-                consumerEnv.getURLRewriter().setURLGenerator(urlGenerator);
             }
             
             // do a getMarkup call and check the response

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/URLTemplateComposerImpl.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/URLTemplateComposerImpl.java?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/URLTemplateComposerImpl.java (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/impl/URLTemplateComposerImpl.java Sun Dec 10 13:09:44 2006
@@ -15,8 +15,15 @@
  */
 package org.apache.wsrp4j.consumer.proxyportlet.impl;
 
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+
 import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.URLGenerator;
 import org.apache.wsrp4j.commons.consumer.interfaces.urlgenerator.URLTemplateComposer;
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposer;
+
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposerService;
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposerServiceFactory;
 
 /**
  * <p>
@@ -38,6 +45,10 @@
     private static URLTemplateComposer instance;
 
     private URLGenerator urlGenerator;
+    private PortalTemplateComposerService composerService;
+    
+    private PortletRequest currentRequest;
+    private PortletResponse currentResponse;
 
     public static URLTemplateComposer getInstance() {
         if (instance == null) {
@@ -48,6 +59,15 @@
     }
 
     private URLTemplateComposerImpl() {
+        composerService = PortalTemplateComposerServiceFactory.getService();
+    }
+    
+    public void setCurrentRequest(PortletRequest request) {
+        currentRequest = request;
+    }
+    
+    public void setCurrentResponse(PortletResponse response) {
+        currentResponse = response;
     }
 
     /**
@@ -62,10 +82,16 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getBlockingActionTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createSecureBlockingActionTemplate(boolean includePortletHandle,
@@ -73,26 +99,32 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-        /*
-         * 
-         * if (this.urlGenerator != null) { template = createTemplate(
-         * urlGenerator.getBlockingActionURL(null), false, true, true, true,
-         * true, true, false, false, includePortletHandle,
-         * includeUserContextKey, includePortletInstanceKey, includeSessionID); }
-         */
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getSecureBlockingActionTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createRenderTemplate(boolean includePortletHandle, boolean includeUserContextKey,
             boolean includePortletInstanceKey, boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getRenderTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createSecureRenderTemplate(boolean includePortletHandle,
@@ -100,9 +132,14 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getSecureRenderTemplate();
+        }
+        
         return template;
     }
 
@@ -111,10 +148,16 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getResourceTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createSecureResourceTemplate(boolean includePortletHandle,
@@ -122,21 +165,33 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getSecureResourceTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createDefaultTemplate(boolean includePortletHandle,
             boolean includeUserContextKey, boolean includePortletInstanceKey,
             boolean includeSessionID) {
-
+        
         String template = null;
 
-        // TODO: Template processing Pluto case
-
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getDefaultTemplate();
+        }
+        
         return template;
+        
     }
 
     public String createSecureDefaultTemplate(boolean includePortletHandle,
@@ -144,10 +199,16 @@
             boolean includeSessionID) {
 
         String template = null;
-
-        // TODO: Template processing Pluto case
-
+        
+        if (composerService != null) {
+            PortalTemplateComposer templateComposer =
+                    composerService.getPortalTemplateComposer(
+                    currentRequest, currentResponse);
+            template = templateComposer.getSecureDefaultTemplate();
+        }
+        
         return template;
+        
     }
 
     public String getNamespacePrefix() {

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposer.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposer.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposer.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposer.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template;
+
+
+public interface PortalTemplateComposer {
+    
+    public String getBlockingActionTemplate();
+    public String getSecureBlockingActionTemplate();
+    public String getRenderTemplate();
+    public String getSecureRenderTemplate();
+    public String getResourceTemplate();
+    public String getSecureResourceTemplate();
+    public String getDefaultTemplate();
+    public String getSecureDefaultTemplate();
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerService.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerService.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerService.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerService.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template;
+
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+
+
+public interface PortalTemplateComposerService {
+    
+    public PortalTemplateComposer getPortalTemplateComposer(
+            PortletRequest request, PortletResponse response);
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerServiceFactory.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerServiceFactory.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerServiceFactory.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/PortalTemplateComposerServiceFactory.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.wsrp4j.commons.util.configuration.ConfigurationParametersManager;
+import org.apache.wsrp4j.commons.util.configuration.MissingConfigurationParameterException;
+
+import org.apache.wsrp4j.consumer.proxyportlet.util.Constants;
+
+
+public class PortalTemplateComposerServiceFactory {
+    
+    private static final Log log = LogFactory.getLog(
+            PortalTemplateComposerServiceFactory.class);
+    
+    private static PortalTemplateComposerService _service;
+    
+    static {
+        _service = null;
+        try {
+            String className = ConfigurationParametersManager.getParameter(
+                    Constants.PROXYPORTLET_PORTAL_TEMPLATE_COMPOSER);
+            Class theClass = Class.forName(className);
+            _service = (PortalTemplateComposerService) theClass.newInstance();
+        } catch (MissingConfigurationParameterException e) {
+            log.fatal("PortalTemplateComposer class configuration parameter" +
+                    " not found", e);
+        } catch (ClassNotFoundException e) {
+            log.fatal("PortalTemplateComposer class configuration parameter" +
+                    " not found on classpath", e);
+        } catch (InstantiationException e) {
+            log.fatal("Error while instantiating service", e);
+        } catch (IllegalAccessException e) {
+            log.fatal("Error while instantiating service", e);
+        }
+    }
+    
+    public static PortalTemplateComposerService getService() {
+        return _service;
+    }
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposer.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposer.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposer.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposer.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.jetspeed;
+
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposer;
+
+
+public class JetspeedPortalTemplateComposer implements PortalTemplateComposer {
+    
+    private PortletRequest request;
+    private PortletResponse response;
+    
+    public JetspeedPortalTemplateComposer(PortletRequest request, 
+            PortletResponse response) {
+        this.request = request;
+        this.response = response;
+    }
+    
+    public String getBlockingActionTemplate() {
+        return null;
+    }
+    
+    public String getSecureBlockingActionTemplate() {
+        return null;
+    }
+    
+    public String getRenderTemplate() {
+        return null;
+    }
+    
+    public String getSecureRenderTemplate() {
+        return null;
+    }
+    
+    public String getResourceTemplate() {
+        return null;
+    }
+    
+    public String getSecureResourceTemplate() {
+        return null;
+    }
+    
+    public String getDefaultTemplate() {
+        return null;
+    }
+    
+    public String getSecureDefaultTemplate() {
+        return null;
+    }
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposerService.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposerService.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposerService.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/jetspeed/JetspeedPortalTemplateComposerService.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.jetspeed;
+
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposer;
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposerService;
+
+
+public class JetspeedPortalTemplateComposerService 
+        implements PortalTemplateComposerService {
+    
+    public JetspeedPortalTemplateComposerService() {}
+    
+    public PortalTemplateComposer getPortalTemplateComposer(
+            PortletRequest request, PortletResponse response) {
+        return new JetspeedPortalTemplateComposer(request, response);
+    }
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalControlParameter.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalControlParameter.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalControlParameter.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalControlParameter.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,429 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.pluto;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.portlet.PortletMode;
+import javax.portlet.WindowState;
+
+import org.apache.pluto.om.window.PortletWindow;
+import org.apache.pluto.util.StringUtils;
+
+public class PlutoPortalControlParameter {
+
+    static public final String ACTION = "ac";
+    static public final String MODE = "md";
+    static public final String PORTLET_ID = "pid";
+    static public final String PREFIX = "_";
+    static public final String PREV_MODE = "pm";
+    static public final String PREV_STATE = "ps";
+    static public final String RENDER_PARAM = "rp";
+    static public final String STATE = "st";
+
+    private Map requestParameter = new HashMap();
+
+    /**
+     * The map containing the encoded statefull control parameters.
+     * They are encoded in the sense, that names and values of 
+     * <i>render parameters</i> and render parameters only are encoded
+     * using {{@link #encodeRenderParamName(PortletWindow, String)}}
+     * and {{@link #encodeRenderParamValues(String[])}}.
+     */
+    private Map encodedStateFullControlParameter;
+    
+    private Map stateLessControlParameter;
+    private PlutoPortalURL url;
+
+    
+    public PlutoPortalControlParameter(PlutoPortalURL url) {
+        this.url = url;
+        encodedStateFullControlParameter = this.url.getClonedEncodedStateFullControlParameter();
+        stateLessControlParameter = this.url.getClonedStateLessControlParameter();
+    }
+
+    
+    /**
+     * Encodes the given String. Encoding means that all characters that might
+     * interfere with the algorithm used to prefix parameters to associate them
+     * with the correct portal window will be encoded. The reverse method is
+     * {{@link #decodeString(String)}}.  
+     * @param value The String to be encoded.
+     * @return The encoded String.
+     * @see #decodeParameterName(String)
+     */
+    private static String encodeString(String value) {
+    	value = StringUtils.replace(value, "0x", "0xx");
+        value = StringUtils.replace(value, "_", "0x1" );
+        value = StringUtils.replace(value, ".", "0x2" );
+        value = StringUtils.replace(value, "/", "0x3" );
+        value = StringUtils.replace(value, "\r", "0x4" );
+        value = StringUtils.replace(value, "\n", "0x5" );
+        value = StringUtils.replace(value, "<", "0x6" );
+        value = StringUtils.replace(value, ">", "0x7" );
+        value = StringUtils.replace(value, " ", "0x8" );
+        return value;
+    }
+
+    /**
+     * Decodes the given String. This is the reverse method to
+     * {{@link #encodeString(String)}}.
+     * @param value The string to be decoded.
+     * @return The decoded String.
+     */
+    private static String decodeString(String value) {
+        value = StringUtils.replace(value, "0x1", "_" );
+        value = StringUtils.replace(value, "0x2", "." );
+        value = StringUtils.replace(value, "0x3", "/" );
+        value = StringUtils.replace(value, "0x4", "\r" );
+        value = StringUtils.replace(value, "0x5", "\n" );
+        value = StringUtils.replace(value, "0x6", "<" );
+        value = StringUtils.replace(value, "0x7", ">" );
+        value = StringUtils.replace(value, "0x8", " " );
+        value = StringUtils.replace(value, "0xx", "0x");
+        return value;
+    }
+    
+    /**
+     * Each parameter is encoded by prefixing it with the String
+     * {@link #PREFIX}. The reverse method is {{@link #decodeParameterName(String)}}.
+     * Don't mistake this method for {{@link #encodeRenderParamName(PortletWindow, String)}}
+     * or {{@link #encodeRenderParamValues(String[])}}.
+     * @param param The parameter to be encoded / prefixed.
+     * @return The encoded parameter.
+     */
+    public static String encodeParameterName(String param) {
+        return PREFIX + param;
+    }
+
+    /**
+     * Decodes a parameter by deleting the prefix, if the parameter
+     * was prefixed. Reverse method to {{@link #encodeParameterName(String)}}.
+     * Don't mistake this method for {{@link #decodeRenderParameterName(String)}}
+     * or {{@link #decodeRenderParamValues(String)}}.
+     * @param param The parameter to be decoded.
+     * @return The decoded parameter.
+     */
+    public static String decodeParameterName(String param) {
+    	if (param.startsWith(PREFIX)) {
+    		return param.substring(PREFIX.length());
+    	} else {
+    		return param;
+    	}
+    }
+    
+    /**
+     * Dummy method. Does nothing!
+     */
+    public static String decodeParameterValue(String paramName, String paramValue) {
+        return paramValue;
+    }
+
+    /**
+     * Encodes the given render parameter name. The name will be encoded using the
+     * {{@link #encodeValue(String)}} method, meaning that characters that will 
+     * interfere with plutos internal url encoding and decoding
+     * mechanisms, like "/" or "_" will be encoded. The parameter name will then
+     * be prefixed with a string that encodes the portlet window the parameter belongs to.
+     * This prefix contains the characters ("/", "_", ...) that had to be encoded in
+     * the parameter name to later allow for a safe parsing of the prefix.
+     * @return A string encoding the given render parameter name to be used in portal urls.
+     */
+    public static String encodeRenderParamName(PortletWindow window, String paramName) {
+    	String encodedParamName = encodeString(paramName);
+        StringBuffer returnvalue = new StringBuffer(50);
+        returnvalue.append(getRenderParamKey(window));
+        returnvalue.append("_");
+        returnvalue.append(encodedParamName);
+        return returnvalue.toString();
+    }
+
+    /**
+     * Reverse method for method {{@link #encodeRenderParamName(PortletWindow, String)}}.
+     */
+    public static String decodeRenderParamName(PortletWindow window, String encodedRenderParamName) {
+    	String prefix = getRenderParamKey(window);
+    	String unprefixedRenderParamName = null;
+    	if (encodedRenderParamName.startsWith(prefix)) {
+    		unprefixedRenderParamName = encodedRenderParamName.substring(prefix.length());
+    	} else {
+    		unprefixedRenderParamName = encodedRenderParamName;
+    	}
+    	return decodeString(unprefixedRenderParamName);
+    }
+    
+    /**
+     * Encodes the given render parameter values. The values are encoded
+     * in one single string that will be used in portal urls. 
+     * @param paramValues The render parameter values to be encoded.
+     * @return A string containing the encoded render parameter values.
+     */
+    public static String encodeRenderParamValues(String[] paramValues)
+    {
+        StringBuffer returnvalue = new StringBuffer(100);
+        returnvalue.append(paramValues.length);
+        for (int i=0; i<paramValues.length; i++) {
+            returnvalue.append("_");
+            if(paramValues[i]!=null) {
+                returnvalue.append(encodeString(paramValues[i]));
+            }
+        }
+        return returnvalue.toString();
+    }
+
+    /**
+     * Reverse method for the method {{@link #encodeRenderParamValues(String[])}}.
+     */
+    private static String[] decodeRenderParamValues(String encodedParamValues) {
+        StringTokenizer tokenizer = new StringTokenizer(encodedParamValues, "_");
+        if (!tokenizer.hasMoreTokens()) {
+        	return null;
+        }
+        String _count = tokenizer.nextToken();
+        int count = Integer.valueOf(_count).intValue();
+        String[] values = new String[count];
+        for (int i = 0; i < count; i++) {
+            if (!tokenizer.hasMoreTokens()) {
+            	return null;
+            }
+            values[i] = decodeString(tokenizer.nextToken());
+        }
+        return values;
+    }
+
+    /**
+     * Retrieve the key to use to prefix render parameters of the given
+     * portlet window.
+     * @param window
+     * @return
+     */
+    public static String getRenderParamKey(PortletWindow window) {
+        return RENDER_PARAM + "_" + window.getId().toString();
+    }
+
+    /**
+     * Check whether the given string encodes a control parameter.
+     */
+    public static boolean isControlParameter(String param) {
+        return param.startsWith(PREFIX);
+    }
+
+    /**
+     * Check whether the given string encodes a stateful parameter,
+     * i.e. mode, previous mode, window state, previous window state or 
+     * render parameter.
+     */
+    public static boolean isStateFullParameter(String param) {
+        if (isControlParameter(param)) {
+            if ((param.startsWith(PREFIX + MODE)) ||
+                (param.startsWith(PREFIX + PREV_MODE)) ||
+                (param.startsWith(PREFIX + STATE)) ||
+                (param.startsWith(PREFIX + PREV_STATE)) ||
+                (param.startsWith(PREFIX + RENDER_PARAM))) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    /**
+     * Deletes all render parameter that belong to the given window.
+     */
+    public void clearRenderParameters(PortletWindow portletWindow) {
+        String prefix = getRenderParamKey(portletWindow);
+        Iterator keyIterator = encodedStateFullControlParameter.keySet().iterator();
+        while (keyIterator.hasNext()) {
+            String encodedName = (String)keyIterator.next();
+            if (encodedName.startsWith(prefix)) {
+                keyIterator.remove();
+            }
+        }
+    }
+
+    private String getActionKey(PortletWindow window)
+    {
+        return ACTION+"_"+window.getId().toString();
+    }
+
+    public String[] getActionParameter(PortletWindow window, String paramName) {
+        String encodedValues = (String)encodedStateFullControlParameter.get(encodeRenderParamName(window, paramName));
+        String[] decodedValues = decodeRenderParamValues(encodedValues);
+        return decodedValues;
+    }
+
+    public PortletMode getMode(PortletWindow window) {
+        String mode = (String)encodedStateFullControlParameter.get(getModeKey(window));
+        if (mode != null) {
+            return new PortletMode(mode);
+        } else {
+            return PortletMode.VIEW;
+        }
+    }
+
+    private String getModeKey(PortletWindow window) {
+        return MODE + "_" + window.getId().toString();
+    }
+
+    public String getPIDValue() {
+        String value = (String)stateLessControlParameter.get(getPortletIdKey());
+        return value == null ? "" : value;
+    }
+
+    private String getPortletIdKey() {
+        return PORTLET_ID;
+    }
+
+    public PortletMode getPrevMode(PortletWindow window) {
+        String mode = (String)encodedStateFullControlParameter.get(getPrevModeKey(window));
+        if (mode != null) {
+            return new PortletMode(mode);
+        } else {
+            return null;
+        }
+    }
+    
+    private String getPrevModeKey(PortletWindow window) {
+        return PREV_MODE + "_" + window.getId().toString();
+    }
+
+    public WindowState getPrevState(PortletWindow window) {
+        String state = (String)encodedStateFullControlParameter.get(getPrevStateKey(window));
+        if (state!=null)
+            return new WindowState(state);
+        else
+            return null;
+    }
+    
+    private String getPrevStateKey(PortletWindow window) {
+        return PREV_STATE + "_" + window.getId().toString();
+    }
+
+    public Iterator getRenderParamNames(PortletWindow window) {
+        ArrayList returnvalue = new ArrayList();
+        String prefix = getRenderParamKey(window);
+        Iterator keyIterator = encodedStateFullControlParameter.keySet().iterator();
+        while (keyIterator.hasNext()) {
+            String encodedName = (String)keyIterator.next();
+            if (encodedName.startsWith(prefix)) {
+            	// remove specific render parameter name encoding
+            	String decodedName = decodeRenderParamName(window, encodedName);
+            	// remove general parameter encoding
+            	String unprefixedName = decodeParameterName(decodedName);
+            	returnvalue.add(unprefixedName);
+            }
+        }
+        return returnvalue.iterator();
+    }
+
+    public String[] getRenderParamValues(PortletWindow window, String paramName) {
+        String encodedValues = (String)encodedStateFullControlParameter.get(encodeRenderParamName(window, paramName));
+        String[] decodedValues = decodeRenderParamValues(encodedValues);
+        return decodedValues;
+    }
+
+    public Map getRequestParameter() {
+        return requestParameter;
+    }
+
+    public WindowState getState(PortletWindow window) {
+        String state = (String)encodedStateFullControlParameter.get(getStateKey(window));
+        if (state != null) {
+            return new WindowState(state);
+        } else {
+            return WindowState.NORMAL;
+        }
+    }
+
+    public Map getEncodedStateFullControlParameter() {
+        return encodedStateFullControlParameter;
+    }
+
+    private String getStateKey(PortletWindow window) {
+        return STATE + "_" + window.getId().toString();
+    }
+
+    public Map getStateLessControlParameter() {
+        return stateLessControlParameter;
+    }
+    
+    public boolean isPortletModeParameter(PortletWindow portletWindow, 
+            String name) {
+        return name.equals(getModeKey(portletWindow));
+    }
+    
+    public boolean isWindowStateParameter(PortletWindow portletWindow, 
+            String name) {
+        return name.equals(getStateKey(portletWindow));
+    }
+
+    public boolean isOnePortletWindowMaximized() {
+        Iterator iterator = encodedStateFullControlParameter.keySet().iterator();
+        while (iterator.hasNext()) {
+            String encodedName = (String)iterator.next();
+            if (encodedName.startsWith(STATE)) {
+                if (encodedStateFullControlParameter.get(encodedName).equals(WindowState.MAXIMIZED.toString())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public void setAction(PortletWindow window) {
+        getEncodedStateFullControlParameter().put(getActionKey(window),ACTION.toUpperCase());
+    }
+
+    public void setMode(PortletWindow window, String mode) {
+        Object prevMode = encodedStateFullControlParameter.get(getModeKey(window));
+        if (prevMode!=null)
+            encodedStateFullControlParameter.put(getPrevModeKey(window), prevMode);
+        // set current mode
+        encodedStateFullControlParameter.put(getModeKey(window), mode);
+    }
+
+    public void setPortletId(PortletWindow window) {
+        getEncodedStateFullControlParameter().put(getPortletIdKey(),window.getId().toString());
+        //getStateLessControlParameter().put(getPortletIdKey(),window.getId().toString());
+    }
+
+    /**
+     * Sets the given render parameter. Note that its name as well as its values will
+     * be encoded for storage using {{@link #encodeRenderParamName(PortletWindow, String)}}
+     * and {{@link #encodeRenderParamValues(String[])}.
+     */
+    public void setRenderParam(PortletWindow window, String name, String[] values) {
+        encodedStateFullControlParameter.put(encodeRenderParamName(window, name), 
+                                      encodeRenderParamValues(values) );
+    }
+
+    public void setRequestParam(String name, String[] values ) {
+        requestParameter.put(name, values );
+    }
+
+
+    public void setState(PortletWindow window, String state) {
+        Object prevState = encodedStateFullControlParameter.get(getStateKey(window));
+        if (prevState != null) {
+            encodedStateFullControlParameter.put(getPrevStateKey(window), prevState);
+        }
+        encodedStateFullControlParameter.put(getStateKey(window), state);
+    }
+
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposer.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposer.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposer.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposer.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.pluto;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+import javax.portlet.PortletURL;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.pluto.core.CoreUtils;
+import org.apache.pluto.factory.PortletObjectAccess;
+import org.apache.pluto.om.window.PortletWindow;
+
+import org.apache.wsrp4j.commons.util.Constants;
+
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposer;
+
+
+public class PlutoPortalTemplateComposer implements PortalTemplateComposer {
+    
+    private final static Log log = LogFactory.getLog(PlutoPortalTemplateComposer.class);
+    
+    private static final String RESOURCE_PROXY_URL = "/WSRP4JResourceProxy";
+    
+    private PortletRequest request;
+    private PortletResponse response;
+    private PortletWindow portletWindow;
+    private HttpServletRequest servletRequest;
+    private HttpServletResponse servletResponse;
+    
+    public PlutoPortalTemplateComposer(PortletRequest request,
+            PortletResponse response) {
+        
+        this.request = request;
+        this.response = response;
+        
+        this.portletWindow = 
+                CoreUtils.getInternalRequest(request).getInternalPortletWindow();
+        
+        /* In Pluto we can downcast the portlet request and response
+         * objects to their corresponding http servlet request and response */
+        this.servletRequest = (HttpServletRequest) request;
+        this.servletResponse = (HttpServletResponse) response;
+        
+    }
+    
+    public String getBlockingActionTemplate() {
+        
+        boolean isAction = true;
+        PortletURL baseURL = PortletObjectAccess.getPortletURL(
+                portletWindow, servletRequest, servletResponse, isAction);
+        PlutoPortalURL plutoURL =
+                new PlutoPortalURL(baseURL.toString(), portletWindow);
+        PlutoPortalControlParameter controlParam =
+                new PlutoPortalControlParameter(plutoURL);
+        
+        controlParam.setAction(portletWindow);
+        controlParam.setMode(portletWindow, Constants.PORTLET_MODE_TEMPLATE);
+        controlParam.setState(portletWindow, Constants.WINDOW_STATE_TEMPLATE);
+        controlParam.setRenderParam(portletWindow, Constants.NAVIGATIONAL_STATE,
+                new String[] {Constants.NAVIGATIONAL_STATE_TEMPLATE});
+        controlParam.setRequestParam(Constants.INTERACTION_STATE,
+                new String[] {Constants.INTERACTION_STATE_TEMPLATE});
+        plutoURL.analyzeControlInformation(controlParam);
+        
+        String template = plutoURL.toString(controlParam);
+        if (log.isDebugEnabled()) {
+            log.debug("Sending BlockingActionTemplate: " + template);
+        }
+        return template;
+        
+    }
+    
+    public String getSecureBlockingActionTemplate() {
+        return null;
+    }
+    
+    public String getRenderTemplate() {
+        
+        boolean isAction = false;
+        PortletURL baseURL = PortletObjectAccess.getPortletURL(
+                portletWindow, servletRequest, servletResponse, isAction);
+        PlutoPortalURL plutoURL = 
+                new PlutoPortalURL(baseURL.toString(), portletWindow);
+        PlutoPortalControlParameter controlParam =
+                new PlutoPortalControlParameter(plutoURL);
+        
+        controlParam.setMode(portletWindow, Constants.PORTLET_MODE_TEMPLATE);
+        controlParam.setState(portletWindow, Constants.WINDOW_STATE_TEMPLATE);
+        controlParam.setRenderParam(portletWindow, Constants.NAVIGATIONAL_STATE,
+                new String[] {Constants.NAVIGATIONAL_STATE_TEMPLATE});
+        plutoURL.analyzeControlInformation(controlParam);
+        
+        String template = plutoURL.toString(controlParam);
+        if (log.isDebugEnabled()) {
+            log.debug("Sending RenderTemplate: " + template);
+        }
+        return template;
+
+    }
+    
+    public String getSecureRenderTemplate() {
+        return null;
+    }
+    
+    public String getResourceTemplate() {
+        String resourceProxy = response.encodeURL(
+                request.getContextPath() + RESOURCE_PROXY_URL);
+        PlutoPortalURL plutoURL =
+                new PlutoPortalURL(resourceProxy, portletWindow);
+        PlutoPortalControlParameter controlParam =
+                new PlutoPortalControlParameter(plutoURL);
+        
+        controlParam.setRequestParam(Constants.REWRITE_RESOURCE,
+                new String[] {Constants.REWRITE_RESOURCE_TEMPLATE});
+        controlParam.setRequestParam(Constants.URL,
+                new String[] {Constants.URL_TEMPLATE});
+        plutoURL.analyzeControlInformation(controlParam);
+        
+        String template = plutoURL.toString(controlParam);
+        if (log.isDebugEnabled()) {
+            log.debug("Sending ResourceTemplate: " + template);
+        }
+        return template;
+        
+    }
+    
+    public String getSecureResourceTemplate() {
+        return null;
+    }
+    
+    public String getDefaultTemplate() {
+        boolean isAction = true;
+        PortletURL baseURL = PortletObjectAccess.getPortletURL(
+                portletWindow, servletRequest, servletResponse, isAction);
+        PlutoPortalURL plutoURL =
+                new PlutoPortalURL(baseURL.toString(), portletWindow);
+        PlutoPortalControlParameter controlParam =
+                new PlutoPortalControlParameter(plutoURL);
+        
+        controlParam.setAction(portletWindow);
+        controlParam.setMode(portletWindow, Constants.PORTLET_MODE_TEMPLATE);
+        controlParam.setState(portletWindow, Constants.WINDOW_STATE_TEMPLATE);
+        controlParam.setRenderParam(portletWindow, Constants.NAVIGATIONAL_STATE,
+                new String[] {Constants.NAVIGATIONAL_STATE_TEMPLATE});
+        controlParam.setRequestParam(Constants.INTERACTION_STATE,
+                new String[] {Constants.INTERACTION_STATE_TEMPLATE});
+        plutoURL.analyzeControlInformation(controlParam);
+        
+        String template = plutoURL.toString(controlParam);
+        if (log.isDebugEnabled()) {
+            log.debug("Sending DefaultTemplate: " + template);
+        }
+        return template;
+    }
+    
+    public String getSecureDefaultTemplate() {
+        return null;
+    }
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposerService.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposerService.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposerService.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalTemplateComposerService.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.pluto;
+
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletResponse;
+
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposer;
+import org.apache.wsrp4j.consumer.proxyportlet.template.PortalTemplateComposerService;
+
+
+public class PlutoPortalTemplateComposerService 
+        implements PortalTemplateComposerService {
+    
+    public PlutoPortalTemplateComposerService() {}
+    
+    public PortalTemplateComposer getPortalTemplateComposer(
+            PortletRequest request, PortletResponse response) {
+        return new PlutoPortalTemplateComposer(request, response);
+    }
+    
+}

Added: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalURL.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalURL.java?view=auto&rev=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalURL.java (added)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/template/pluto/PlutoPortalURL.java Sun Dec 10 13:09:44 2006
@@ -0,0 +1,346 @@
+/*
+ * Copyright 2003-2006 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wsrp4j.consumer.proxyportlet.template.pluto;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.pluto.om.window.PortletWindow;
+
+import org.apache.wsrp4j.commons.util.Constants;
+
+
+public class PlutoPortalURL {
+
+    private String plutoURL = null;
+    private PortletWindow portletWindow = null;
+    
+    private List startGlobalNavigation = new ArrayList();
+    private List startLocalNavigation = new ArrayList();
+    private HashMap encodedStartControlParameter = new HashMap();
+    private HashMap startStateLessControlParameter = new HashMap();
+
+    public PlutoPortalURL(String plutoURL, PortletWindow portletWindow) {
+        this.plutoURL = plutoURL;
+        this.portletWindow = portletWindow;
+        analyzeRequestInformation();
+    }
+    
+    public String getBasePortalURL(HttpServletRequest servletRequest) {
+        StringBuffer result = new StringBuffer(256);
+
+        result.append(servletRequest.getContextPath());
+        result.append(servletRequest.getServletPath());
+
+        return result.toString();
+    }
+    
+    public PortletWindow getPortletWindow() {
+        return portletWindow;
+    }
+
+    /**
+     * Adds a navigational information pointing to a portal part, e.g. PageGroups
+     * or Pages
+     *
+     * @param nav    the string pointing to a portal part
+     */
+    public void addGlobalNavigation(String nav) {
+        startGlobalNavigation.add(nav);
+    }
+
+    /**
+     * Sets the local navigation. Because the local navigation is always handled
+     * by the Browser, therefore the local navigation cleared.
+     */
+    public void setLocalNavigation() {
+        startLocalNavigation = new ArrayList();
+    }
+
+    /**
+     * Adds a navigational information pointing to a local portal part inside
+     * of a global portal part, for example, a portlet on a page.
+     *
+     * @param nav    the string pointing to a local portal part
+     */
+    public void addLocalNavigation(String nav) {
+        startLocalNavigation.add(nav);
+    }
+
+    /**
+     * Returns true if the given string is part of the global navigation of this URL
+     *
+     * @param nav    the string to check
+     * @return true, if the string is part of the navigation
+     */
+    public boolean isPartOfGlobalNavigation(String nav) {
+        return startGlobalNavigation.contains(nav);
+    }
+
+    /**
+     * Returns true if the given string is part of the local navigation of this URL
+     *
+     * @param nav    the string to check
+     * @return true, if the string is part of the navigation
+     */
+    public boolean isPartOfLocalNavigation(String nav) {
+        return startLocalNavigation.contains(nav);
+    }
+    
+    private String urlEncode(String value) {
+        value = URLEncoder.encode(value);
+        // java.net.URLEncoder encodes space (' ') as a plus sign ('+'),
+        // instead of %20 thus it will not be decoded properly by tomcat when the
+        // request is parsed. Therefore replace all '+' by '%20'.
+        // If there would have been any plus signs in the original string, they would
+        // have been encoded by URLEncoder.encode()
+        // control = control.replace("+", "%20");//only works with JDK 1.5
+        value = value.replaceAll("\\+", "%20");
+        return value;
+    }    
+
+    public String getGlobalNavigationAsString() {
+        StringBuffer result = new StringBuffer(200);
+        Iterator iterator = startGlobalNavigation.iterator();
+        if (iterator.hasNext()) {
+            result.append((String)iterator.next());
+            while (iterator.hasNext()) {
+                result.append("/");
+                String st = (String)iterator.next();
+                result.append(st);
+            }
+        }
+        return result.toString();
+    }
+
+    public String getLocalNavigationAsString() {
+        StringBuffer result = new StringBuffer(30);
+        Iterator iterator = startLocalNavigation.iterator();
+        if (iterator.hasNext()) {
+            result.append((String)iterator.next());
+            while (iterator.hasNext()) {
+                result.append(".");
+                result.append((String)iterator.next());
+            }
+        }
+        return result.toString();
+    }
+
+    public String getControlParameterAsString(
+            PlutoPortalControlParameter controlParam) {
+        
+        Map encodedStateFullParams = encodedStartControlParameter;
+        if (controlParam != null) {
+            encodedStateFullParams = controlParam.getEncodedStateFullControlParameter();
+        }
+
+        StringBuffer result = new StringBuffer(100);
+        Iterator iterator = encodedStateFullParams.keySet().iterator();
+        while (iterator.hasNext()) {
+            result.append("/");
+            String encodedName = (String) iterator.next();
+            String encodedValue = (String) encodedStateFullParams.get(encodedName);
+            if(encodedValue != null) {
+                // appends the prefix (currently "_") in front of the encoded parameter name
+                result.append(PlutoPortalControlParameter.encodeParameterName(encodedName));
+                result.append("/");
+                /* If it's a wsrp render parameter (for instance, wsrp-navigationalState),
+                 * a PortletMode or a WindowState parameter, then do not
+                 * www-url-encode the value */
+                if (Constants.isWsrpURLParam(controlParam.decodeParameterName(
+                            PlutoPortalControlParameter.decodeRenderParamName(
+                            portletWindow, encodedName))) || 
+                        controlParam.isPortletModeParameter(portletWindow, encodedName) ||
+                        controlParam.isWindowStateParameter(portletWindow, encodedName)) {
+                    result.append(encodedValue);
+                } else {
+                    result.append(urlEncode(encodedValue));
+                }
+            }
+        }
+
+        return result.toString();
+        
+    }
+
+    public String getRequestParameterAsString(
+            PlutoPortalControlParameter controlParam) {
+        
+        if (controlParam!=null) {
+            Map requestParams = controlParam.getRequestParameter();
+
+            StringBuffer result = new StringBuffer(100);
+            Iterator iterator = requestParams.keySet().iterator();
+            boolean hasNext = iterator.hasNext();
+            if (hasNext) {
+                result.append("?");
+            }
+
+            while (hasNext) {
+                String name = (String)iterator.next();
+                Object value = requestParams.get(name);
+                String[] values = value instanceof String ? 
+                    new String[] {(String)value} : (String[])value;
+
+                result.append(urlEncode(name));
+                result.append("=");
+                if (Constants.isWsrpURLParam(name)) {
+                    result.append(values[0]);
+                } else {
+                    result.append(urlEncode(values[0]));
+                }
+                for (int i = 1; i < values.length; i++) {
+                    result.append("&");
+                    result.append(urlEncode(name));
+                    result.append("=");
+                    if (Constants.isWsrpURLParam(name)) {
+                        result.append(values[i]);
+                    } else {
+                        result.append(urlEncode(values[i]));
+                    }
+                }
+
+                hasNext=iterator.hasNext();
+                if (hasNext) {
+                    result.append("&");
+                }
+            }
+
+            return result.toString();
+        }
+        return "";
+        
+    }
+
+    public String toString() {
+        return toString(null);
+    }
+
+    public String toString(PlutoPortalControlParameter controlParam) {
+
+        String url = new String();
+        
+        String global = getGlobalNavigationAsString();
+        if (global.length() > 0) {
+            url += "/";
+            url += global;
+        }
+
+        String control = getControlParameterAsString(controlParam);
+        if (control.length() > 0) {
+            url += control;
+        }
+
+        String requestParam = getRequestParameterAsString(controlParam);
+        if (requestParam.length() > 0) {
+            url += requestParam;
+        }
+
+        String local = getLocalNavigationAsString();
+        if (local.length() > 0) {
+            url += "#";
+            url += local;
+        }
+
+        return url;
+    }
+
+    Map getClonedEncodedStateFullControlParameter() {
+        analyzeRequestInformation();
+        return(Map)encodedStartControlParameter.clone();
+    }
+
+    Map getClonedStateLessControlParameter() {
+        analyzeRequestInformation();
+        return(Map)startStateLessControlParameter.clone();
+    }
+
+    void analyzeControlInformation(PlutoPortalControlParameter control) {
+        encodedStartControlParameter = 
+                (HashMap) control.getEncodedStateFullControlParameter();
+        startStateLessControlParameter = 
+                (HashMap) control.getStateLessControlParameter();
+    }
+
+    void analyzeRequestInformation() {
+
+        startGlobalNavigation = new ArrayList();
+        startLocalNavigation = new ArrayList();
+        encodedStartControlParameter = new HashMap();
+        startStateLessControlParameter = new HashMap();
+
+        // check the complete pathInfo for
+        // * navigational information
+        // * control information
+
+        if (this.plutoURL != null) {
+            StringTokenizer tokenizer = new StringTokenizer(this.plutoURL, "/");
+
+            int mode = 0; // 0=navigation, 1=control information
+            String encodedName = null;
+            while (tokenizer.hasMoreTokens()) {
+                String token = tokenizer.nextToken();
+                if (PlutoPortalControlParameter.isControlParameter(token)) {
+                    mode = 1;
+                    encodedName = token;
+                } else if (mode==0) {
+                    startGlobalNavigation.add(token);
+                } else if (mode==1) {
+                    if ((PlutoPortalControlParameter.isStateFullParameter(encodedName))) {
+                    	// cut the prefix before saving the parameter name
+                    	encodedName = PlutoPortalControlParameter.decodeParameterName(encodedName);
+                        encodedStartControlParameter.put(encodedName, token);
+                    } else {
+                        startStateLessControlParameter.put(
+                                PlutoPortalControlParameter.decodeParameterName(encodedName),
+                                PlutoPortalControlParameter.decodeParameterValue(encodedName,token));
+                    }
+                    mode = 0;
+                }
+            }
+        }
+
+    }
+
+    public void setRenderParameter(PortletWindow portletWindow, String name, 
+            String[] values) {
+        
+        encodedStartControlParameter.put(
+                PlutoPortalControlParameter.encodeRenderParamName(portletWindow, name),
+                PlutoPortalControlParameter.encodeRenderParamValues(values));
+
+    }
+
+    public void clearRenderParameters(PortletWindow portletWindow) {
+        String prefix = PlutoPortalControlParameter.getRenderParamKey(portletWindow);
+        Iterator keyIterator = encodedStartControlParameter.keySet().iterator();
+        while (keyIterator.hasNext()) {
+            String name = (String)keyIterator.next();
+            if (name.startsWith(prefix)) {
+                keyIterator.remove();
+            }
+        }
+    }
+
+}

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/util/Constants.java
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/util/Constants.java?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/util/Constants.java (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/java/org/apache/wsrp4j/consumer/proxyportlet/util/Constants.java Sun Dec 10 13:09:44 2006
@@ -38,6 +38,14 @@
             "default";
     
     /**
+     * Portal template composer used by proxyportlet template composer
+     * for generating the url templates. Each portal environment where
+     * proxyportlet can live in must provide its own implementation
+     */
+    public final static String PROXYPORTLET_PORTAL_TEMPLATE_COMPOSER =
+            "org.apache.wsrp4j.consumer.proxyportlet.templatecomposer";
+    
+    /**
      * Parameters needed for showing the exceptions on the portlet
      */
     public final static String PROXYPORTLET_ATTR_EXCEPTION = "exception";

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/log4j.properties
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/log4j.properties?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/log4j.properties (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/log4j.properties Sun Dec 10 13:09:44 2006
@@ -28,7 +28,7 @@
 
 log4j.appender.A1=org.apache.log4j.FileAppender
 log4j.appender.A1.Append=false
-log4j.appender.A1.File=${catalina.base}/logs/wsrp4j-consumer.log
+log4j.appender.A1.File=${maven.tomcat.home}/logs/wsrp4j-consumer.log
 
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c: %m%n

Modified: portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/wsrp4j-config.properties
URL: http://svn.apache.org/viewvc/portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/wsrp4j-config.properties?view=diff&rev=485259&r1=485258&r2=485259
==============================================================================
--- portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/wsrp4j-config.properties (original)
+++ portals/wsrp4j/trunk/consumer-proxyportlet/src/webapp/WEB-INF/classes/wsrp4j-config.properties Sun Dec 10 13:09:44 2006
@@ -19,6 +19,19 @@
 wsrp4j.proxyportlet.persistent.factory=\
     org.apache.wsrp4j.persistence.xml.driver.ProxyPersistentFactoryImpl
 
+
+# Portal template composer service (different for each portal container)
+# Uncomment the appropriate one
+
+# Pluto Portal composer service
+org.apache.wsrp4j.consumer.proxyportlet.templatecomposer=\
+    org.apache.wsrp4j.consumer.proxyportlet.template.pluto.PlutoPortalTemplateComposerService
+# Jetspeed composer service
+#org.apache.wsrp4j.consumer.proxyportlet.templatecomposer=\
+#    org.apache.wsrp4j.consumer.proxyportlet.template.jetspeed.JetspeedPortalTemplateComposerService
+
+
+# ProxyPortlet environment class implementation
 wsrp4j.proxyportlet.environment.class=\
     org.apache.wsrp4j.consumer.proxyportlet.impl.ConsumerEnvironmentImpl
 
@@ -28,7 +41,7 @@
 # Persistence dir for Castor-based producer management. The files will be under
 # directory ${wsrp4j.proxyportlet.persistence.xml.dir}/producers
 wsrp4j.proxyportlet.persistence.xml.dir=\
-    /home/diego/local/apache-tomcat-5.5.16-cons/webapps/wsrp4j-proxyportlet/WEB-INF
+    ${maven.tomcat.home}/webapps/wsrp4j-proxyportlet/WEB-INF
 
 # Implementation of the services needed by configportlet for producer registry
 wsrp4j.configportlet.producerregistry.delegate=\