You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by at...@apache.org on 2009/03/12 15:59:17 UTC

svn commit: r752882 - in /portals/pluto/trunk: pluto-container-api/src/main/java/org/apache/pluto/container/ pluto-container-api/src/main/java/org/apache/pluto/container/driver/ pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ plut...

Author: ate
Date: Thu Mar 12 14:59:12 2009
New Revision: 752882

URL: http://svn.apache.org/viewvc?rev=752882&view=rev
Log:
Several changes for PLUTO-531, PLUTO-532 and PLUTO-537
- some minor Generics cleanup in pluto-container and pluto-container-api
- some further refinements to the new Request/Response*Context interfaces
- start of reimplementing and adjusting the portal-driver Portal/PortletURL parsing/managing
  NB: I've added proper support for ResourceRequest/URL Cacheability, ResourceID, and private resource parameters
- seems I'm now finally ready to provide the last bit: the implementation of the Request/Response*Context interfaces for the portal-driver

See also:
  http://issues.apache.org/jira/browse/PLUTO-531
  http://issues.apache.org/jira/browse/PLUTO-532
  http://issues.apache.org/jira/browse/PLUTO-537

Removed:
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLListenerImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLImpl.java
Modified:
    portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletMimeResponseContext.java
    portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletStateAwareResponseContext.java
    portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletURLProvider.java
    portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/driver/PortletServlet.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/CombinedPortletResourceBundle.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/DummyProfile.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/InlinePortletResourceBundle.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextManager.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletDescriptorRegistry.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ResourceBundleFactory.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/EventResponseImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/MimeResponseImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferenceImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletSessionImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceResponseImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/ClasspathScanner.java
    portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/StringManager.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
    portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/RelativePortalURLImpl.java
    portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/core/PortalRequestContext.java
    portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURL.java
    portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURLParser.java

Modified: portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletMimeResponseContext.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletMimeResponseContext.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletMimeResponseContext.java (original)
+++ portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletMimeResponseContext.java Thu Mar 12 14:59:12 2009
@@ -30,7 +30,7 @@
 public interface PortletMimeResponseContext extends PortletResponseContext
 {
     CacheControl getCacheControl();
-    PortletURLProvider getPortletURLProvider();
+    PortletURLProvider getPortletURLProvider(PortletURLProvider.TYPE type);
     Locale getLocale();
     String getContentType();
     void setContentType(String contentType);

Modified: portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletStateAwareResponseContext.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletStateAwareResponseContext.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletStateAwareResponseContext.java (original)
+++ portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletStateAwareResponseContext.java Thu Mar 12 14:59:12 2009
@@ -19,7 +19,6 @@
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.portlet.Event;
 import javax.portlet.PortletMode;
@@ -36,7 +35,7 @@
     WindowState getWindowState();
     void setWindowState(WindowState windowState);
     Map<String, String[]> getRenderParameters();
-    Set<String> getRemovedPublicRenderParameters();
+    Map<String, String[]> getPublicRenderParameters();
     EventProvider getEventProvider();
     List<Event> getEvents();
 }

Modified: portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletURLProvider.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletURLProvider.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletURLProvider.java (original)
+++ portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/PortletURLProvider.java Thu Mar 12 14:59:12 2009
@@ -19,7 +19,6 @@
 import java.io.Writer;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.portlet.PortletMode;
 import javax.portlet.PortletSecurityException;
