You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2007/02/16 02:36:58 UTC

svn commit: r508274 - in /portals/jetspeed-2/trunk: commons/src/java/org/apache/jetspeed/aggregator/ components/cm/src/java/org/apache/jetspeed/mocks/ components/cm/src/java/org/apache/jetspeed/testhelpers/ components/portal/src/java/org/apache/jetspee...

Author: taylor
Date: Thu Feb 15 17:36:57 2007
New Revision: 508274

URL: http://svn.apache.org/viewvc?view=rev&rev=508274
Log:
https://issues.apache.org/jira/browse/JS2-226
* implemented ordering of request jobs so that parallel jobs are invoked before sequential
   contribution from Woonsan Ko
* fixed bug in title generation
* unit test improvements


Added:
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingRequestDispatcher.java
Modified:
    portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/BaseMockServletContext.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingServletContext.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/AbstractTestHelper.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/BuildPropertiesHelper.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/DatasourceHelper.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/OJBHelper.java
    portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/TestHelper.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateComponent.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
    portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java
    portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/MockRenderJob.java
    portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/TestAggregator.java
    portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/PortletRenderer.java
    portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/RenderingJob.java
    portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/web.xml

Modified: portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java (original)
+++ portals/jetspeed-2/trunk/commons/src/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java Thu Feb 15 17:36:57 2007
@@ -41,7 +41,7 @@
      * Returns an Enumeration containing the names of the attributes available to this Thread. 
      * This method returns an empty Enumeration  if the thread has no attributes available to it.
      */
-    public Enumeration getAttributeNames()
+    public static Enumeration getAttributeNames()
     {
         return ((Hashtable) currentWorkerContext.get()).keys();
     }

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/BaseMockServletContext.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/BaseMockServletContext.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/BaseMockServletContext.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/BaseMockServletContext.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.mocks;
 
 import java.util.HashMap;

Added: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingRequestDispatcher.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingRequestDispatcher.java?view=auto&rev=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingRequestDispatcher.java (added)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingRequestDispatcher.java Thu Feb 15 17:36:57 2007
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.mocks;
+
+import java.io.IOException;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import com.mockrunner.mock.web.MockRequestDispatcher;
+
+public class ResourceLocatingRequestDispatcher extends MockRequestDispatcher
+{
+    protected Servlet servlet;
+    protected String path;
+    protected String info;
+
+    public ResourceLocatingRequestDispatcher(Servlet servlet, String path, String info)
+    {
+        super();
+        this.servlet = servlet;
+        this.path = path;
+        this.info = info;
+    }
+
+    public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
+    {
+        super.include(request, response);
+
+        request.setAttribute("javax.servlet.include.servlet_path", this.path);
+
+        if (this.info != null)
+            request.setAttribute("javax.servlet.include.path_info", this.info);
+
+        this.servlet.service(request, response);
+    }
+}
\ No newline at end of file

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingServletContext.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingServletContext.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingServletContext.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/mocks/ResourceLocatingServletContext.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.mocks;
 
 import java.io.File;
@@ -5,22 +20,52 @@
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.Rule;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.oro.text.GlobCompiler;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternCompiler;
+import org.apache.oro.text.regex.PatternMatcher;
+import org.apache.oro.text.regex.Perl5Matcher;
+
+import com.mockrunner.mock.web.MockServletConfig;
+
 public class ResourceLocatingServletContext extends BaseMockServletContext
 {
+    protected final static Log log = LogFactory.getLog(ResourceLocatingServletContext.class);
+    
     private final File rootPath;
-    private final Map pathOverrides;
+    private final Map pathOverrides = new HashMap();
+    private final List servletInfoList = new ArrayList();
+    private final List servletMappingInfoList = new ArrayList();
+    private final Map servletInstanceMap = new HashMap();
     
     public ResourceLocatingServletContext(File rootPath)
     {
         super();        
         this.rootPath = rootPath;
-        this.pathOverrides = new HashMap();
+    }
+    
+    public ResourceLocatingServletContext(File rootPath, boolean loadServlet)
+    {
+        super();
+        this.rootPath = rootPath;
+
+        if (loadServlet)
+            loadServlets();
     }
     
     public final void addPathOverride(String path, File file)
@@ -95,4 +140,239 @@
         return pathes;
     }
 
