Author: julien(a)jboss.com
Date: 2008-02-06 18:47:22 -0500 (Wed, 06 Feb 2008)
New Revision: 9816
Added:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/ControllerFilter.java
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/URLParameterConstants.java
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/AbstractPortletControllerContext.java
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/PortletURLRenderer.java
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/Page.java
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/PagePortletControllerContext.java
modules/portlet/trunk/test/src/test/resources/simple-portal-war/WEB-INF/web.xml
Log:
make the controller as a filter as it is more powerful that way
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/URLParameterConstants.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/URLParameterConstants.java 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/URLParameterConstants.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -39,6 +39,9 @@
*/
public static final String LIFECYCLE_TYPE = "type";
+ /** The window id. */
+ public static final String WINDOW_ID = "windowid";
+
/** The portlet mode. */
public static final String MODE = "mode";
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/AbstractPortletControllerContext.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/AbstractPortletControllerContext.java 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/AbstractPortletControllerContext.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -30,7 +30,6 @@
import org.jboss.portal.common.util.MediaType;
import org.jboss.portal.common.util.ParameterMap;
import org.jboss.portal.common.util.Tools;
-import org.jboss.portal.portlet.ContainerURL;
import org.jboss.portal.portlet.ParametersStateString;
import org.jboss.portal.portlet.Portlet;
import org.jboss.portal.portlet.PortletInvokerException;
@@ -61,7 +60,6 @@
import org.jboss.portal.portlet.invocation.ResourceInvocation;
import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.spi.PortletInvocationContext;
-import org.jboss.portal.portlet.test.StringCodec;
import static org.jboss.portal.portlet.test.URLParameterConstants.*;
import org.jboss.portal.web.Body;
import org.jboss.portal.web.IllegalRequestException;
@@ -120,13 +118,12 @@
// The request decoded if not null
ControllerRequest request = null;
+ // Get the window id
+ String windowId = req.getParameter(WINDOW_ID);
+
// Process
- String pathInfo = req.getPathInfo();
- if (pathInfo != null && pathInfo.startsWith("/") &&
pathInfo.length() > 1)
+ if (windowId != null)
{
- // Get the target portlet
- String targetId = StringCodec.decode(pathInfo.substring(1));
-
// Helper
WebRequest ri = new WebRequest(req);
@@ -186,7 +183,7 @@
case FULL:
request = new FullScopedCacheablePortletResourceRequest(
this,
- targetId,
+ windowId,
resourceId,
resourceState,
formParameters);
@@ -194,7 +191,7 @@
case PORTLET:
request = new PortletScopedPortletResourceRequest(
this,
- targetId,
+ windowId,
resourceId,
resourceState,
formParameters,
@@ -203,7 +200,7 @@
case PAGE:
request = new PageScopedFullPortletResourceRequest(
this,
- targetId,
+ windowId,
resourceId,
resourceState,
formParameters,
@@ -228,7 +225,7 @@
//
request = new PortletActionRequest(
this,
- targetId,
+ windowId,
interactionState,
formParameters,
windowNavigationalState,
@@ -241,7 +238,7 @@
//
request = new PortletRenderRequest(
this,
- targetId,
+ windowId,
windowNavigationalState,
publicNavigationalStateChanges,
pageState);
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/PortletURLRenderer.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/PortletURLRenderer.java 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/PortletURLRenderer.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -91,13 +91,20 @@
buffer.append(Integer.toString(clientReq.getServerPort()));
buffer.append(clientReq.getContextPath());
buffer.append(clientReq.getServletPath());
- buffer.append('/');
- buffer.append(StringCodec.encode(windowId));
//
+ if (clientReq.getPathInfo() != null)
+ {
+ buffer.append(clientReq.getPathInfo());
+ }
+
+ //
Map<String, String> parameters = new HashMap<String, String>();
//
+ parameters.put(WINDOW_ID, windowId);
+
+ //
String type;
if (containerURL instanceof ActionURL)
{
Copied:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/ControllerFilter.java
(from rev 9815,
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/ControllerServlet.java)
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/ControllerFilter.java
(rev 0)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/ControllerFilter.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -0,0 +1,274 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2008, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portal.portlet.test.jsp;
+
+import org.jboss.portal.portlet.test.jsp.response.Chunk;
+import org.jboss.portal.portlet.test.jsp.response.BytesChunk;
+import org.jboss.portal.portlet.test.jsp.response.CharsChunk;
+import org.jboss.portal.portlet.test.jsp.response.PortletChunk;
+import org.jboss.portal.portlet.test.jsp.response.BufferingResponse;
+import org.jboss.portal.portlet.test.jsp.response.ResponseBuffer;
+import org.jboss.portal.portlet.PortletInvoker;
+import org.jboss.portal.portlet.PortletInvokerException;
+import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
+import org.jboss.portal.portlet.invocation.response.FragmentResponse;
+import org.jboss.portal.portlet.controller.PortletController;
+import org.jboss.portal.portlet.controller.response.ControllerResponse;
+import org.jboss.portal.portlet.controller.response.PageUpdateResponse;
+import org.jboss.portal.portlet.controller.response.ResourceResponse;
+import org.jboss.portal.portlet.controller.state.PageNavigationalState;
+import org.jboss.portal.common.io.IOTools;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.Filter;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletContext;
+import java.io.IOException;
+import java.io.Writer;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 630 $
+ */
+public class ControllerFilter implements Filter
+{
+
+ /** . */
+ private FilterConfig config;
+
+ private ServletContext getServletContext()
+ {
+ return config.getServletContext();
+ }
+
+ public void init(FilterConfig config) throws ServletException
+ {
+ this.config = config;
+ }
+
+ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException
+ {
+ doFilter((HttpServletRequest)req, (HttpServletResponse)resp, chain);
+ }
+
+ public void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain
chain) throws IOException, ServletException
+ {
+ BufferingResponse bufferingResponse = new BufferingResponse(resp);
+
+ //
+ chain.doFilter(req, bufferingResponse);
+
+ //
+ ResponseBuffer buffer = bufferingResponse.getBuffer();
+ buffer.close();
+
+ //
+ try
+ {
+ service(req, resp, buffer);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+ public void destroy()
+ {
+ this.config = null;
+ }
+
+ protected void service(HttpServletRequest req, HttpServletResponse resp,
ResponseBuffer buffer) throws ServletException, IOException, ClassNotFoundException
+ {
+ PortletInvoker invoker =
(PortletInvoker)getServletContext().getAttribute("ConsumerPortletInvoker");
+
+ //
+ PagePortletControllerContext context = new PagePortletControllerContext(
+ req,
+ resp,
+ getServletContext(),
+ invoker,
+ buffer);
+
+ //
+ PageNavigationalState pageState = null;
+ if (context.getRequest() != null)
+ {
+ ControllerResponse controllerResponse;
+ try
+ {
+ controllerResponse = new PortletController().process(context.getRequest());
+ }
+ catch (PortletInvokerException e)
+ {
+ throw new ServletException(e);
+ }
+
+ //
+ if (controllerResponse instanceof PageUpdateResponse)
+ {
+ PageUpdateResponse pageUpdate = (PageUpdateResponse)controllerResponse;
+ pageState = pageUpdate.getPageState();
+ }
+ else if (controllerResponse instanceof ResourceResponse)
+ {
+ ResourceResponse resourceResponse = (ResourceResponse)controllerResponse;
+ PortletInvocationResponse pir = resourceResponse.response;
+
+ //
+ if (pir instanceof FragmentResponse)
+ {
+ FragmentResponse fragment = (FragmentResponse)pir;
+
+ //
+ if (fragment.getType() == FragmentResponse.TYPE_EMPTY)
+ {
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ }
+ else
+ {
+ String contentType = fragment.getContentType();
+ if (contentType != null)
+ {
+ resp.setContentType(contentType);
+ }
+
+ //
+ if (fragment.getType() == FragmentResponse.TYPE_BYTES)
+ {
+ ServletOutputStream out = null;
+ try
+ {
+ out = resp.getOutputStream();
+ out.write(fragment.getBytes().toByteArray());
+ }
+ finally
+ {
+ IOTools.safeClose(out);
+ }
+ }
+ else
+ {
+ Writer writer = null;
+ try
+ {
+ writer = resp.getWriter();
+ writer.write(fragment.getChars().toString());
+ }
+ finally
+ {
+ writer.close();
+ }
+ }
+ }
+ }
+ else
+ {
+ // todo
+ }
+ }
+ else
+ {
+ // todo
+ }
+ }
+
+ //
+ Page page = context.getPage();
+
+ //
+ Map<String, PortletInvocationResponse> responses = page.render(context,
pageState);
+
+ //
+ OutputStream out = resp.getOutputStream();
+ OutputStreamWriter writer = new OutputStreamWriter(out);
+
+ //
+ int count = 0;
+ for (Chunk chunk : page.getChunks())
+ {
+ if (chunk instanceof BytesChunk)
+ {
+ BytesChunk bytesChunk = (BytesChunk)chunk;
+ out.write(bytesChunk.getBytes());
+ out.flush();
+ }
+ else if (chunk instanceof CharsChunk)
+ {
+ CharsChunk bytesChunk = (CharsChunk)chunk;
+ writer.write(bytesChunk.getChars());
+ writer.flush();
+ }
+ else if (chunk instanceof PortletChunk)
+ {
+ PortletChunk portletChunk = (PortletChunk)chunk;
+ String windowId = "" + count++;
+
+ PortletInvocationResponse response = responses.get(windowId);
+ if (response != null)
+ {
+ if (response instanceof FragmentResponse)
+ {
+ FragmentResponse fragment = (FragmentResponse)response;
+ if (fragment.getType() != FragmentResponse.TYPE_EMPTY)
+ {
+ String frag;
+ if (fragment.getType() == FragmentResponse.TYPE_BYTES)
+ {
+ frag = fragment.getBytes().toString();
+ }
+ else
+ {
+ frag = fragment.getChars().toString();
+ }
+
+ //
+ writer.write(frag);
+ writer.flush();
+ }
+ }
+ else
+ {
+ writer.write(response.getClass().getSimpleName() + "[" +
portletChunk.getPortletName() + "," + portletChunk.getApplicationName() +
"]");
+ writer.flush();
+ }
+ }
+ else
+ {
+ writer.write("Empty[" + portletChunk.getPortletName() +
"," + portletChunk.getApplicationName() + "]");
+ writer.flush();
+ }
+ }
+ }
+ out.close();
+ }
+}
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/Page.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/Page.java 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/Page.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -26,13 +26,7 @@
import org.jboss.portal.portlet.controller.PortletControllerContext;
import org.jboss.portal.portlet.controller.state.PageNavigationalState;
import org.jboss.portal.portlet.test.jsp.response.Chunk;
-import org.jboss.portal.portlet.test.jsp.response.PortletChunk;
-import org.jboss.portal.portlet.Portlet;
-import org.jboss.portal.portlet.PortletInvokerException;
-import org.jboss.portal.portlet.info.PortletInfo;
-import javax.servlet.ServletException;
-import javax.xml.namespace.QName;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
@@ -45,22 +39,15 @@
{
/** . */
- public static final QName PAGE_ID_NAME = new
QName("urn:jboss-portlet-container", "pageid");
-
- /** . */
private Map<String, Window> windows;
/** . */
private List<Chunk> chunks;
- /** . */
- private final String pageId;
-
- public Page(List<Chunk> chunks, Map<String, Window> windows, String
pageId)
+ public Page(List<Chunk> chunks, Map<String, Window> windows)
{
this.chunks = chunks;
this.windows = windows;
- this.pageId = pageId;
}
public List<Chunk> getChunks()
@@ -78,7 +65,6 @@
if (pageState == null)
{
pageState = context.getStateControllerContext().createPageState();
- pageState.setPublicNavigationalState(PAGE_ID_NAME, new String[]{pageId});
}
//
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/PagePortletControllerContext.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/PagePortletControllerContext.java 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/jsp/PagePortletControllerContext.java 2008-02-06
23:47:22 UTC (rev 9816)
@@ -33,9 +33,6 @@
import org.jboss.portal.portlet.info.PortletInfo;
import org.jboss.portal.portlet.controller.event.EventControllerContext;
import org.jboss.portal.portlet.controller.impl.event.EventControllerContextImpl;
-import org.jboss.portal.portlet.controller.request.PortletRequest;
-import org.jboss.portal.portlet.controller.request.PageScopedFullPortletResourceRequest;
-import org.jboss.portal.portlet.controller.state.PageNavigationalState;
import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
import org.jboss.portal.portlet.invocation.PortletInvocation;
import org.jboss.portal.web.IllegalRequestException;
@@ -44,7 +41,6 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
-import javax.servlet.RequestDispatcher;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
@@ -69,53 +65,12 @@
HttpServletRequest req,
HttpServletResponse resp,
ServletContext servletContext,
- PortletInvoker invoker)
+ PortletInvoker invoker,
+ ResponseBuffer buffer)
throws IllegalRequestException, IOException, ClassNotFoundException,
ServletException
{
super(req, resp, servletContext);
-
- //
- PageNavigationalState pageState = null;
- if (getRequest() instanceof PortletRequest)
- {
- PortletRequest request = (PortletRequest)getRequest();
- pageState = request.getPageState();
- }
- else if (getRequest() instanceof PageScopedFullPortletResourceRequest)
- {
- PageScopedFullPortletResourceRequest request =
(PageScopedFullPortletResourceRequest)getRequest();
- pageState = request.getPageState();
- }
-
- //
- String pageId = null;
- if (pageState != null)
- {
- String[] values = pageState.getPublicNavigationalState(Page.PAGE_ID_NAME);
- if (values != null && values.length > 0)
- {
- pageId = values[0];
- }
- }
- if (pageId == null)
- {
- pageId = "/index.jsp";
- }
-
- //
- RequestDispatcher dispatcher = req.getRequestDispatcher(pageId);
-
- //
- BufferingResponse bufferingResponse = new BufferingResponse(resp);
-
- //
- dispatcher.include(req, bufferingResponse);
-
- //
- ResponseBuffer buffer = bufferingResponse.getBuffer();
- buffer.close();
-
// Collect portlets to create the page
int counter = 0;
Map<String, Window> windows = new HashMap<String, Window>();
@@ -150,7 +105,7 @@
}
//
- this.page = new Page(buffer.getChunks(), windows, pageId);
+ this.page = new Page(buffer.getChunks(), windows);
this.invoker = invoker;
this.eventControllerContext = new EventControllerContextImpl(invoker);
}
Modified: modules/portlet/trunk/test/src/test/resources/simple-portal-war/WEB-INF/web.xml
===================================================================
---
modules/portlet/trunk/test/src/test/resources/simple-portal-war/WEB-INF/web.xml 2008-02-06
22:58:00 UTC (rev 9815)
+++
modules/portlet/trunk/test/src/test/resources/simple-portal-war/WEB-INF/web.xml 2008-02-06
23:47:22 UTC (rev 9816)
@@ -26,6 +26,14 @@
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
+ <filter>
+ <filter-name>ControllerFilter</filter-name>
+
<filter-class>org.jboss.portal.portlet.test.jsp.ControllerFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>ControllerFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
<listener>
<listener-class>org.jboss.portal.common.mc.bootstrap.WebBootstrap</listener-class>
</listener>
@@ -38,16 +46,8 @@
<servlet-name>PortalServlet</servlet-name>
<servlet-class>org.jboss.portal.simple.SimplePortalServlet</servlet-class>
</servlet>
- <servlet>
- <servlet-name>ControllerServlet</servlet-name>
-
<servlet-class>org.jboss.portal.portlet.test.jsp.ControllerServlet</servlet-class>
- </servlet>
<servlet-mapping>
<servlet-name>PortalServlet</servlet-name>
- <url-pattern>/</url-pattern>
+ <url-pattern>/simple</url-pattern>
</servlet-mapping>
- <servlet-mapping>
- <servlet-name>ControllerServlet</servlet-name>
- <url-pattern>/jsp/*</url-pattern>
- </servlet-mapping>
</web-app>