@@ -34,9 +33,9 @@
  */
 public interface PortletURLProvider {
 
-    boolean isActionURL();
-    boolean isRenderURL();
-    boolean isResourceURL();
+    enum TYPE { ACTION, RENDER, RESOURCE };
+    
+    TYPE getType();
 
     /**
      * Sets the new portlet mode at the URL. If no mode is set at the URL the
@@ -60,8 +59,7 @@
     boolean isSecure();
 
     Map<String, String[]> getRenderParameters();
-    Set<String> getRemovedPublicRenderParameters();
-    
+    Map<String, String[]> getPublicRenderParameters();
     
     String getCacheability();
     void setCacheability(String cacheLevel);
@@ -71,11 +69,10 @@
     
     /**
      * Returns the URL in string format
+     * @param absolute if true an absolute URL is required, like for embedding as a query parameter value
      * @return the URL
      */
-    String toString();
-    
-    String toQueryStringValue();
+    String toURL(boolean absolute);
     
     void write(Writer out);
     void write(Writer out, boolean escapeXML);

Modified: portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/driver/PortletServlet.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/driver/PortletServlet.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/driver/PortletServlet.java (original)
+++ portals/pluto/trunk/pluto-container-api/src/main/java/org/apache/pluto/container/driver/PortletServlet.java Thu Mar 12 14:59:12 2009
@@ -63,7 +63,7 @@
 {
     private static final long serialVersionUID = -5096339022539360365L;
     
-    private static class NullPortlet implements EventPortlet, ResourceServingPortlet, Portlet
+    static class NullPortlet implements EventPortlet, ResourceServingPortlet, Portlet
     {
         public void processEvent(EventRequest arg0, EventResponse arg1)
         throws PortletException, IOException

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/CombinedPortletResourceBundle.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/CombinedPortletResourceBundle.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/CombinedPortletResourceBundle.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/CombinedPortletResourceBundle.java Thu Mar 12 14:59:12 2009
@@ -16,10 +16,10 @@
  */
 package org.apache.pluto.container.driver.impl;
 
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.ResourceBundle;
-import java.util.Vector;
 
 import org.apache.pluto.container.util.ArgumentUtility;
 
@@ -30,7 +30,7 @@
  */
 class CombinedPortletResourceBundle extends ResourceBundle {
 
-    private HashMap contents = new HashMap();
+    private HashMap<String, Object> contents = new HashMap<String, Object>();
 
     public CombinedPortletResourceBundle(InlinePortletResourceBundle inlineBundle, ResourceBundle resourceBundle) {
        dump(inlineBundle);
@@ -42,12 +42,12 @@
         return contents.get(key);
     }
 
-    public Enumeration getKeys() {
-       return new Vector(contents.keySet()).elements();
+    public Enumeration<String> getKeys() {
+       return Collections.enumeration(contents.keySet());
     }
 
     private void dump(ResourceBundle bundle) {
-        Enumeration e = bundle.getKeys();
+        Enumeration<String> e = bundle.getKeys();
         while(e.hasMoreElements()) {
             String value = e.nextElement().toString();
             contents.put(value, bundle.getObject(value));

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/DummyProfile.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/DummyProfile.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/DummyProfile.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/DummyProfile.java Thu Mar 12 14:59:12 2009
@@ -25,7 +25,8 @@
 	/* (non-Javadoc)
 	 * @see javax.ccpp.Profile#getAttributes()
 	 */
-	public Set getAttributes() {
+	@SuppressWarnings("unchecked")
+    public Set getAttributes() {
 		return null;
 	}
 
@@ -39,7 +40,8 @@
 	/* (non-Javadoc)
 	 * @see javax.ccpp.Profile#getComponents()
 	 */
-	public Set getComponents() {
+	@SuppressWarnings("unchecked")
+    public Set getComponents() {
 		return null;
 	}
 

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/InlinePortletResourceBundle.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/InlinePortletResourceBundle.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/InlinePortletResourceBundle.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/InlinePortletResourceBundle.java Thu Mar 12 14:59:12 2009
@@ -38,7 +38,7 @@
     }
 
     public InlinePortletResourceBundle(String title, String shortTitle, String keywords) {
-        ArrayList temp = new ArrayList();
+        ArrayList<Object[]> temp = new ArrayList<Object[]>();
         if(title != null)
             temp.add(new Object[] {Constants.TITLE_KEY, title});
 
@@ -48,7 +48,7 @@
         if(keywords != null)
             temp.add(new Object[] {Constants.KEYWORDS_KEY, keywords});
 
-        contents = (Object[][])temp.toArray(new Object[temp.size()][]);
+        contents = temp.toArray(new Object[temp.size()][]);
     }
 
     protected Object[][] getContents() {

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextImpl.java Thu Mar 12 14:59:12 2009
@@ -175,43 +175,39 @@
         if (exactServletMappingURLPatterns.contains(path))
         {
             servletPath = path;
-            pathInfo = null;
         }
-        else if ( path.charAt(0) == '/' && (index = path.lastIndexOf('/')) != -1)
+        else if (path.length() == 1 && defaultServletMapping)
         {
-            if (path.length() == 1 && defaultServletMapping)
-            {
-                servletPath = path;
-                pathInfo = null;
-            }
-            else
+            servletPath = path;
+        }
+        else
+        {
+            String sub = path;
+            index = path.lastIndexOf('/');
+            do
             {
-                String sub = path;
-                do
+                sub = sub.substring(0, index);
+                if (pathServletMappingURLPatterns.contains(sub))
                 {
-                    sub = sub.substring(0, index);
-                    if (pathServletMappingURLPatterns.contains(sub))
+                    servletPath = sub;
+                    if (sub.length() < path.length())
                     {
-                        servletPath = sub;
                         pathInfo = path.substring(sub.length()+1);
-                        break;
                     }
-                    index = sub.lastIndexOf('/');
+                    break;
                 }
-                while (index != -1);
+                index = sub.lastIndexOf('/');
             }
+            while (index != 0);
         }
         if (servletPath == null)
         {
-            ;            
-            if ((index = path.lastIndexOf('/')) != -1)
+            index = path.lastIndexOf('/');
+            int ext = path.indexOf('.', index);
+            if (extServletMappingURLPatterns.contains(path.substring(ext)))
             {
-                int ext = path.indexOf('.', index);
-                if (extServletMappingURLPatterns.contains(path.substring(index)))
-                {
-                    servletPath = path.substring(0, index);
-                    pathInfo = path.substring(index);
-                }
+                servletPath = index > 0 ? path.substring(0, index) : "";
+                pathInfo = path.substring(index);
             }
         }
         if (servletPath == null)

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextManager.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextManager.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextManager.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletContextManager.java Thu Mar 12 14:59:12 2009
@@ -314,7 +314,7 @@
 
     static {
         try {
-            contextPathGetter = ServletContext.class.getMethod("getContextPath", new Class[0]);
+            contextPathGetter = ServletContext.class.getMethod("getContextPath", (Class[])null);
         }
         catch (NoSuchMethodException e) {
             LOG.warn("Servlet 2.4 or below detected.  Unable to find getContextPath on ServletContext.");
@@ -325,7 +325,7 @@
         String contextPath = null;
         if (contextPathGetter != null) {
             try {
-                contextPath = (String) contextPathGetter.invoke(context, new Class[0]);
+                contextPath = (String) contextPathGetter.invoke(context, (Object[])null);
             } catch (Exception e) {
                 LOG.warn("Unable to directly retrieve context path from ServletContext. Computing. . . ");
             }
@@ -339,6 +339,7 @@
     }
 
 
+    @SuppressWarnings("unchecked")
     protected static String computeContextPath(ServletContext context) {
         if (APP_ID_RESOLVERS.size() < 1) {
             List<Class> classes = null;

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletDescriptorRegistry.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletDescriptorRegistry.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletDescriptorRegistry.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/PortletDescriptorRegistry.java Thu Mar 12 14:59:12 2009
@@ -69,7 +69,7 @@
      * point I'm wondering if we really want to add another
      * config requirement in the servlet xml? Hmm. . .
      */
-    private Map cache = new WeakHashMap();
+    private Map<ServletContext, PortletApplicationDefinition> cache = new WeakHashMap<ServletContext, PortletApplicationDefinition>();
 
 
     // Constructor -------------------------------------------------------------
@@ -93,7 +93,7 @@
     throws PlutoConfigurationException {
         String className = Configuration.getPortletAppDescriptorServiceImpl();
         try {
-            Class clazz = Class.forName(className);
+            Class<?> clazz = Class.forName(className);
             portletDDService = (PortletAppDescriptorService) clazz.newInstance();
         } catch (ClassNotFoundException ex) {
             throw new PlutoConfigurationException(
@@ -120,7 +120,7 @@
      */
     public PortletApplicationDefinition getPortletAppDD(ServletContext servletContext)
     throws PortletContainerException {
-        PortletApplicationDefinition portletApp = (PortletApplicationDefinition) cache.get(servletContext);
+        PortletApplicationDefinition portletApp = cache.get(servletContext);
         if (portletApp == null) {
         	portletApp = createDefinition(servletContext);
             cache.put(servletContext, portletApp);

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ResourceBundleFactory.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ResourceBundleFactory.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ResourceBundleFactory.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/driver/impl/ResourceBundleFactory.java Thu Mar 12 14:59:12 2009
@@ -50,7 +50,7 @@
     /**
      * All of the previously loaded bundles.
      */
-    private Map bundles = new HashMap();
+    private Map<Locale, ResourceBundle> bundles = new HashMap<Locale, ResourceBundle>();
 
     /**
      * The name of the bundle.
@@ -87,7 +87,7 @@
 
         // If allready loaded for this local, return immediately!
         if (bundles.containsKey(locale)) {
-            return (ResourceBundle) bundles.get(locale);
+            return bundles.get(locale);
         }
 
         try {
@@ -110,6 +110,6 @@
             }
             bundles.put(locale, defaultBundle);
         }
-       return (ResourceBundle)bundles.get(locale);
+       return bundles.get(locale);
     }
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/EventResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/EventResponseImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/EventResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/EventResponseImpl.java Thu Mar 12 14:59:12 2009
@@ -16,13 +16,10 @@
 
 package org.apache.pluto.container.impl;
 
-import java.util.Map;
-
 import javax.portlet.EventRequest;
 import javax.portlet.EventResponse;
 
 import org.apache.pluto.container.PortletEventResponseContext;
-import org.apache.pluto.container.PortletStateAwareResponseContext;
 import org.apache.pluto.container.util.ArgumentUtility;
 
 /**
@@ -46,7 +43,6 @@
 	public void setRenderParameters(EventRequest request)
 	{
         ArgumentUtility.validateNotNull("request", request);
-	    Map<String, String[]> parameters = ((PortletStateAwareResponseContext)getResponseContext()).getRenderParameters();
-	    parameters.putAll(request.getParameterMap());
+        setRenderParameters(request.getParameterMap());
 	}
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/HttpServletPortletRequestWrapper.java Thu Mar 12 14:59:12 2009
@@ -531,8 +531,8 @@
                 {
                     String servletPath = !included ? forwardedPathInfo.getServletPath() : getServletPath();
                     if (servletPath != null)
-                    {
-                        path = servletPath + path;
+                    {                        
+                        path = (servletPath.equals("/") ? "/" : servletPath) + path;
                     }
                     else
                     {

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/MimeResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/MimeResponseImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/MimeResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/MimeResponseImpl.java Thu Mar 12 14:59:12 2009
@@ -30,6 +30,7 @@
 import javax.portlet.ResourceURL;
 
 import org.apache.pluto.container.PortletMimeResponseContext;
+import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.om.portlet.PortletDefinition;
 import org.apache.pluto.container.om.portlet.Supports;
 
@@ -72,18 +73,18 @@
     
     public PortletURL createActionURL()
     {
-        return new PortletURLImpl(responseContext, true, false);
+        return new PortletURLImpl(responseContext, PortletURLProvider.TYPE.ACTION);
     }
     
     public PortletURL createRenderURL()
     {
-        return new PortletURLImpl(responseContext, false, false);
+        return new PortletURLImpl(responseContext, PortletURLProvider.TYPE.RENDER);
     }
 
 
     public ResourceURL createResourceURL()
     {
-        return new PortletURLImpl(responseContext, false, true);
+        return new PortletURLImpl(responseContext, PortletURLProvider.TYPE.RESOURCE);
     }
     
     public void flushBuffer() throws IOException

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferenceImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferenceImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferenceImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletPreferenceImpl.java Thu Mar 12 14:59:12 2009
@@ -93,7 +93,7 @@
     	PortletPreferenceImpl copy = new PortletPreferenceImpl();
     	copy.name = this.name;
     	if (this.values != null) {
-    		copy.values = (String[]) this.values.clone();
+    		copy.values = this.values.clone();
     	}
     	copy.readOnly = this.readOnly;
     	return copy;

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletSessionImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletSessionImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletSessionImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletSessionImpl.java Thu Mar 12 14:59:12 2009
@@ -107,6 +107,7 @@
         return getAttributeNames(DEFAULT_SCOPE);
     }
     
+    @SuppressWarnings("unchecked")
     public Enumeration<String> getAttributeNames(int scope) {
     	// Return all attribute names in the nested HttpSession object.
         if (scope == PortletSession.APPLICATION_SCOPE) {

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/PortletURLImpl.java Thu Mar 12 14:59:12 2009
@@ -22,6 +22,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -53,21 +54,26 @@
     private PortletMimeResponseContext responseContext;
     private PortalContext portalContext;
     private PortletURLProvider urlProvider;
-    private String cacheLevel;
+    private String cacheLevel = ResourceURL.PAGE;
     private boolean filtering;
+    private boolean renderURL;
     
-    public PortletURLImpl(PortletMimeResponseContext responseContext, boolean actionURL, boolean resourceURL)
+    public PortletURLImpl(PortletMimeResponseContext responseContext, PortletURLProvider.TYPE type)
     {
         this.responseContext = responseContext;
         this.portalContext = responseContext.getContainer().getRequiredContainerServices().getPortalContext();
-        // TODO: actionURL/resourceURL parameters
-        urlProvider = responseContext.getPortletURLProvider();
+        urlProvider = responseContext.getPortletURLProvider(type);
+        renderURL = PortletURLProvider.TYPE.RENDER == type;
     }
     
-    public PortletURLImpl(PortletMimeResponseContext responseContext, boolean actionURL, boolean resourceURL, String cacheLevel)
+    public PortletURLImpl(PortletMimeResponseContext responseContext, String cacheLevel)
     {
-        this(responseContext, actionURL, resourceURL);
-        this.cacheLevel = cacheLevel == null ? ResourceURL.PAGE : cacheLevel;
+        this(responseContext, PortletURLProvider.TYPE.RESOURCE);
+        if (cacheLevel != null)
+        {
+            this.cacheLevel = cacheLevel;
+        }
+        urlProvider.setCacheability(this.cacheLevel);
     }
 
     private boolean isPortletModeAllowed(PortletMode mode)
@@ -122,13 +128,19 @@
         }
         return false;
     }
+    
+    private boolean isPublicRenderParameter(String name)
+    {
+        List<String> publicRenderParameterNames = responseContext.getPortletWindow().getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
+        return publicRenderParameterNames.isEmpty() ? false : publicRenderParameterNames.contains(name);
+    }
         
     private static String[] cloneParameterValues(String[] values)
     {
         int count = 0;
         for (String s : values)
         {
-            if (!(s == null || s.length() == 0))
+            if (s != null)
             {
                 count++;
             }
@@ -143,7 +155,7 @@
             count = 0;
             for (String s : values)
             {
-                if (!(s == null || s.length() == 0))
+                if (s != null)
                 {
                     copy[count++] = s;
                 }
@@ -169,11 +181,11 @@
             PortletApplicationDefinition portletApp = responseContext.getPortletWindow().getPortletEntity().getPortletDefinition().getApplication();
             for (PortletURLGenerationListener listener : service.getPortletURLGenerationListeners(portletApp))
             {
-                if (urlProvider.isActionURL())
+                if (PortletURLProvider.TYPE.ACTION == urlProvider.getType())
                 {
                     listener.filterActionURL(this);
                 }
-                else if (urlProvider.isResourceURL())
+                else if (PortletURLProvider.TYPE.RESOURCE == urlProvider.getType())
                 {
                     listener.filterResourceURL(this);
                 }
@@ -229,31 +241,28 @@
     public void setParameter(String name, String value)
     {
         ArgumentUtility.validateNotEmpty("name", name);
-        Map<String, String[]> parameters = urlProvider.getRenderParameters();
-        if (value == null )            
+        ArgumentUtility.validateNotNull("value", value);
+        String[] values = new String[]{value};
+        urlProvider.getRenderParameters().put(name, values);
+        if (renderURL && isPublicRenderParameter(name))
         {
-            parameters.remove(name);
-        }
-        else
-        {
-            parameters.put(name, new String[]{value});
-            urlProvider.getRemovedPublicRenderParameters().remove(name);
+            urlProvider.getPublicRenderParameters().put(name, values);
         }
     }
 
     public void setParameter(String name, String[] values)
     {
         ArgumentUtility.validateNotEmpty("name", name);
-        Map<String, String[]> parameters = urlProvider.getRenderParameters();
+        ArgumentUtility.validateNotNull("values", values);
         values = cloneParameterValues(values);
         if (values == null )            
         {
-            parameters.remove(name);
+            throw new IllegalStateException("Illegal Argument: values array is empty or contains only null values");
         }
-        else
+        urlProvider.getRenderParameters().put(name, values);
+        if (renderURL && isPublicRenderParameter(name))
         {
-            parameters.put(name, values);
-            urlProvider.getRemovedPublicRenderParameters().remove(name);
+            urlProvider.getPublicRenderParameters().put(name, values);
         }
     }
 
@@ -262,30 +271,53 @@
         ArgumentUtility.validateNotNull("parameters", parameters);
         
         // validate map first
+        boolean emptyValuesArray;
         for (Map.Entry<? extends Object, ? extends Object> entry : parameters.entrySet())
         {
             if (entry.getKey() == null || entry.getValue() == null)
             {
-                throw new IllegalArgumentException("RenderParameters contains a null key or value entry");
+                throw new IllegalArgumentException("parameters map contains a null key or value entry");
             }
             if (!(entry.getKey() instanceof String))
             {
-                throw new IllegalArgumentException("RenderParameters contains a key which is not of type String");
+                throw new IllegalArgumentException("parameters map contains a key which is not of type String");
             }
             if (!(entry.getValue() instanceof String[]))
             {
-                throw new IllegalArgumentException("RenderParameters contains a value which is not of type String[]");
+                throw new IllegalArgumentException("parameters map contains a value which is not of type String[]");
+            }
+            emptyValuesArray = true;
+            for (String s : (String[])entry.getValue())
+            {
+                if (s != null)
+                {
+                    emptyValuesArray = false;
+                    break;
+                }
+            }
+            if (emptyValuesArray)
+            {
+                throw new IllegalStateException("parameters map contains a values array which is empty or contains only null values");
+            }
+        }
+        urlProvider.getRenderParameters().clear();
+        if (renderURL)
+        {
+            for (Iterator<Map.Entry<String,String[]>> iter = urlProvider.getPublicRenderParameters().entrySet().iterator(); iter.hasNext();)
+            {
+                if (iter.next().getValue() != null)
+                {
+                    iter.remove();
+                }
             }
         }
-        Map<String, String[]> map = urlProvider.getRenderParameters();
-        map.clear();
         for (Map.Entry<String,String[]> entry : parameters.entrySet())
         {
             String[] values = cloneParameterValues(entry.getValue());
-            if (values != null)
+            urlProvider.getRenderParameters().put(entry.getKey(), values);
+            if (renderURL && isPublicRenderParameter(entry.getKey()))
             {
-                map.put(entry.getKey(), values);
-                urlProvider.getRemovedPublicRenderParameters().remove(entry.getKey());
+                urlProvider.getPublicRenderParameters().put(entry.getKey(), values);
             }
         }
     }
@@ -334,7 +366,7 @@
     public String toString()
     {
         filterURL();
-        return urlProvider.toString();
+        return urlProvider.toURL(false);
     }
 
     // PortletURL impl ------------------------------------------------------------    
@@ -378,16 +410,18 @@
     public void removePublicRenderParameter(String name)
     {
         ArgumentUtility.validateNotEmpty("name", name);
-        urlProvider.getRemovedPublicRenderParameters().add(name);
-        urlProvider.getRenderParameters().remove(name);
+        if (isPublicRenderParameter(name))
+        {
+            urlProvider.getPublicRenderParameters().put(name, null);
+            urlProvider.getRenderParameters().remove(name);
+        }
     }
 
     // ResourceURL impl ------------------------------------------------------------    
     
     public String getCacheability()
     {
-        String cacheability = urlProvider.getCacheability();
-        return cacheability == null ? this.cacheLevel : cacheability;
+        return urlProvider.getCacheability();
     }
 
     public void setCacheability(String cacheLevel)
@@ -399,21 +433,21 @@
         }
         else if (PORTLET.equals(cacheLevel))
         {
-            if (FULL.equals(cacheLevel))
+            if (FULL.equals(this.cacheLevel))
             {
-                throw new IllegalStateException("Current Cachelevel is FULL: URLs with cacheability PORTLET not allowed");
+                throw new IllegalStateException("Current request cacheablility is FULL: URLs with cacheability PORTLET not allowed");
             }
             
         }
         else if (PAGE.equals(cacheLevel))
         {
-            if (FULL.equals(cacheLevel))
+            if (FULL.equals(this.cacheLevel))
             {
-                throw new IllegalStateException("Current Cachelevel is FULL: URLs with cacheability PORTLET not allowed");
+                throw new IllegalStateException("Current request cacheablility is FULL: URLs with cacheability PORTLET not allowed");
             }
-            else if (PORTLET.equals(cacheLevel))
+            else if (PORTLET.equals(this.cacheLevel))
             {
-                throw new IllegalStateException("Current Cachelevel is PORTLET: URLs with cacheability PAGE not allowed");
+                throw new IllegalStateException("Current request cacheablility is PORTLET: URLs with cacheability PAGE not allowed");
             }
         }
         else

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceResponseImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/ResourceResponseImpl.java Thu Mar 12 14:59:12 2009
@@ -23,6 +23,7 @@
 import javax.portlet.ResourceURL;
 
 import org.apache.pluto.container.PortletResourceResponseContext;
+import org.apache.pluto.container.PortletURLProvider;
 
 public class ResourceResponseImpl extends MimeResponseImpl implements ResourceResponse
 {
@@ -33,23 +34,30 @@
     {
         super(responseContext);
         this.responseContext = responseContext;
-        this.requestCacheLevel = requestCachelevel;
+        this.requestCacheLevel = requestCachelevel == null ? ResourceURL.PAGE : requestCacheLevel;
     }
 	
     public PortletURL createActionURL()
     {
-        return new PortletURLImpl(responseContext, true, false, requestCacheLevel);
+        if (ResourceURL.PAGE.equals(requestCacheLevel))
+        {
+            return new PortletURLImpl(responseContext, PortletURLProvider.TYPE.ACTION);
+        }
+        throw new IllegalStateException("Not allowed to create an ActionURL with current request cacheability level "+requestCacheLevel);
     }
     
     public PortletURL createRenderURL()
     {
-        return new PortletURLImpl(responseContext, false, false, requestCacheLevel);
+        if (ResourceURL.PAGE.equals(requestCacheLevel))
+        {
+            return new PortletURLImpl(responseContext, PortletURLProvider.TYPE.RENDER);
+        }
+        throw new IllegalStateException("Not allowed to create a RenderURL with current request cacheability level "+requestCacheLevel);
     }
 
-
     public ResourceURL createResourceURL()
     {
-        return new PortletURLImpl(responseContext, false, true, requestCacheLevel);
+        return new PortletURLImpl(responseContext, requestCacheLevel);
     }
     
 	public void setCharacterEncoding(String charset)

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/impl/StateAwareResponseImpl.java Thu Mar 12 14:59:12 2009
@@ -19,6 +19,8 @@
 import java.io.Serializable;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import javax.portlet.PortletMode;
@@ -47,12 +49,18 @@
 		this.responseContext = responseContext;
 	}
 	
+    private boolean isPublicRenderParameter(String name)
+    {
+        List<String> publicRenderParameterNames = responseContext.getPortletWindow().getPortletEntity().getPortletDefinition().getSupportedPublicRenderParameters();
+        return publicRenderParameterNames.isEmpty() ? false : publicRenderParameterNames.contains(name);
+    }
+        
 	private static String[] cloneParameterValues(String[] values)
 	{
 	    int count = 0;
 	    for (String s : values)
 	    {
-	        if (!(s == null || s.length() == 0))
+	        if (s != null)
 	        {
 	            count++;
 	        }
@@ -67,7 +75,7 @@
 	        count = 0;
 	        for (String s : values)
 	        {
-	            if (!(s == null || s.length() == 0))
+	            if (s != null)
 	            {
 	                copy[count++] = s;
 	            }
@@ -118,8 +126,11 @@
     {
         ArgumentUtility.validateNotEmpty("name", name);
         checkSetStateChanged();
-        responseContext.getRemovedPublicRenderParameters().add(name);
-        responseContext.getRenderParameters().remove(name);
+        if (isPublicRenderParameter(name))
+        {
+            responseContext.getPublicRenderParameters().put(name, null);
+            responseContext.getRenderParameters().remove(name);
+        }
     }
 
 	public void setEvent(QName qname, Serializable value)
@@ -170,31 +181,52 @@
         ArgumentUtility.validateNotNull("parameters", parameters);
         
         // validate map first
+        boolean emptyValuesArray;
         for (Map.Entry<? extends Object, ? extends Object> entry : parameters.entrySet())
         {
             if (entry.getKey() == null || entry.getValue() == null)
             {
-                throw new IllegalArgumentException("RenderParameters contains a null key or value entry");
+                throw new IllegalArgumentException("parameters map contains a null key or value entry");
             }
             if (!(entry.getKey() instanceof String))
             {
-                throw new IllegalArgumentException("RenderParameters contains a key which is not of type String");
+                throw new IllegalArgumentException("parameters map contains a key which is not of type String");
             }
             if (!(entry.getValue() instanceof String[]))
             {
-                throw new IllegalArgumentException("RenderParameters contains a value which is not of type String[]");
+                throw new IllegalArgumentException("parameters map contains a value which is not of type String[]");
+            }
+            emptyValuesArray = true;
+            for (String s : (String[])entry.getValue())
+            {
+                if (s != null)
+                {
+                    emptyValuesArray = false;
+                    break;
+                }
+            }
+            if (emptyValuesArray)
+            {
+                throw new IllegalStateException("parameters map contains a values array which is empty or contains only null values");
             }
         }
         checkSetStateChanged();
-        Map<String, String[]> map = responseContext.getRenderParameters();
-        map.clear();
+        
+        responseContext.getRenderParameters().clear();
+        for (Iterator<Map.Entry<String,String[]>> iter = responseContext.getPublicRenderParameters().entrySet().iterator(); iter.hasNext();)
+        {
+            if (iter.next().getValue() != null)
+            {
+                iter.remove();
+            }
+        }
         for (Map.Entry<String,String[]> entry : parameters.entrySet())
         {
             String[] values = cloneParameterValues(entry.getValue());
-            if (values != null)
+            responseContext.getRenderParameters().put(entry.getKey(), values);
+            if (isPublicRenderParameter(entry.getKey()))
             {
-                map.put(entry.getKey(), values);
-                responseContext.getRemovedPublicRenderParameters().remove(entry.getKey());
+                responseContext.getPublicRenderParameters().put(entry.getKey(), values);
             }
         }
     }
@@ -202,16 +234,13 @@
     public void setRenderParameter(String key, String value)
     {
         ArgumentUtility.validateNotEmpty("key", key);
-        
+        ArgumentUtility.validateNotNull("value", value);
         checkSetStateChanged();
-        if (value == null || value.length() == 0)
+        String[] values = new String[]{value};
+        responseContext.getRenderParameters().put(key, values);
+        if (isPublicRenderParameter(key))
         {
-            responseContext.getRenderParameters().remove(key);
-        }
-        else
-        {
-            responseContext.getRenderParameters().put(key, new String[]{value});
-            responseContext.getRemovedPublicRenderParameters().remove(key);
+            responseContext.getPublicRenderParameters().put(key, values);
         }
     }
     
@@ -219,16 +248,16 @@
     {
         ArgumentUtility.validateNotEmpty("key", key);
         ArgumentUtility.validateNotNull("values", values);
-        String[] copy = cloneParameterValues(values);
-        checkSetStateChanged();
-        if (copy == null)
+        values = cloneParameterValues(values);
+        if (values == null )            
         {
-            responseContext.getRenderParameters().remove(key);
+            throw new IllegalStateException("Illegal Argument: values array is empty or contains only null values");
         }
-        else
+        checkSetStateChanged();
+        responseContext.getRenderParameters().put(key, values);
+        if (isPublicRenderParameter(key))
         {
-            responseContext.getRenderParameters().put(key, copy);
-            responseContext.getRemovedPublicRenderParameters().remove(key);
+            responseContext.getPublicRenderParameters().put(key, values);
         }
     }
 }

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/ClasspathScanner.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/ClasspathScanner.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/ClasspathScanner.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/ClasspathScanner.java Thu Mar 12 14:59:12 2009
@@ -40,8 +40,8 @@
      * @return
      * @throws IOException
      */
-    public static List scan(String path) throws IOException {
-        List list = scan(path, ClasspathScanner.class.getClassLoader());
+    public static List<URL> scan(String path) throws IOException {
+        List<URL> list = scan(path, ClasspathScanner.class.getClassLoader());
         list.addAll(scan(path, Thread.currentThread().getContextClassLoader()));
         list.add(ClasspathScanner.class.getResource(path));
 
@@ -61,13 +61,13 @@
      * @return
      * @throws IOException
      */
-    public static List scan(String path, ClassLoader loader) throws IOException {
-        ArrayList list = new ArrayList();
+    public static List<URL> scan(String path, ClassLoader loader) throws IOException {
+        ArrayList<URL> list = new ArrayList<URL>();
         if (loader == null) {
             return list;
         }
 
-        Enumeration enumeration = loader.getResources(path);
+        Enumeration<URL> enumeration = loader.getResources(path);
         while (enumeration.hasMoreElements()) {
             list.add(enumeration.nextElement());
         }
@@ -86,6 +86,7 @@
      * @return list of classes
      * @throws java.io.IOException if an error occurs during classpath scanning.
      */
+    @SuppressWarnings("unchecked")
     public static List findConfiguredImplementations(Class implemented)
         throws IOException {
         List classes = new ArrayList();

Modified: portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/StringManager.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/StringManager.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/StringManager.java (original)
+++ portals/pluto/trunk/pluto-container/src/main/java/org/apache/pluto/container/util/StringManager.java Thu Mar 12 14:59:12 2009
@@ -102,7 +102,7 @@
      * @param key The resource name
      */
     public String getString(String key) {
-        return MessageFormat.format(getStringInternal(key), null);
+        return MessageFormat.format(getStringInternal(key), (Object[])null);
     }
 
 
@@ -156,8 +156,7 @@
             for (int i = 0; i < args.length; i++) {
                 if (args[i] == null) {
                     if (nonNullArgs == args) {
-                        nonNullArgs =
-                        (Object[]) args.clone();
+                        nonNullArgs = args.clone();
                     }
                     nonNullArgs[i] = "null";
                 }
@@ -234,7 +233,7 @@
     // STATIC SUPPORT METHODS
     // --------------------------------------------------------------
 
-    private static Hashtable managers = new Hashtable();
+    private static Hashtable<String, StringManager> managers = new Hashtable<String, StringManager>();
 
     /**
      * Get the StringManager for a particular package. If a manager for a
@@ -244,7 +243,7 @@
      */
 
     public synchronized static StringManager getManager(String packageName) {
-        StringManager mgr = (StringManager) managers.get(packageName);
+        StringManager mgr = managers.get(packageName);
 
         if (mgr == null) {
             mgr = new StringManager(packageName);

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletMimeResponseContextImpl.java Thu Mar 12 14:59:12 2009
@@ -29,6 +29,7 @@
 import org.apache.pluto.container.PortletMimeResponseContext;
 import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.PortletWindow;
+import org.apache.pluto.container.PortletURLProvider.TYPE;
 
 /**
  * @version $Id$
@@ -155,9 +156,9 @@
     }
 
     /* (non-Javadoc)
-     * @see org.apache.pluto.container.PortletMimeResponseContext#getPortletURLProvider()
+     * @see org.apache.pluto.container.PortletMimeResponseContext#getPortletURLProvider(org.apache.pluto.container.PortletURLProvider.TYPE)
      */
-    public PortletURLProvider getPortletURLProvider()
+    public PortletURLProvider getPortletURLProvider(TYPE type)
     {
         // TODO Auto-generated method stub
         return null;

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletResourceResponseContextImpl.java Thu Mar 12 14:59:12 2009
@@ -36,7 +36,7 @@
     
     public PortletResourceResponseContextImpl(PortletContainer container, HttpServletRequest request,
                                               HttpServletResponse response, PortletWindow window)
-    {
+    {        
         super(container, request, response, window);
     }
 

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletStateAwareResponseContextImpl.java Thu Mar 12 14:59:12 2009
@@ -64,9 +64,9 @@
     }
 
     /* (non-Javadoc)
-     * @see org.apache.pluto.spi.optional.PortletStateAwareResponseContext#getRemovedPublicRenderParameters()
+     * @see org.apache.pluto.container.PortletStateAwareResponseContext#getPublicRenderParameters()
      */
-    public Set<String> getRemovedPublicRenderParameters()
+    public Map<String, String[]> getPublicRenderParameters()
     {
         // TODO Auto-generated method stub
         return null;

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/container/PortletURLProviderImpl.java Thu Mar 12 14:59:12 2009
@@ -16,21 +16,17 @@
  */
 package org.apache.pluto.driver.services.container;
 
-import java.util.ArrayList;
+import java.io.Writer;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.StringTokenizer;
 
 import javax.portlet.PortletMode;
 import javax.portlet.PortletSecurityException;
 import javax.portlet.WindowState;
-import javax.servlet.http.HttpServletRequest;
 
 import org.apache.pluto.container.PortletURLProvider;
 import org.apache.pluto.container.PortletWindow;
-import org.apache.pluto.driver.core.PortalRequestContext;
 import org.apache.pluto.driver.url.PortalURL;
 import org.apache.pluto.driver.url.PortalURLParameter;
 
@@ -39,209 +35,176 @@
  */
 public class PortletURLProviderImpl implements PortletURLProvider {
 
-    private PortalURL url;
-    private String window;
-    /** The parameters including parameters appended to the dispatching URI. */
-    protected Map<String, String[]> parameters = null;
-
-    public PortletURLProviderImpl(HttpServletRequest request,
-                                  PortletWindow portletWindow) {
-        PortalRequestContext ctx = PortalRequestContext.getContext(request);
-        url = ctx.createPortalURL();
+    private final PortalURL url;
+    private final TYPE type;
+    private final String window;
+    private PortletMode portletMode;
+    private WindowState windowState;
+    private String cacheLevel;
+    private String resourceID;
+    private Map<String, String[]> renderParameters;
+    private Map<String, String[]> publicRenderParameters;
+    private Map<String, List<String>> properties;
 
+    public PortletURLProviderImpl(PortalURL url, TYPE type, PortletWindow portletWindow)
+    {
+        this.url = url;
+        this.type = type;
         this.window = portletWindow.getId().getStringId();
     }
-
-    public void setPortletMode(PortletMode mode) {
-        url.setPortletMode(window, mode);
-    }
-
-    public void setWindowState(WindowState state) {
-        url.setWindowState(window, state);
-    }
-
-    public void setResourceServing(boolean resourceServing) {
-        if (resourceServing) {
+    
+    public PortalURL apply()
+    {
+        PortalURL url = this.url.clone();
+        if (PortletURLProvider.TYPE.ACTION == type)
+        {
+            url.setActionWindow(window);
+            url.setResourceWindow(null);
+            url.clearParameters(window);
+        }
+        else if (PortletURLProvider.TYPE.RESOURCE == type)
+        {
+            url.setActionWindow(null);
             url.setResourceWindow(window);
-        } else {
+        }
+        else
+        {
             url.setResourceWindow(null);
+            url.setActionWindow(null);
+            url.clearParameters(window);
         }
+        url.setPortletMode(window, portletMode);
+        url.setWindowState(window, windowState);
+        if (renderParameters != null)
+        {
+            for (Map.Entry<String,String[]> entry : renderParameters.entrySet())
+            {
+                if (PortletURLProvider.TYPE.RESOURCE == type)
+                {
+                    url.getPrivateParameters().put(entry.getKey(), entry.getValue().clone());
+                }
+                else if (publicRenderParameters != null && !publicRenderParameters.containsKey(entry.getKey()))
+                {
+                    url.addParameter(new PortalURLParameter(window, entry.getKey(), entry.getValue()));
+                }
+            }
+        }
+        if (publicRenderParameters != null)
+        {
+            for (Map.Entry<String,String[]> entry : publicRenderParameters.entrySet())
+            {
+                url.addParameter(new PortalURLParameter(window, entry.getKey(), entry.getValue() != null ? entry.getValue() : new String[]{null}));
+            }
+        }
+        url.setResourceID(resourceID);
+        return url;
     }
-
-    public boolean isResourceServing(){
-    	return (url.getResourceWindow() != null);
+    
+    public TYPE getType()
+    {
+        return type;
+    }
+    
+    public void setPortletMode(PortletMode mode)
+    {
+        this.portletMode = mode;
+    }
+    
+    public PortletMode getPortletMode()
+    {
+        return portletMode;
     }
 
-    public void setAction(boolean action) {
-        if (action) {
-            url.setActionWindow(window);
-        } else {
-            url.setActionWindow(null);
-        }
+    public void setWindowState(WindowState state)
+    {
+        this.windowState = state;
     }
 
-    public void setSecure() throws PortletSecurityException {
-        throw new PortletSecurityException("Secure URLs (via PortletURLProvider.setSecure()) is not supported.");
+    public WindowState getWindowState()
+    {
+        return windowState;
     }
 
-    public boolean isSecureSupported() {
+    public void setSecure(boolean secure) throws PortletSecurityException {
+        // ignore: not supported
+    }
+    
+    public boolean isSecure()
+    {
         return false;
     }
-
-    public void clearParameters() {
-        url.clearParameters(window);
+    
+    public Map<String,String[]> getRenderParameters()
+    {
+        if (renderParameters == null)
+        {
+            renderParameters = new HashMap<String,String[]>();
+        }
+        return renderParameters;
     }
-
-
-    /**
-     * @see org.apache.pluto.container.PortletURLProvider#setParameters(java.util.Map)
-     */
-    public void setParameters(Map<String, String[]> parameters) {
-        Iterator<Map.Entry<String, String[]>> it = parameters.entrySet().iterator();
-        while (it.hasNext()) {
-            Map.Entry<String, String[]> entry = it.next();
-            PortalURLParameter param = new PortalURLParameter(
-            		window,
-            		entry.getKey(),
-            		entry.getValue());
-            url.addParameter(param);
+    
+    public Map<String,String[]> getPublicRenderParameters()
+    {
+        if (publicRenderParameters == null)
+        {
+            publicRenderParameters = new HashMap<String,String[]>();
         }
+        return publicRenderParameters;
     }
-
-    public String[] getPrivateRenderParameters(String name){
-    	String[] values = null;
-    	for (Iterator<PortalURLParameter> it=url.getParameters().iterator();it.hasNext();){
-    		PortalURLParameter param = it.next();
-    		if (param.getName().equals(name))
-    			values = param.getValues();
-    	}
-    	return values;
+    
+    public String getCacheability()
+    {
+        return cacheLevel;
     }
 
-    public String[] getPublicRenderParameters(String name){
-    	Map publicRenderParaMap = url.getPublicParameters();
-    	String[] values = null;
-    	for (Iterator it=publicRenderParaMap.keySet().iterator();it.hasNext();){
-    		String tmp = (String) it.next();
-    		if (tmp.equals(name)){
-    			values = (String[])publicRenderParaMap.get(tmp);
-    		}
-    	}
-    	return values;
+    public void setCacheability(String cacheLevel)
+    {
+        this.cacheLevel = cacheLevel;
     }
 
-    public void setPublicRenderParameters(Map parameters) {
-		url.addPublicRenderParametersNew(parameters);
-	}
-
-    public String toString() {
-        return url.toString();
+    public String getResourceID()
+    {
+        return resourceID;
     }
 
-	public void savePortalURL(HttpServletRequest request) {
-        PortalRequestContext ctx = PortalRequestContext.getContext(request);
-		ctx.setPortalURL(url);
-	}
-
-    public Map<String, String[]> getRenderParameters()
+    public void setResourceID(String resourceID)
     {
-        return this.parameters;
+        this.resourceID = resourceID;
     }
 
-    public Map<String, String[]> parseRenderParameters(Map<String, String[]> parentMap, String queryString)
+    /* (non-Javadoc)
+     * @see org.apache.pluto.container.PortletURLProvider#toURL(boolean)
+     */
+    public String toURL(boolean absolute)
     {
-        if (parentMap == null)
-        {
-            parameters = null;
-        }
-        else
-        {
-            // Copy all the original render parameters.
-            parameters = new HashMap<String, String[]>(parentMap);
-            if (queryString != null && queryString.trim().length() > 0)
-            {
-                // Merge the appended parameters to the render parameter map.
-                // The original render parameters should not be overwritten.
-                mergeQueryString(parameters, queryString);
-            }
-        }
-        return parameters;
+        // TODO Auto-generated method stub
+        return null;
     }
 
-    /**
-     * Parses the appended query string and merges the appended parameters to
-     * the original parameters. Query parameters are name-value pairs separated
-     * by the '<code>&amp;</code>' character.
-     *
-     * @param parameters
-     *            the original parameters map.
-     * @param queryString
-     *            the appended query string.
+    /* (non-Javadoc)
+     * @see org.apache.pluto.container.PortletURLProvider#write(java.io.Writer, boolean)
      */
-    private void mergeQueryString(Map parameters, String queryString)
+    public void write(Writer out, boolean escapeXML)
     {
-
-        // Create the appended parameters map:
-        // key is the parameter name as a string,
-        // value is a List of parameter values (List of String).
-        Map appendedParameters = new HashMap();
-
-        StringTokenizer st = new StringTokenizer(queryString, "&", false);
-        while (st.hasMoreTokens())
-        {
-            String token = st.nextToken();
-            int equalIndex = token.indexOf("=");
-            if (equalIndex > 0)
-            {
-                String key = token.substring(0, equalIndex);
-                String value = null;
-                if (equalIndex < token.length() - 1)
-                {
-                    value = token.substring(equalIndex + 1);
-                }
-                else
-                {
-                    value = "";
-                }
-                List values = (List) appendedParameters.get(key);
-                if (values == null)
-                {
-                    values = new ArrayList();
-                }
-                values.add(value);
-                appendedParameters.put(key, values);
-            }
-        }
-
-        // Merge the appended parameters and the original parameters.
-        for (Iterator it = appendedParameters.keySet().iterator(); it.hasNext();)
-        {
-            String key = (String) it.next();
-            List values = (List) appendedParameters.get(key);
-            // If the parameter name (key) exists, merge parameter values.
-            if (parameters.containsKey(key))
-            {
-                String[] originalValues = (String[]) parameters.get(key);
-                if (originalValues != null)
-                {
-                    for (int i = 0; i < originalValues.length; i++)
-                    {
-                        values.add(originalValues[i]);
-                    }
-                }
-            }
-            parameters.put(key, values.toArray(new String[values.size()]));
-        }
+        // TODO Auto-generated method stub
+        
     }
 
-    public void setProperties(Map<String, List<String>> properties)
+    /* (non-Javadoc)
+     * @see org.apache.pluto.container.PortletURLProvider#write(java.io.Writer)
+     */
+    public void write(Writer out)
     {
-        // No vendor specific properties handling
+        // TODO Auto-generated method stub
+        
     }
 
     public Map<String, List<String>> getProperties()
     {
-        // No vendor specific properties handling
-        return null;
+        if (properties == null)
+        {
+            properties = new HashMap<String, List<String>>();
+        }
+        return properties;
     }
 }

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java Thu Mar 12 14:59:12 2009
@@ -53,7 +53,10 @@
     private static final String PORTLET_ID = "pd";
     private static final String ACTION = "ac";
     private static final String RESOURCE = "rs";
+    private static final String RESOURCE_ID = "ri";
+    private static final String CACHE_LEVEL = "cl";
     private static final String RENDER_PARAM = "rp";
+    private static final String PRIVATE_PARAM = "pp";
     private static final String PUBLIC_RENDER_PARAM = "sp";
     private static final String WINDOW_STATE = "ws";
     private static final String PORTLET_MODE = "pm";
@@ -110,8 +113,9 @@
         String contextPath = request.getContextPath();
         String servletName = request.getServletPath();
 
+        String urlBase = request.getScheme()+"://" + request.getServerName() + ":" + request.getServerPort();
         // Construct portal URL using info retrieved from servlet request.
-        PortalURL portalURL =  new RelativePortalURLImpl(contextPath, servletName, this);
+        PortalURL portalURL =  new RelativePortalURLImpl(urlBase, contextPath, servletName, this);
 
         // Support added for filter.  Should we seperate into a different impl?
         String pathInfo = request.getPathInfo();
@@ -120,7 +124,7 @@
                 int idx = servletName.indexOf(".jsp")+".jsp".length();
                 pathInfo = servletName.substring(idx);
                 servletName = servletName.substring(0, idx);
-                portalURL = new RelativePortalURLImpl(contextPath, servletName, this);
+                portalURL = new RelativePortalURLImpl(urlBase, contextPath, servletName, this);
             } else {
                 return portalURL;
             }
@@ -150,6 +154,14 @@
         	else if (token.startsWith(PREFIX + ACTION)) {
         		portalURL.setActionWindow(decodeControlParameter(token)[0]);
         	}
+            // Cacheability definition: portalURL.setCacheability().
+            else if (token.startsWith(PREFIX + CACHE_LEVEL)) {
+                portalURL.setCacheability(decodeControlParameter(token)[0]);
+            }
+            // ResourceID definition: portalURL.setResourceID().
+            else if (token.startsWith(PREFIX + RESOURCE_ID)) {
+                portalURL.setResourceID(decodeControlParameter(token)[0]);
+            }
         	// Window state definition: portalURL.setWindowState().
         	else if (token.startsWith(PREFIX + WINDOW_STATE)) {
         		String[] decoded = decodeControlParameter(token);
@@ -172,7 +184,19 @@
 
 
         	}
-        	else{ // besser if PREFIX + PUBLIC_PARAM
+            else if (token.startsWith(PREFIX + PRIVATE_PARAM)){
+                String value = null;
+                if (st.hasMoreTokens()) {
+                    value = st.nextToken();
+                }
+                PortalURLParameter param = decodePublicParameter(token, value);
+                if( param != null )
+                {
+                    //set private (Resource) parameter in portalURL
+                    portalURL.getPrivateParameters().put(param.getName(), param.getValues());
+                }
+            }
+        	else if (token.startsWith(PREFIX + PUBLIC_RENDER_PARAM)){
         		String value = null;
         		if (st.hasMoreTokens()) {
         			value = st.nextToken();
@@ -183,8 +207,6 @@
         			//set public parameter in portalURL
     	    		portalURL.addPublicParameterCurrent(param.getName(), param.getValues());
         		}
-
-
         	}
         }
         if (renderPath.length() > 0) {
@@ -225,6 +247,20 @@
         	buffer.append(PREFIX).append(ACTION)
         			.append(encodeCharacters(portalURL.getActionWindow()));
         }
+        
+        if (portalURL.getResourceWindow() != null)
+        {
+            if (portalURL.getCacheability() != null)
+            {
+                buffer.append("/");
+                buffer.append(PREFIX).append(CACHE_LEVEL).append(encodeCharacters(portalURL.getCacheability()));
+            }
+            if (portalURL.getResourceID() != null)
+            {
+                buffer.append("/");
+                buffer.append(PREFIX).append(RESOURCE_ID).append(encodeCharacters(portalURL.getResourceID()));
+            }
+        }
 
         // Append portlet mode definitions.
         for (Iterator it = portalURL.getPortletModes().entrySet().iterator();
@@ -284,7 +320,22 @@
 
         encode(buffer);
 
-
+        if (portalURL.getResourceWindow() != null)
+        {
+            Map<String, String[]> privateParamList = portalURL.getPrivateParameters();
+            if (privateParamList!=null){
+                for (Iterator iter = privateParamList.keySet().iterator();iter.hasNext();){
+                    String paramname = (String)iter.next();
+                    String[] tmp = privateParamList.get(paramname);
+                    String valueString = encodeMultiValues(tmp);
+                    if (valueString.length()>0){
+                        buffer.append("/").append(encodePublicParamname(PRIVATE_PARAM, paramname));
+                        buffer.append("/").append(valueString);
+                    }
+                }
+            }
+        }
+        
         Map<String, String[]> publicParamList = portalURL.getPublicParameters();
         if (publicParamList!=null){
 	        for (Iterator iter = publicParamList.keySet().iterator();iter.hasNext();){

Modified: portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/RelativePortalURLImpl.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/RelativePortalURLImpl.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/RelativePortalURLImpl.java (original)
+++ portals/pluto/trunk/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/RelativePortalURLImpl.java Thu Mar 12 14:59:12 2009
@@ -43,15 +43,19 @@
 
     private static final Log LOG = LogFactory.getLog(RelativePortalURLImpl.class);
 
+    private String urlBase;
     private String servletPath;
     private String renderPath;
     private String actionWindow;
     private String resourceWindow;
+    private String cacheLevel;
+    private String resourceID;
 
     private Map<String, String[]> publicParameterCurrent = new HashMap<String, String[]>();
 
     private Map<String, String[]> publicParameterNew = new HashMap<String, String[]>();
-
+    private Map<String, String[]> privateParameters = new HashMap<String, String[]>();
+    
     /**
      * PortalURLParser used to construct the string
      * representation of this portal url.
@@ -68,11 +72,13 @@
 
     /**
      * Constructs a PortalURLImpl instance using customized port.
+     * @param urlBase      the absolute (protocol://domain:port) request url base
      * @param contextPath  the servlet context path.
      * @param servletName  the servlet name.
      * @param urlParser    the {@link PortalURLParser} used to construct a string representation of the url.
      */
-    public RelativePortalURLImpl(String contextPath, String servletName, PortalURLParser urlParser) {
+    public RelativePortalURLImpl(String urlBase, String contextPath, String servletName, PortalURLParser urlParser) {
+        this.urlBase = urlBase;
     	StringBuffer buffer = new StringBuffer();
     	buffer.append(contextPath);
     	buffer.append(servletName);
@@ -171,16 +177,51 @@
             }
         }
     }
+    
+    public void setCacheability(String cacheLevel)
+    {
+        this.cacheLevel = cacheLevel;
+    }
+    
+    public String getCacheability()
+    {
+        return cacheLevel;
+    }
+    
+    public void setResourceID(String resourceID)
+    {
+        this.resourceID = resourceID;
+    }
+    
+    public String getResourceID()
+    {
+        return resourceID;
+    }
 
     /**
      * Converts to a string representing the portal URL.
+     * @deprecated use toURL(boolean absolute) instead
      * @return a string representing the portal URL.
      * @see PortalURLParserImpl#toString(org.apache.pluto.driver.url.PortalURL)
      */
     public String toString() {
-        return urlParser.toString(this);
+        return toURL(false);
+    }
+    
+    /**
+     * Converts to a string representing the portal URL.
+     * @return a string representing the portal URL.
+     * @see PortalURLParserImpl#toString(org.apache.pluto.driver.url.PortalURL)
+     */
+    public String toURL(boolean absolute)
+    {
+        String result = urlParser.toString(this);
+        if (absolute)
+        {
+            return urlBase + result;
+        }
+        return result;
     }
-
 
     /**
      * Returns the server URI (protocol, name, port).
@@ -204,12 +245,14 @@
      * Clone a copy of itself.
      * @return a copy of itself.
      */
-    public Object clone() {
+    public synchronized PortalURL clone() {
     	RelativePortalURLImpl portalURL = new RelativePortalURLImpl();
     	portalURL.servletPath = this.servletPath;
     	portalURL.parameters = new HashMap<String, PortalURLParameter>(parameters);
     	portalURL.portletModes = new HashMap<String, PortletMode>(portletModes);
     	portalURL.windowStates = new HashMap<String, WindowState>(windowStates);
+    	portalURL.cacheLevel = cacheLevel;
+    	portalURL.resourceID = resourceID;
     	portalURL.renderPath = renderPath;
     	portalURL.actionWindow = actionWindow;
         portalURL.urlParser = urlParser;
@@ -226,9 +269,7 @@
 				publicParameterNew.remove(key);
 			}
 			String[] values = parameters.get(key);
-			if (values[0]!= null){
-				publicParameterNew.put(key, values);
-			}
+            publicParameterNew.put(key, values);
 		}
     }
 
@@ -273,6 +314,16 @@
 		}
 		return tmp;
     }
+    
+    public Map<String, String[]> getNewPublicParameters()
+    {
+        return publicParameterNew;
+    }
+    
+    public Map<String, String[]> getPrivateParameters()
+    {
+        return privateParameters;
+    }
 
 
 	public PageConfig getPageConfig(ServletContext servletContext) {
@@ -292,5 +343,33 @@
 		this.resourceWindow = resourceWindow;
 	}
 
-
+	public synchronized void merge(PortalURL url, String windowId)
+	{
+        actionWindow = url.getActionWindow();
+        resourceWindow = url.getResourceWindow();
+        setPortletMode(windowId, url.getPortletMode(windowId));
+        setWindowState(windowId, url.getWindowState(windowId));
+        setCacheability(url.getCacheability());
+        setResourceID(url.getResourceID());
+        clearParameters(windowId);
+        for (PortalURLParameter param : url.getParameters())
+        {
+            if (windowId.equals(param.getWindowId()))
+            {
+                addParameter(new PortalURLParameter(param.getWindowId(), param.getName(), param.getValues()));
+            }
+        }
+        Map<String, String[]> newPublicParameters = url.getNewPublicParameters();
+        for (Map.Entry<String, String[]> entry : newPublicParameters.entrySet())
+        {
+            if (entry.getValue()[0] == null)
+            {
+                publicParameterCurrent.remove(entry.getKey());
+            }
+            else
+            {
+                publicParameterCurrent.put(entry.getKey(), entry.getValue());
+            }
+        }
+	}
 }

Modified: portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/core/PortalRequestContext.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/core/PortalRequestContext.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/core/PortalRequestContext.java (original)
+++ portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/core/PortalRequestContext.java Thu Mar 12 14:59:12 2009
@@ -110,7 +110,7 @@
      * Returns the requested portal URL.
      * @return the requested portal URL.
      */
-    public PortalURL getRequestedPortalURL() {
+    public synchronized PortalURL getRequestedPortalURL() {
         if(requestedPortalURL == null) {
             DriverConfiguration config = (DriverConfiguration)
                 servletContext.getAttribute(AttributeKeys.DRIVER_CONFIG);
@@ -130,8 +130,15 @@
         return (PortalURL)getRequestedPortalURL().clone();
     }
 
-    public void setPortalURL(PortalURL portalURL){
-    	requestedPortalURL = portalURL;
+    public synchronized void setPortalURL(PortalURL portalURL, String windowId){
+        if (requestedPortalURL == null)
+        {
+            requestedPortalURL = portalURL;
+        }
+        else
+        {
+            requestedPortalURL.merge(portalURL, windowId);
+        }
     }
 
 	public ServletContext getServletContext() {

Modified: portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURL.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURL.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURL.java (original)
+++ portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURL.java Thu Mar 12 14:59:12 2009
@@ -40,7 +40,7 @@
     String getRenderPath();
 
     void addParameter(PortalURLParameter param);
-
+    
     void addPublicRenderParametersNew(Map<String, String[]> parameters);
 
     Collection<PortalURLParameter> getParameters();
@@ -48,7 +48,11 @@
     public void addPublicParameterCurrent(String name, String[] values);
 
     public Map<String, String[]> getPublicParameters();
-
+    
+    Map<String, String[]> getNewPublicParameters();
+    
+    Map<String, String[]> getPrivateParameters();
+    
     void setActionWindow(String actionWindow);
 
     String getActionWindow();
@@ -67,13 +71,19 @@
 
     void clearParameters(String windowId);
 
+    /**
+     * 
+     * @deprecated use toURL(boolean) instead
+     */
     String toString();
+    
+    String toURL(boolean absolute);
 
     String getServerURI();
 
     String getServletPath();
 
-    Object clone();
+    PortalURL clone();
 
     String getResourceWindow();
 
@@ -82,4 +92,12 @@
 	PageConfig getPageConfig(ServletContext servletContext);
 
 	void addPublicParameterActionResourceParameter(String parameterName, String value);
+	
+	void setCacheability(String cacheLevel);
+	String getCacheability();
+	
+	void setResourceID(String resourceID);
+	String getResourceID();
+	
+	void merge(PortalURL url, String windowId);	
 }

Modified: portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURLParser.java
URL: http://svn.apache.org/viewvc/portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURLParser.java?rev=752882&r1=752881&r2=752882&view=diff
==============================================================================
--- portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURLParser.java (original)
+++ portals/pluto/trunk/pluto-portal-driver/src/main/java/org/apache/pluto/driver/url/PortalURLParser.java Thu Mar 12 14:59:12 2009
@@ -11,8 +11,5 @@
  */
 public interface PortalURLParser {
     PortalURL parse(HttpServletRequest request);
-
-//    String toString(PortalURL portalURL, HttpServletRequest request);
-    
     String toString(PortalURL portalURL);
 }