+    public RequestDispatcher getRequestDispatcher(String arg0)
+    {
+        Servlet servlet = findServletByPath(arg0);
+
+        if (servlet == null)
+        {
+            throw new IllegalArgumentException("Failed to find servlet for the path: " + arg0);
+        }
+
+        return new ResourceLocatingRequestDispatcher(servlet, arg0, null);
+    }
+
+    protected Servlet findServletByPath(String path)
+    {
+        Servlet servlet = null;
+
+        for (Iterator it = this.servletMappingInfoList.iterator(); it.hasNext(); )
+        {
+            ServletMappingInfo servletMappingInfo = (ServletMappingInfo) it.next();
+            Pattern pattern = servletMappingInfo.getPattern();
+
+            if (pattern != null)
+            {
+                PatternMatcher matcher = new Perl5Matcher();
+                
+                if ((matcher.matches(path, pattern)) || (matcher.matches(path + "/", pattern)))
+                {
+                    servlet = (Servlet) this.servletInstanceMap.get(servletMappingInfo.getServletName());
+                    break;
+                }
+            }
+        }
+        
+        return servlet;
+    }
+
+    protected void loadServlets() 
+    {
+        Servlet containerServlet = null;
+
+        this.servletInfoList.clear();
+        this.servletMappingInfoList.clear();
+
+        Digester digester = new Digester();
+        
+        digester.addObjectCreate("web-app/servlet", ServletInfo.class);
+        digester.addBeanPropertySetter("web-app/servlet/servlet-name", "servletName");
+        digester.addBeanPropertySetter("web-app/servlet/servlet-class", "servletClass");
+        digester.addCallMethod("web-app/servlet/init-param", "addInitParam", 2);
+        digester.addCallParam("web-app/servlet/init-param/param-name", 0);
+        digester.addCallParam("web-app/servlet/init-param/param-value", 1);
+        digester.addRule("web-app/servlet", new ServletRule(this.servletInfoList));
+        
+        digester.addObjectCreate("web-app/servlet-mapping", ServletMappingInfo.class);
+        digester.addBeanPropertySetter("web-app/servlet-mapping/servlet-name", "servletName");
+        digester.addBeanPropertySetter("web-app/servlet-mapping/url-pattern", "urlPattern");
+        digester.addRule("web-app/servlet-mapping", new ServletMappingRule(this.servletMappingInfoList));
+
+        File webInfPath = new File(this.rootPath, "WEB-INF");        
+        File webDescriptorFile = new File(webInfPath, "web.xml");
+        log.debug("parsing webDescriptorFile: " + webDescriptorFile);
+
+        try
+        {
+            digester.parse(webDescriptorFile);
+        }
+        catch (Exception e)
+        {
+            log.error("Failed to parse webDescriptorFile: " + webDescriptorFile, e);
+        }
+        
+        for (Iterator it = this.servletInfoList.iterator(); it.hasNext(); )
+        {
+            ServletInfo servletInfo = (ServletInfo) it.next();
+            
+            try
+            {
+                Servlet servlet = (Servlet) Class.forName(servletInfo.getServletClass()).newInstance();
+                MockServletConfig servletConfig = new MockServletConfig();
+                servletConfig.setServletContext(this);
+                
+                Map initParamMap = servletInfo.getInitParamMap();
+                
+                for (Iterator itParam = initParamMap.keySet().iterator(); itParam.hasNext(); )
+                {
+                    String paramName = (String) itParam.next();
+                    String paramValue = (String) initParamMap.get(paramName);
+                    servletConfig.setInitParameter(paramName, paramValue);
+                }
+                
+                servlet.init(servletConfig);
+                
+                this.servletInstanceMap.put(servletInfo.getServletName(), servlet);
+            }
+            catch (Exception e)
+            {
+                log.error("Failed to load and initialize servlet: " + servletInfo);
+            }
+        }
+    }
+
+    public static class ServletInfo 
+    {
+        protected String servletName;
+        protected String servletClass;
+        protected Map initParamMap = new HashMap();
+
+        public void setServletName(String servletName) 
+        {
+            this.servletName = servletName;
+        }
+        
+        public String getServletName() 
+        {
+            return this.servletName;
+        }
+
+        public void setServletClass(String servletClass) 
+        {
+            this.servletClass = servletClass;
+        }
+
+        public String getServletClass() 
+        {
+            return this.servletClass;
+        }
+
+        public void addInitParam(String paramName, String paramValue) 
+        {
+            this.initParamMap.put(paramName, paramValue);
+        }
+
+        public Map getInitParamMap() {
+            return this.initParamMap;
+        }
+
+        public String toString() {
+            return "ServletInfo [" + this.servletName + ", " + this.servletClass + ", " + this.initParamMap + "]";
+        }
+    }
+
+    public static class ServletMappingInfo 
+    {
+        protected String servletName;
+        protected String urlPattern;
+        protected Pattern pattern;
+
+        public void setServletName(String servletName) 
+        {
+            this.servletName = servletName;
+        }
+
+        public String getServletName() 
+        {
+            return this.servletName;
+        }
+
+        public void setUrlPattern(String urlPattern) 
+        {
+            this.urlPattern = urlPattern;
+            this.pattern = null;
+
+            try
+            {
+                PatternCompiler compiler = new GlobCompiler();
+                this.pattern = compiler.compile(this.urlPattern);
+            }
+            catch (Exception e)
+            {
+                log.error("Invalid url pattern: " + this.urlPattern);
+            }
+        }
+
+        public String getUrlPattern() 
+        {
+            return this.urlPattern;
+        }
+
+        public Pattern getPattern()
+        {
+            return this.pattern;
+        }
+
+        public String toString() {
+            return "ServletMappingInfo [" + this.urlPattern + ", " + this.servletName + "]";
+        }
+    }
+    
+    public static class ServletRule extends Rule 
+    {
+        private List servletInfoList;
+
+        public ServletRule(List servletInfoList)
+        {
+            this.servletInfoList = servletInfoList;
+        }
+
+        public void end(String namespace, String name) 
+        {
+            try
+            {
+                ServletInfo servletInfo = (ServletInfo) digester.peek(0);
+                this.servletInfoList.add(servletInfo);
+            }
+            catch (Exception e)
+            {
+                log.error("Exception occurred in ServletRule", e);
+            }
+        }
+    }
+
+    public static class ServletMappingRule extends Rule
+    {
+        private List servletMappingInfoList;
+
+        public ServletMappingRule(List servletMappingInfoList)
+        {
+            this.servletMappingInfoList = servletMappingInfoList;
+        }
+
+        public void end(String namespace, String name) 
+        {
+            try 
+            {
+                ServletMappingInfo servletMappingInfo = (ServletMappingInfo) digester.peek(0);
+                this.servletMappingInfoList.add(servletMappingInfo);
+            }
+            catch (Exception e)
+            {
+                log.error("Exception occurred in ServletMappingRule", e);
+            }
+        }
+    }
+
+    
 }

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/AbstractTestHelper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/AbstractTestHelper.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/AbstractTestHelper.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/AbstractTestHelper.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.testhelpers;
 
 import java.io.File;

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/BuildPropertiesHelper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/BuildPropertiesHelper.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/BuildPropertiesHelper.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/BuildPropertiesHelper.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.testhelpers;
 
 /**

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/DatasourceHelper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/DatasourceHelper.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/DatasourceHelper.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/DatasourceHelper.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.testhelpers;
 
 import java.util.Map;

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/OJBHelper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/OJBHelper.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/OJBHelper.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/OJBHelper.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.testhelpers;
 
 import java.util.Map;

Modified: portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/TestHelper.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/TestHelper.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/TestHelper.java (original)
+++ portals/jetspeed-2/trunk/components/cm/src/java/org/apache/jetspeed/testhelpers/TestHelper.java Thu Feb 15 17:36:57 2007
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2001,2004 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.jetspeed.testhelpers;
 
 import java.util.Map;

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java Thu Feb 15 17:36:57 2007
@@ -83,7 +83,7 @@
         }
         else
         {
-            aggregateAndRender(root, context, page, true, null, null);
+            aggregateAndRender(root, context, page, true, null, null, null);
         }        
         //dispatcher.include(root);
         context.getResponse().getWriter().write(root.getRenderedContent());
@@ -130,19 +130,23 @@
     }
 
     protected void aggregateAndRender(ContentFragment f, RequestContext context, ContentPage page, boolean isRoot,
-                                      List portletJobs, List layoutFragments)
+                                      List sequentialJobs, List parallelJobs, List layoutFragments)
             throws FailedToRenderFragmentException
     {
         // First Pass, kick off async render threads for all portlets on page 
         // Store portlet rendering jobs in the list to wait later.
         // Store layout fragment in the list to render later.
-        if (portletJobs == null) 
+        if (sequentialJobs == null) 
         {
-            portletJobs = new ArrayList(16);
+            sequentialJobs = new ArrayList();
         }
+        if (parallelJobs == null) 
+        {
+            parallelJobs = new ArrayList();
+        }        
         if (layoutFragments == null)
         {
-            layoutFragments = new ArrayList(4);
+            layoutFragments = new ArrayList();
         }
 
         if (f.getContentFragments() != null && f.getContentFragments().size() > 0)
@@ -155,21 +159,23 @@
                 {
                     if (child.getType().equals(ContentFragment.PORTLET))
                     {
-                        // kick off render thread
-                        // and store the portlet rendering job into the portlet jobs list.
-                        RenderingJob job = renderer.render(child, context);
+                        // create and store the portlet rendering job into the jobs lists.
+                        RenderingJob job = renderer.createRenderingJob(child, context);
 
                         // The returned job can be null for some reason, such as invalid portlet entity.
-                        if ((job != null) && (job.getTimeout() > 0)) 
+                        if (job != null) 
                         {
-                            portletJobs.add(job);
+                            if (job.getTimeout() > 0)
+                                parallelJobs.add(job);
+                            else
+                                sequentialJobs.add(job);
                         }
                     }
                     else
                     {
                         // walk thru layout 
                         // and store the layout rendering job into the layout jobs list.
-                        aggregateAndRender(child, context, page, false, portletJobs, layoutFragments);
+                        aggregateAndRender(child, context, page, false, sequentialJobs, parallelJobs, layoutFragments);
                         layoutFragments.add(child);
                     }
                 }
@@ -180,15 +186,29 @@
         if (!isRoot)
             return;
 
+        // kick off the parallel rendering jobs
+        Iterator iter = parallelJobs.iterator();
+        while (iter.hasNext())
+        {
+            RenderingJob job = (RenderingJob) iter.next();
+            renderer.processRenderingJob(job);
+        }
+
+        // kick off the sequential rendering jobs
+        iter = sequentialJobs.iterator();
+        while (iter.hasNext())
+        {
+            RenderingJob job = (RenderingJob) iter.next();
+            renderer.processRenderingJob(job);
+        }
 
         // synchronize on completion of all jobs
-        Iterator it = portletJobs.iterator();
-        
+        iter = parallelJobs.iterator();
         try 
         {
-            while (it.hasNext()) 
+            while (iter.hasNext()) 
             {
-                RenderingJob job = (RenderingJob) it.next();
+                RenderingJob job = (RenderingJob) iter.next();
                 PortletContent portletContent = job.getPortletContent();
                 
                 if (!portletContent.isComplete()) 
@@ -206,10 +226,10 @@
         }
         
         // render layout fragments.
-        it = layoutFragments.iterator();
-        while (it.hasNext()) 
+        iter = layoutFragments.iterator();
+        while (iter.hasNext()) 
         {
-            ContentFragment child = (ContentFragment) it.next();
+            ContentFragment child = (ContentFragment) iter.next();
             renderer.renderNow(child, context);
         }
         
@@ -219,6 +239,7 @@
         {
             log.debug("Rendering portlet fragment: [[name, " + f.getName() + "], [id, " + f.getId() + "]]");
         }        
+        
         renderer.renderNow(f, context);
     }
     

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java Thu Feb 15 17:36:57 2007
@@ -175,6 +175,7 @@
      * 
      * @throws FailedToRenderFragmentException
      * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
      */
     public void renderNow( ContentFragment fragment, RequestContext requestContext )
     {
@@ -204,8 +205,10 @@
             }
             servletRequest = requestContext.getRequestForWindow(portletWindow);
             servletResponse = dispatcher.getResponseForWindow(portletWindow, requestContext);
