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