-            RenderingJob rJob = buildRenderingJob(portletWindow, fragment, servletRequest, servletResponse,
-                    requestContext, false, portletDefinition, dispatcher, null);
+            RenderingJob rJob = 
+                buildRenderingJob(portletWindow, fragment, servletRequest, servletResponse,
+                                  requestContext, false, portletDefinition, dispatcher, null, 
+                                  expirationCache, contentIsCached);
             rJob.execute();
             addTitleToHeader( portletWindow, fragment, servletRequest, servletResponse, dispatcher, contentIsCached);
         }
@@ -226,6 +229,8 @@
      * 
      * @throws FailedToRenderFragmentException
      * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
+     * @throws PortletAccessDeniedException
      */
     public void renderNow( ContentFragment fragment, HttpServletRequest request, HttpServletResponse response )          
     {
@@ -244,16 +249,44 @@
     
     /**
      * Render the specified Page fragment. The method returns before rendering
-     * is complete, rendered content can be accessed through the
-     * ContentDispatcher
-     * @throws FailedToRetrievePortletWindow
+     * is complete, rendered content can be accessed through the Content Dispatcher
      * 
-     * @throws UnknownPortletDefinitionException
-     * @throws FailedToRetrievePortletWindow
+     * @return the asynchronous portlet rendering job to synchronize
      */
     public RenderingJob render( ContentFragment fragment, RequestContext requestContext )
     {
-        RenderingJob rJob = null;
+        RenderingJob job = null;
+
+        try
+        {
+            job = createRenderingJob(fragment, requestContext);
+        }
+        catch (Exception e)
+        {
+            log.error("render() failed: " + e.toString(), e);
+            fragment.overrideRenderedContent(e.getLocalizedMessage());            
+        }
+
+        if (job != null)
+        {
+            processRenderingJob(job, true);
+        }
+
+        return job;
+    }       
+    
+    /** 
+     * 
+     * Create a rendering job for the specified Page fragment.
+     * The method returns a rendering job which should be passed to 'processRenderingJob(RenderingJob job)' method.
+     * @return portlet rendering job to pass to render(RenderingJob job) method
+     * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
+     * @throws PortletAccessDeniedException
+     */
+    public RenderingJob createRenderingJob(ContentFragment fragment, RequestContext requestContext)
+    {
+        RenderingJob job = null;
         HttpServletRequest servletRequest =null;
         HttpServletResponse servletResponse = null;
         ContentDispatcherCtrl dispatcher = null;  
@@ -262,48 +295,69 @@
         {
             PortletWindow portletWindow = getPortletWindow(fragment);
             PortletDefinitionComposite portletDefinition = 
-                (PortletDefinitionComposite) portletWindow.getPortletEntity().getPortletDefinition();           
+                (PortletDefinitionComposite) portletWindow.getPortletEntity().getPortletDefinition();     
+            
             if (checkSecurityConstraints && !checkSecurityConstraint(portletDefinition, fragment))
             {
                 throw new PortletAccessDeniedException("Access Denied.");
             }
+            
             int expirationCache = getExpirationCache(portletDefinition);
             if (expirationCache != 0)
             {
-                if (retrieveCachedContent(requestContext, fragment, portletWindow, expirationCache, portletDefinition))
+                contentIsCached = retrieveCachedContent(requestContext, fragment, portletWindow, 
+                                                        expirationCache, portletDefinition);
+                if (contentIsCached)
+                {
                     return null;
-                contentIsCached = true;
-            }
-            if (dispatcher == null)
-            {
-                dispatcher = createDispatcher(requestContext, fragment, expirationCache);
+                }
             }
-                        
-            servletRequest = requestContext.getRequestForWindow(portletWindow);
-            servletResponse = dispatcher.getResponseForWindow(portletWindow, requestContext);
-            rJob = buildRenderingJob(portletWindow, fragment, servletRequest, servletResponse, 
-                                      requestContext, true, portletDefinition, dispatcher, null);
+            job = buildRenderingJob( portletWindow, fragment, requestContext, true, 
+                                     portletDefinition, null, contentIsCached );
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException("Failed to create rendering job", e);
+        }
 
-            if (rJob.getTimeout() > 0) 
+        return job;
+    }
+           
+    /** 
+     * 
+     * Render the specified rendering job.
+     * The method returns before rendering is complete when the job is processed in parallel mode.
+     * When it is not parallel mode, it returns after rendering is complete.
+     * @throws FailedToRenderFragmentException
+     */
+    public void processRenderingJob(RenderingJob job)
+    {
+        processRenderingJob(job, false);
+    }
+
+    protected void processRenderingJob(RenderingJob job, boolean parallelOnly)
+    {
+        ContentFragment fragment = null;
+
+        try
+        {
+            if (parallelOnly || job.getTimeout() > 0)
             {
-                workMonitor.process(rJob);
-            } 
-            else 
+                workMonitor.process(job);
+            }
+            else
             {
-                rJob.execute();
+                job.execute();
+                addTitleToHeader(job.getWindow(), job.getFragment(), 
+                                 job.getRequest(), job.getResponse(), job.getDispatcher(), 
+                                 job.isContentCached());                
             }
-            addTitleToHeader(portletWindow, fragment, servletRequest, servletResponse, dispatcher, contentIsCached);
-        }
-        catch (PortletAccessDeniedException e)
-        {
-            fragment.overrideRenderedContent(e.getLocalizedMessage());                        
         }
         catch (Exception e1)
         {
             log.error("render() failed: " + e1.toString(), e1);
             fragment.overrideRenderedContent(e1.getLocalizedMessage());            
         }
-        return rJob;
     }
 
     /**
@@ -314,8 +368,9 @@
      * @return true when content found, otherwise false
      */
     protected boolean retrieveCachedContent(RequestContext requestContext, ContentFragment fragment, 
-                           PortletWindow portletWindow, int expiration, PortletDefinitionComposite portletDefinition)
-    throws Exception
+                                            PortletWindow portletWindow, int expiration, 
+                                            PortletDefinitionComposite portletDefinition)
+        throws Exception
     {
         String cacheKey = portletContentCache.createCacheKey(requestContext.getUserPrincipal().getName(), fragment.getId());
         CacheElement cachedElement = portletContentCache.get(cacheKey);
@@ -325,7 +380,8 @@
             fragment.setPortletContent(portletContent);
             ContentDispatcherCtrl dispatcher = new ContentDispatcherImpl(portletContent);
             HttpServletRequest servletRequest = requestContext.getRequestForWindow(portletWindow);
-            HttpServletResponse servletResponse = dispatcher.getResponseForWindow(portletWindow, requestContext);            
+            HttpServletResponse servletResponse = dispatcher.getResponseForWindow(portletWindow, requestContext);
+
             this.addTitleService.setDynamicTitle(portletWindow, servletRequest, dispatcher.getPortletContent(fragment).getTitle());
             return true;
         }        
@@ -351,24 +407,47 @@
 
     protected PortletWindow getPortletWindow( ContentFragment fragment ) throws FailedToRetrievePortletWindow, PortletEntityNotStoredException
     {
-            // ObjectID oid = JetspeedObjectID.createFromString(fragment.getId());
-            PortletWindow portletWindow = windowAccessor.getPortletWindow(fragment);
-            if (portletWindow == null)
-            {
-                throw new FailedToRetrievePortletWindow("Portlet Window creation failed for fragment: "
-                        + fragment.getId() + ", " + fragment.getName());
-            }
-            PortletEntity portletEntity = portletWindow.getPortletEntity();
-            ((MutablePortletEntity)portletEntity).setFragment(fragment);
-            return portletWindow;
+        // ObjectID oid = JetspeedObjectID.createFromString(fragment.getId());
+        PortletWindow portletWindow = windowAccessor.getPortletWindow(fragment);
+
+        if (portletWindow == null)
+        {
+            throw new FailedToRetrievePortletWindow("Portlet Window creation failed for fragment: "
+                                                    + fragment.getId() + ", " + fragment.getName());
+        }
+
+        PortletEntity portletEntity = portletWindow.getPortletEntity();
+        ((MutablePortletEntity)portletEntity).setFragment(fragment);
 
+        return portletWindow;
     }
     
-    protected RenderingJob buildRenderingJob( PortletWindow portletWindow, ContentFragment fragment, HttpServletRequest request,
-                                              HttpServletResponse response, RequestContext requestContext, boolean isParallel,
-                                              PortletDefinitionComposite portletDefinition, ContentDispatcherCtrl dispatcher, PortletContent portletContent )
-        throws PortletAccessDeniedException, FailedToRetrievePortletWindow, FailedToRenderFragmentException, PortletEntityNotStoredException
-    {
+    protected RenderingJob buildRenderingJob( PortletWindow portletWindow, ContentFragment fragment, 
+                                              RequestContext requestContext, boolean isParallel,
+                                              PortletDefinitionComposite portletDefinition, 
+                                              PortletContent portletContent, boolean contentIsCached )
+        throws PortletAccessDeniedException, FailedToRetrievePortletWindow, PortletEntityNotStoredException        
+    {
+        int expirationCache = getExpirationCache(portletDefinition);
+        ContentDispatcherCtrl dispatcher = createDispatcher(requestContext, fragment, expirationCache);
+        HttpServletRequest request = requestContext.getRequestForWindow(portletWindow);
+        HttpServletResponse response = dispatcher.getResponseForWindow(portletWindow, requestContext);
+
+        return buildRenderingJob( portletWindow, fragment, request, response,
+                                  requestContext, isParallel,
+                                  portletDefinition, dispatcher,
+                                  portletContent, expirationCache, contentIsCached );        
+    }
+
+    protected RenderingJob buildRenderingJob( PortletWindow portletWindow, ContentFragment fragment, 
+                                              HttpServletRequest request, HttpServletResponse response, 
+                                              RequestContext requestContext, boolean isParallel,
+                                              PortletDefinitionComposite portletDefinition, 
+                                              ContentDispatcherCtrl dispatcher, 
+                                              PortletContent portletContent, 
+                                              int expirationCache, boolean contentIsCached )
+             throws PortletAccessDeniedException, FailedToRetrievePortletWindow, PortletEntityNotStoredException
+   {    
         RenderingJob rJob = null;
                
         request.setAttribute(PortalReservedParameters.PAGE_ATTRIBUTE, requestContext.getPage());
@@ -377,6 +456,7 @@
         request.setAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE, requestContext);                
         request.setAttribute(PortalReservedParameters.PATH_ATTRIBUTE, requestContext.getAttribute(PortalReservedParameters.PATH_ATTRIBUTE));
         request.setAttribute(PortalReservedParameters.PORTLET_WINDOW_ATTRIBUTE, portletWindow);
+        
         if (portletContent == null)
         {
             portletContent = dispatcher.getPortletContent(fragment);
@@ -397,11 +477,17 @@
             // so, store portlet definition as an attribute of worker
             workerAttrs.put(PortalReservedParameters.PORTLET_DEFINITION_ATTRIBUTE, portletDefinition);
 
-            rJob = new RenderingJobImpl(container, portletContent, fragment, request, response, requestContext, portletWindow, statistics, workerAttrs);
+            rJob = new RenderingJobImpl(container, this, portletDefinition, portletContent, fragment, dispatcher,
+                                                    request, response, requestContext, portletWindow, 
+                                                    statistics, expirationCache, contentIsCached, workerAttrs);
+            
         }
         else
         {
-            rJob = new RenderingJobImpl(container, portletContent, fragment, request, response, requestContext, portletWindow, statistics);
+            rJob = new RenderingJobImpl(container, this, portletDefinition, portletContent, fragment, dispatcher,
+                                                         request, response, requestContext, portletWindow, 
+                                                         statistics, expirationCache, contentIsCached );
+            
         }
         setTimeoutOnJob(portletDefinition, rJob);
         return rJob;
@@ -416,6 +502,7 @@
         {
             timeoutFields = portletDefinition.getMetadata().getFields(PortalReservedParameters.PORTLET_EXTENDED_DESCRIPTOR_RENDER_TIMEOUT);
         }
+
         if (timeoutFields != null) 
         {
             Iterator it = timeoutFields.iterator();
@@ -434,28 +521,32 @@
                 }
             }
         }
+
         if (timeoutMetadata > 0) 
         {
             rJob.setTimeout(timeoutMetadata);
-        } 
+        }
         else if (this.defaultPortletTimeout > 0) 
         {
             rJob.setTimeout(this.defaultPortletTimeout);
         }        
     }
     
-    protected void addTitleToHeader( PortletWindow portletWindow, ContentFragment fragment, 
-             HttpServletRequest request, HttpServletResponse response, ContentDispatcherCtrl dispatcher, boolean isCacheTitle)
+    public void addTitleToHeader( PortletWindow portletWindow, ContentFragment fragment, 
+                                  HttpServletRequest request, HttpServletResponse response, 
+                                  ContentDispatcherCtrl dispatcher, boolean isCacheTitle )
     {
         if (overrideTitles)
         {
             try
             {
                 String title = fragment.getTitle();
+
                 if ( title == null )
                 {
                     title = addTitleService.getDynamicTitle( portletWindow, request );
                 }
+
                 response.setHeader( "JS_PORTLET_TITLE", StringEscapeUtils.escapeHtml( title ) );
                 dispatcher.getPortletContent(fragment).setTitle(title);          
             }
@@ -466,15 +557,25 @@
         }
         else
         {
+            String title = null;
+
             if (isCacheTitle)
             {
-                String title = fragment.getTitle();
+                title = fragment.getTitle();
+
                 if ( title == null )
                 {
                     title = addTitleService.getDynamicTitle(portletWindow, request);
                 }
+
                 dispatcher.getPortletContent(fragment).setTitle(title);
-            }           
+            }
+
+            if (title == null)
+            {
+                title = addTitleService.getDynamicTitle(portletWindow, request);
+                dispatcher.getPortletContent(fragment).setTitle(title);                
+            }
         }
     }
     

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java Thu Feb 15 17:36:57 2007
@@ -30,6 +30,8 @@
 import org.apache.jetspeed.aggregator.PortletContent;
 import org.apache.jetspeed.aggregator.RenderingJob;
 import org.apache.jetspeed.aggregator.Worker;
+import org.apache.jetspeed.aggregator.ContentDispatcherCtrl;
+import org.apache.jetspeed.aggregator.PortletRenderer;
 import org.apache.jetspeed.components.portletentity.PortletEntityImpl;
 import org.apache.jetspeed.om.common.portlet.MutablePortletEntity;
 import org.apache.jetspeed.om.page.ContentFragment;
@@ -58,49 +60,70 @@
     protected HttpServletResponse response = null;
     
     protected PortletContainer container = null;
+    protected PortletRenderer renderer = null;
     protected ContentFragment fragment = null;
     protected RequestContext requestContext = null;
 
+    protected PortletDefinition portletDefinition;
     protected PortletContent portletContent;
     protected PortalStatistics statistics;
+    protected ContentDispatcherCtrl dispatcher;
+    protected boolean contentIsCached;
+    
+    protected int expirationCache = 0;
 
     protected Map workerAttributes;
 
     protected long startTimeMillis = 0;
     protected long timeout;
     
-    public RenderingJobImpl(PortletContainer container, 
+    public RenderingJobImpl(PortletContainer container,
+                            PortletRenderer renderer,
+                            PortletDefinition portletDefinition,
                             PortletContent portletContent, 
                             ContentFragment fragment, 
+                            ContentDispatcherCtrl dispatcher,
                             HttpServletRequest request, 
                             HttpServletResponse response, 
                             RequestContext requestContext, 
                             PortletWindow window,
-                            PortalStatistics statistics)
+                            PortalStatistics statistics,
+                            int expirationCache,
+                            boolean contentIsCached)
     {
         this.container = container;
+        this.renderer = renderer;
         this.statistics = statistics;
+        this.portletDefinition = portletDefinition;
         this.fragment = fragment;
+        this.dispatcher = dispatcher;
         this.request = request;
         this.response = response;
         this.requestContext = requestContext; 
         this.window = window;
         this.portletContent = portletContent; 
         ((MutablePortletEntity)window.getPortletEntity()).setFragment(fragment);
-        
+        this.expirationCache = expirationCache;
+        this.contentIsCached = contentIsCached;
     }
 
     public RenderingJobImpl(PortletContainer container, 
+                            PortletRenderer renderer,
+                            PortletDefinition portletDefinition,
                             PortletContent portletContent, 
-                            ContentFragment fragment, 
+                            ContentFragment fragment,
+                            ContentDispatcherCtrl dispatcher,
                             HttpServletRequest request, 
                             HttpServletResponse response, 
                             RequestContext requestContext, 
                             PortletWindow window,
                             PortalStatistics statistics,
+                            int expirationCache,
+                            boolean contentIsCached,
                             Map workerAttributes)
     {
-        this(container, portletContent, fragment, request, response, requestContext, window, statistics);
+        this(container, renderer, portletDefinition, portletContent, fragment, dispatcher,
+                        request, response, requestContext, window, statistics, expirationCache, contentIsCached);
         this.workerAttributes = workerAttributes;
     }
 
@@ -167,7 +190,8 @@
     {
         long start = System.currentTimeMillis();
         boolean isParallelMode = false;
-
+        PortletWindow curWindow = null;
+        
         try
         {
             log.debug("Rendering OID "+this.window.getId()+" "+ this.request +" "+this.response);
@@ -183,25 +207,24 @@
                     {
                         String name = (String) itAttrNames.next();
                         CurrentWorkerContext.setAttribute(name, this.workerAttributes.get(name));
-                   }
-                   
-                   // The portletEntity stores its portletDefinition into the ThreadLocal member,
-                   // before the worker starts doing a rendering job.
-                   // So the thread contexts are different from each other.
-                   // Therefore, in parallel mode, we have to clear threadlocal fragmentPortletDefinition cache
-                   // of portletEntity and to replace the portletDefinition with one of current worker context.
-                   // Refer to org.apache.jetspeed.components.portletentity.PortletEntityImpl class
+                    }
                     
-                    PortletWindow window = (PortletWindow)
+                    // The portletEntity stores its portletDefinition into the ThreadLocal member,
+                    // before the worker starts doing a rendering job.
+                    // So the thread contexts are different from each other.
+                    // Therefore, in parallel mode, we have to clear threadlocal fragmentPortletDefinition cache
+                    // of portletEntity and to replace the portletDefinition with one of current worker context.
+                    // Refer to org.apache.jetspeed.components.portletentity.PortletEntityImpl class
+                    
+                    curWindow = (PortletWindow) 
                         CurrentWorkerContext.getAttribute(PortalReservedParameters.PORTLET_WINDOW_ATTRIBUTE); 
-                        
-                    PortletEntityImpl portletEntityImpl = (PortletEntityImpl) window.getPortletEntity();
-                    PortletDefinition oldPortletDefinition = portletEntityImpl.getPortletDefinition();
-                    PortletDefinition portletDefinition = (PortletDefinition)
+                    PortletEntityImpl curEntity = (PortletEntityImpl) curWindow.getPortletEntity();
+                    PortletDefinition oldPortletDefinition = curEntity.getPortletDefinition();
+                    PortletDefinition curPortletDefinition = (PortletDefinition)
                         CurrentWorkerContext.getAttribute(PortalReservedParameters.PORTLET_DEFINITION_ATTRIBUTE);
                     
-                    if (!oldPortletDefinition.getId().equals(portletDefinition.getId())) {
-                        portletEntityImpl.setPortletDefinition(portletDefinition);
+                    if (!oldPortletDefinition.getId().equals(curPortletDefinition.getId())) {
+                        curEntity.setPortletDefinition(curPortletDefinition);
                     }
                 }
             }
@@ -228,12 +251,17 @@
         }
         finally
         {
+            portletContent.complete();
+
             if (isParallelMode)
             {
+                this.renderer.addTitleToHeader(curWindow, fragment,
+                                               this.request, this.response,
+                                               this.dispatcher, this.contentIsCached);
+            
                 CurrentWorkerContext.removeAllAttributes();
             }
-
-            portletContent.complete();
+            
             if (fragment.getType().equals(ContentFragment.PORTLET))
             {
                 long end = System.currentTimeMillis();            
@@ -268,5 +296,44 @@
     public PortletContent getPortletContent()
     {
         return portletContent;
+    }
+
+    public PortletDefinition getPortletDefinition()
+    {
+        return this.portletDefinition;
+    }
+
+    public HttpServletRequest getRequest()
+    {
+        return this.request;
+    }
+
+    public HttpServletResponse getResponse()
+    {
+        return this.response;
+    }
+
+    public ContentFragment getFragment()
+    {
+        return this.fragment;
+    }
+
+    public RequestContext getRequestContext()
+    {
+        return this.requestContext;
+    }
+
+    public int getExpirationCache()
+    {
+        return this.expirationCache;
+    }
+
+    public ContentDispatcherCtrl getDispatcher()
+    {
+        return this.dispatcher;
+    }
+
+    public boolean isContentCached() {
+        return this.contentIsCached;
     }
 }

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateComponent.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateComponent.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateComponent.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateComponent.java Thu Feb 15 17:36:57 2007
@@ -18,6 +18,7 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Map;
 
 import javax.portlet.PortletMode;
 import javax.portlet.WindowState;
@@ -49,8 +50,8 @@
     
     // maps containing allowed PortletMode and WindowState objects on their lowercase name
     // ensuring only allowed, and always the same objects are returned and allowing comparision by value
-    private final HashMap supportedPortletModes = Collections.synchronizedMap(new HashMap());
-    private final HashMap supportedWindowStates = Collections.synchronizedMap(new HashMap());
+    private final Map supportedPortletModes = Collections.synchronizedMap(new HashMap());
+    private final Map supportedWindowStates = Collections.synchronizedMap(new HashMap());
 
     private final static Log log = LogFactory.getLog(JetspeedNavigationalStateComponent.class);
     private BeanFactory beanFactory;

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java Thu Feb 15 17:36:57 2007
@@ -371,6 +371,11 @@
      */
     public void setAttribute( String name, Object value )
     {
+        if (name == null)
+        {
+            throw new IllegalArgumentException("Attribute name == null");
+        }
+        
         // In parallel mode, put attribute into worker.
 
         Thread ct = Thread.currentThread();
@@ -385,6 +390,11 @@
             {
                 CurrentWorkerContext.setAttribute(name, value);
             }
+
+            if (name.startsWith("org.apache.jetspeed"))
+            {
+                setAttributeInternal(name, value);
+            }
         }
         else
         {
@@ -395,11 +405,6 @@
 
     private void setAttributeInternal( String name, Object value )
     {
-        if (name == null)
-        {
-            throw new IllegalArgumentException("Attribute name == null");
-        }
-
         // This allows us to make jetpseed objects avaiable to portlets
         // This makes the portlet non-portable but is a must admin portlets
         if (name.startsWith("org.apache.jetspeed"))

Modified: portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java Thu Feb 15 17:36:57 2007
@@ -109,6 +109,7 @@
         }
         else
         {
+            log.error("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
             throw new IllegalStateException("Cannot call getRequestContext(HttpServletRequest request) before it has been created and set for this thread.");
         }
     }
@@ -133,6 +134,7 @@
         }
         else
         {
+            log.error("Cannot call getRequestContext() before it has been created and set for this thread.");
             throw new IllegalStateException("Cannot call getRequestContext() before it has been created and set for this thread.");
         }
     }

Modified: portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/MockRenderJob.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/MockRenderJob.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/MockRenderJob.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/MockRenderJob.java Thu Feb 15 17:36:57 2007
@@ -15,6 +15,12 @@
  */
 package org.apache.jetspeed.aggregator;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.jetspeed.om.page.ContentFragment;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.pluto.om.portlet.PortletDefinition;
 import org.apache.pluto.om.window.PortletWindow;
 
 
@@ -108,6 +114,54 @@
     {
         // TODO Auto-generated method stub
         return null;
+    }
+
+    public ContentDispatcherCtrl getDispatcher()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public int getExpirationCache()
+    {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public ContentFragment getFragment()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public PortletDefinition getPortletDefinition()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public HttpServletRequest getRequest()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public RequestContext getRequestContext()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public HttpServletResponse getResponse()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public boolean isContentCached()
+    {
+        // TODO Auto-generated method stub
+        return false;
     }
 
 }

Modified: portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/TestAggregator.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/TestAggregator.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/TestAggregator.java (original)
+++ portals/jetspeed-2/trunk/components/portal/src/test/org/apache/jetspeed/aggregator/TestAggregator.java Thu Feb 15 17:36:57 2007
@@ -78,7 +78,7 @@
     private PortletRegistry portletRegistry;
     private RequestContextComponent rcc;
     private UserManager userManager;
-    
+    private String testPage = "/default-page.psml";
 
     /**
      * Start the tests.
@@ -124,10 +124,19 @@
         portletFactory = (PortletFactory) engine.getComponentManager().getComponent("portletFactory");
         rcc = (RequestContextComponent) engine.getComponentManager().getComponent("org.apache.jetspeed.request.RequestContextComponent");
 
-        initPA("jetspeed-layouts", "/jetspeed-layouts", new File("../../layout-portlets/target/jetspeed-layout-portlets"));
-        initPA("demo", "/demo", new File("../../applications/demo/target/demo"));
-        initPA("j2-admin", "/j2-admin", new File("../../applications/j2-admin/target/j2-admin"));
+        ResourceLocatingServletContext paContext = null;
+        File paRootDir = null;
+        File paWebInfDir = null;
+        
+        paRootDir = new File("../../layout-portlets/target/jetspeed-layout-portlets");
+        paContext = initPA("jetspeed-layouts", "/jetspeed-layouts", paRootDir);
+
+        paRootDir = new File("../../applications/demo/target/demo");
+        paContext = initPA("demo", "/demo", paRootDir);
 
+        paRootDir = new File("../../applications/j2-admin/target/j2-admin");
+        paContext = initPA("j2-admin", "/j2-admin", paRootDir);
+ 
         // j2-admin portlet needs user manager component, but the followings does not effect..
 //        userManager = (UserManager) engine.getComponentManager().getComponent(UserManager.class);
 //        paContext.setAttribute(CommonPortletServices.CPS_USER_MANAGER_COMPONENT, userManager);
@@ -189,7 +198,7 @@
                     try {
                         PageManager pageManager = 
                             (PageManager) engine.getComponentManager().getComponent(PageManager.class);
-                        Page page = pageManager.getPage("/default-page.psml");
+                        Page page = pageManager.getPage(testPage);
                         assertNotNull(page);
                         requestContext.setPage(new ContentPageImpl(page));
 
@@ -198,6 +207,9 @@
                         } else {
                             asyncPageAggregator.build(requestContext);
                         }
+
+                        MockHttpServletResponse rsp = (MockHttpServletResponse) requestContext.getResponse();
+                        System.out.println(">>>> " + rsp.getOutputStreamContent());
                     } catch (Exception e) {
                         return e;
                     }
@@ -225,7 +237,7 @@
 
         request.setScheme("http");
         request.setContextPath("/jetspeed");
-        request.setServletPath("/portal/default-page.psml");
+        request.setServletPath("/portal" + testPage);
         request.setMethod("GET");
 
 //        RequestContext rc = 
@@ -234,42 +246,46 @@
         return rc;
     }
 
-    private ServletContext initPA(String paName, String paContextPath, File paRootDir) {
-        ResourceLocatingServletContext paContext = new ResourceLocatingServletContext(paRootDir);
+    private ResourceLocatingServletContext initPA(String paName, String paContextPath, File paRootDir) 
+    {
+        ResourceLocatingServletContext paContext = new ResourceLocatingServletContext(paRootDir, true);   
         MockServletConfig paConfig = new MockServletConfig();
         paConfig.setServletContext(paContext);
+        ((ResourceLocatingServletContext) servletContext).setContext(paContextPath, paContext);
 
-        ClassLoader paCl = createLocalPAClassLoader(paRootDir);
-        PortletApplication pa = portletRegistry.getPortletApplication(paName);
-        if (!portletFactory.isPortletApplicationRegistered(pa)) {
+        try
+        {
+            ClassLoader paCl = createPAClassLoader(new File(paRootDir, "WEB-INF"));
+            PortletApplication pa = portletRegistry.getPortletApplication(paName);        
             portletFactory.registerPortletApplication(pa, paCl);
         }
-
-        ((ResourceLocatingServletContext) servletContext).setContext(paContextPath, paContext);
+        catch (Exception e)
+        {
+            System.out.println("Failed to register portlet application, " + paName + ": " + e);
+        }        
 
         return paContext;
     }
 
-    protected ClassLoader createLocalPAClassLoader(File paDir)
+    protected ClassLoader createPAClassLoader(File webInfDir)
     {
         ClassLoader localPAClassLoader = null;
 
         ArrayList urls = new ArrayList();
-        File webInfClasses = null;
+        File webInfClassesDir = null;
 
-        try {
-            webInfClasses = new File(paDir, ("WEB-INF/classes/"));
-            if (webInfClasses.exists())
+        try 
+        {
+            webInfClassesDir = new File(webInfDir, "classes");            
+            if (webInfClassesDir.isDirectory())
             {
-                urls.add(webInfClasses.toURL());
+                urls.add(webInfClassesDir.toURL());
             }
             
-            File webInfLib = new File(paDir, "WEB-INF/lib");
-
-            if (webInfLib.exists())
+            File webInfLibDir = new File(webInfDir, "lib");
+            if (webInfLibDir.isDirectory())
             {
-                File[] jars = webInfLib.listFiles();
-                
+                File [] jars = webInfLibDir.listFiles();           
                 for (int i = 0; i < jars.length; i++)
                 {
                     File jar = jars[i];
@@ -279,7 +295,9 @@
             
             localPAClassLoader = 
                 new URLClassLoader((URL[]) urls.toArray(new URL[urls.size()]), getClass().getClassLoader());
-        } catch (Exception e) {
+        } catch (Exception e) 
+        {
+            throw new RuntimeException("Failed to create classloader for PA.", e);
         }
 
         return localPAClassLoader;

Modified: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/PortletRenderer.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/PortletRenderer.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/PortletRenderer.java (original)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/PortletRenderer.java Thu Feb 15 17:36:57 2007
@@ -21,6 +21,7 @@
 import org.apache.jetspeed.container.window.FailedToRetrievePortletWindow;
 import org.apache.jetspeed.om.page.ContentFragment;
 import org.apache.jetspeed.request.RequestContext;
+import org.apache.pluto.om.window.PortletWindow;
 
 /**
  * <h4>PortletRendererService<br />
@@ -38,6 +39,8 @@
         Result is returned in the PortletResponse.
      * @throws FailedToRenderFragmentException
      * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
+     * @throws PortletAccessDeniedException
      */
     public void renderNow(ContentFragment fragment, RequestContext request) ;
 
@@ -46,6 +49,8 @@
         Result is returned in the PortletResponse.
      * @throws FailedToRenderFragmentException
      * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
+     * @throws PortletAccessDeniedException
      */
     public void renderNow(ContentFragment fragment, HttpServletRequest request, HttpServletResponse response) ;
 
@@ -58,6 +63,26 @@
      */
     public RenderingJob render(ContentFragment fragment, RequestContext request);
 
+    /** 
+     * 
+     * Create a rendering job for the specified Page fragment.
+     * The method returns a rendering job which should be passed to 'processRenderingJob(RenderingJob job)' method.
+     * @return portlet rendering job to pass to render(RenderingJob job) method
+     * @throws FailedToRetrievePortletWindow
+     * @throws UnknownPortletDefinitionException
+     * @throws PortletAccessDeniedException
+     */
+    public RenderingJob createRenderingJob(ContentFragment fragment, RequestContext request);
+
+    /** 
+     * 
+     * Render the specified rendering job.
+     * The method returns before rendering is complete when the job is processed in parallel mode.
+     * When the job is not parallel mode, it returns after rendering is complete.
+     * @throws FailedToRenderFragmentException
+     */
+    public void processRenderingJob(RenderingJob job);
+        
     /**
      * Retrieve the ContentDispatcher for the specified request
      */
@@ -70,4 +95,19 @@
      * @param content
      */
     public void notifyContentComplete(PortletContent content);
+
+    /**
+     * Set title of portlet window. 
+     * 
+     * @param portletWindow
+     * @param fragment
+     * @param request
+     * @param response
+     * @param dispatcher
+     * @param isCacheTitle
+     */
+    public void addTitleToHeader( PortletWindow portletWindow, ContentFragment fragment, 
+                                  HttpServletRequest request, HttpServletResponse response, 
+                                  ContentDispatcherCtrl dispatcher, boolean isCacheTitle );
+
 }

Modified: portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/RenderingJob.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/RenderingJob.java?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/RenderingJob.java (original)
+++ portals/jetspeed-2/trunk/jetspeed-api/src/java/org/apache/jetspeed/aggregator/RenderingJob.java Thu Feb 15 17:36:57 2007
@@ -15,8 +15,13 @@
  */
 package org.apache.jetspeed.aggregator;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.jetspeed.om.page.ContentFragment;
+import org.apache.jetspeed.request.RequestContext;
+import org.apache.pluto.om.portlet.PortletDefinition;
 import org.apache.pluto.om.window.PortletWindow;
-import org.apache.jetspeed.aggregator.PortletContent;
 
 /**
  * Worker thread processes jobs and notify its WorkerMonitor when completed.
@@ -39,5 +44,22 @@
     long getTimeout();
 
     boolean isTimeout();
+    
+    PortletDefinition getPortletDefinition();
+
+    HttpServletRequest getRequest();
+
+    HttpServletResponse getResponse();
+
+    ContentFragment getFragment();
+
+    RequestContext getRequestContext();
+
+    int getExpirationCache();
+
+    ContentDispatcherCtrl getDispatcher();
+
+    boolean isContentCached();
+    
 }
 

Modified: portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/web.xml?view=diff&rev=508274&r1=508273&r2=508274
==============================================================================
--- portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/web.xml (original)
+++ portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/web.xml Thu Feb 15 17:36:57 2007
@@ -25,6 +25,10 @@
     <display-name>Jetspeed Container</display-name>
     <description>MVC Servlet for Jetspeed Portlet Applications</description>
     <servlet-class>org.apache.jetspeed.container.JetspeedContainerServlet</servlet-class>
+    <init-param>
+      <param-name>contextName</param-name>
+      <param-value>jetspeed-layouts</param-value>
+    </init-param>    
   </servlet>
 
   <servlet-mapping>



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org