Author: julien(a)jboss.com
Date: 2008-02-26 18:28:54 -0500 (Tue, 26 Feb 2008)
New Revision: 10124
Added:
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/IncludeMarkupFileTestCase.java
modules/portlet/trunk/test/src/test/resources/jsr286/ext/dispatcher-war/file.html
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchedHttpServletRequest.java
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchtedRequestDispatcher.java
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/PortletRequestDispatcherImpl.java
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/FiltersTestCase.java
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/ResourceRenderer.java
Log:
- reimplement request dispatching to use include (since it's the only way to get the
proper required informations)
- added a test case for request dispatch to a file
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchedHttpServletRequest.java
===================================================================
---
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchedHttpServletRequest.java 2008-02-26
23:13:42 UTC (rev 10123)
+++
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchedHttpServletRequest.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -22,9 +22,9 @@
******************************************************************************/
package org.jboss.portal.portlet.impl.jsr168;
-import org.jboss.portal.common.http.QueryStringParser;
import org.jboss.portal.common.util.Tools;
import org.jboss.portal.common.util.ParameterMap;
+import org.jboss.portal.common.http.QueryStringParser;
import org.jboss.portal.portlet.impl.jsr168.api.PortletRequestImpl;
import javax.servlet.RequestDispatcher;
@@ -46,7 +46,6 @@
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
-import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
@@ -121,10 +120,10 @@
private final int sessionScope;
/** . */
- private final LinkedList<Map<String, String>> containerAttributesStack;
+ private final LinkedList<Dispatch> dispatches;
/** . */
- private final String[] infos;
+ private String[] infos;
/** . */
private final ServletContext servletContext;
@@ -154,15 +153,25 @@
this.preq = preq;
this.dreq = dreq;
this.servletContext = servletContext;
- this.containerAttributesStack = new LinkedList<Map<String, String>>();
+ this.dispatches = new LinkedList<Dispatch>();
this.sessionScope = sessionScope;
// Push dispatch
- this.infos = pushDispatch(dispatch);
+ /*this.infos =*/ pushDispatch(dispatch);
//
- String[] containerKeys = dispatchType == DispatchType.INCLUDE ? INCLUDE_KEYS :
FORWARD_KEYS;
- String queryString =
containerAttributesStack.getLast().get(containerKeys[QUERY_STRING]);
+ String queryString = null;
+ String path = dispatch.getPath();
+ if (path != null)
+ {
+ int index = path.indexOf('?');
+ if (index > -1)
+ {
+ queryString = path.substring(index + 1);
+ }
+ }
+
+ //
Map<String, String[]> parameters;
if (queryString != null && queryString.length() > 0)
{
@@ -178,6 +187,7 @@
//
this.parameters = parameters;
+ this.infos = null;
}
// Must return null
@@ -226,11 +236,6 @@
// Must return the path and query string information used to obtain the
PortletRequestDispatcher object
- public final String getPathInfo()
- {
- return infos[PATH_INFO];
- }
-
public final String getPathTranslated()
{
String pathInfo = getPathInfo();
@@ -239,19 +244,52 @@
return pathInfo == null ? null : servletContext.getRealPath(pathInfo);
}
+ public final String getPathInfo()
+ {
+ if (infos != null)
+ {
+ return infos[PATH_INFO];
+ }
+ else
+ {
+ return (String)preq.getAttribute(INCLUDE_KEYS[PATH_INFO]);
+ }
+ }
+
public final String getQueryString()
{
- return infos[QUERY_STRING];
+ if (infos != null)
+ {
+ return infos[QUERY_STRING];
+ }
+ else
+ {
+ return (String)preq.getAttribute(INCLUDE_KEYS[QUERY_STRING]);
+ }
}
public final String getRequestURI()
{
- return infos[REQUEST_URI];
+ if (infos != null)
+ {
+ return infos[REQUEST_URI];
+ }
+ else
+ {
+ return (String)preq.getAttribute(INCLUDE_KEYS[REQUEST_URI]);
+ }
}
public final String getServletPath()
{
- return infos[SERVLET_PATH];
+ if (infos != null)
+ {
+ return infos[SERVLET_PATH];
+ }
+ else
+ {
+ return (String)preq.getAttribute(INCLUDE_KEYS[SERVLET_PATH]);
+ }
}
// Must be equivalent to the method of the PortletRequest
@@ -275,15 +313,55 @@
{
if (s != null)
{
- Map<String, String> containerAttributes =
containerAttributesStack.getLast();
+// Map<String, String> containerAttributes =
containerAttributesStack.getLast();
//
- if (containerAttributes.containsKey(s))
+// if (containerAttributes.containsKey(s))
+// {
+// return containerAttributes.get(s);
+// }
+
+ if (dispatches.getLast().getType() == DispatchType.INCLUDE)
{
- return containerAttributes.get(s);
+ for (String key : INCLUDE_KEYS)
+ {
+ if (key.equals(s))
+ {
+ return preq.getAttribute(key);
+ }
+ }
}
+ else
+ {
+ for (int i = 0;i < FORWARD_KEYS.length;i++)
+ {
+ if (FORWARD_KEYS[i].equals(s))
+ {
+ if (infos != null)
+ {
+ return infos[i];
+ }
+ else
+ {
+ return preq.getAttribute(INCLUDE_KEYS[i]);
+ }
+ }
+ }
+ }
//
+ String[] containerKeys = dispatches.getLast().getType() == DispatchType.FORWARD
? FORWARD_KEYS : INCLUDE_KEYS;
+
+ //
+ for (int i = 0;i < containerKeys.length;i++)
+ {
+ if (containerKeys[i].equals(s))
+ {
+ return preq.getAttribute(INCLUDE_KEYS[i]);
+ }
+ }
+
+ //
if (ALL_CONTAINER_ATTRIBUTES.contains(s))
{
return null;
@@ -306,9 +384,18 @@
names.removeAll(ALL_CONTAINER_ATTRIBUTES);
//
- names.addAll(containerAttributesStack.getLast().keySet());
+ String[] containerKeys = dispatches.getLast().getType() == DispatchType.FORWARD ?
FORWARD_KEYS : INCLUDE_KEYS;
//
+ for (String containerKey : containerKeys)
+ {
+ if (getAttribute(containerKey) != null)
+ {
+ names.add(containerKey);
+ }
+ }
+
+ //
return Collections.enumeration(names);
}
@@ -521,150 +608,170 @@
dreq.setRequest(servletRequest);
}
- public final ServletRequest getRequest()
+ public ServletRequest getRequest()
{
// That's a trick
return dreq.getRequest();
}
- String[] pushDispatch(Dispatch dispatch)
+ void pushDispatch(Dispatch dispatch)
{
- String path = dispatch.getPath();
+ dispatches.addLast(dispatch);
- //
- String[] infos;
- if (path != null)
+ // We need to backup
+ if (dispatches.size() == 2)
{
- infos = build(path);
-
- //
- if (dispatch.getType() == DispatchType.INCLUDE)
+ String[] infos = new String[INCLUDE_KEYS.length];
+ for (int i = 0;i < INCLUDE_KEYS.length;i++)
{
- Map<String, String> containerAttributes = new HashMap<String,
String>();
- for (int i = 0;i < infos.length;i++)
- {
- String value = infos[i];
- if (value != null)
- {
- containerAttributes.put(INCLUDE_KEYS[i], value);
- }
- }
- containerAttributesStack.addLast(containerAttributes);
+ infos[i] = (String)preq.getAttribute(INCLUDE_KEYS[i]);
}
- else
- {
- if (containerAttributesStack.size() == 0)
- {
- Map<String, String> containerAttributes = new HashMap<String,
String>();
- for (int i = 0;i < infos.length;i++)
- {
- String value = infos[i];
- if (value != null)
- {
- containerAttributes.put(FORWARD_KEYS[i], value);
- }
- }
- containerAttributesStack.addLast(containerAttributes);
- }
- else
- {
- Map<String, String> containerAttributes = new HashMap<String,
String>();
- for (int i = 0;i < this.infos.length;i++)
- {
- String value = this.infos[i];
- if (value != null)
- {
- containerAttributes.put(FORWARD_KEYS[i], value);
- }
- }
- containerAttributesStack.addLast(containerAttributes);
- }
- }
+ this.infos = infos;
}
- else
- {
- infos = new String[5];
- //
- Map<String, String> containerAttributes = Collections.emptyMap();
- containerAttributesStack.addLast(containerAttributes);
- }
- //
- return infos;
+// String path = dispatch.getPath();
+//
+// //
+// String[] infos;
+// if (path != null)
+// {
+// infos = build(path);
+//
+// //
+// if (dispatch.getType() == DispatchType.INCLUDE)
+// {
+// Map<String, String> containerAttributes = new HashMap<String,
String>();
+// for (int i = 0;i < infos.length;i++)
+// {
+// String value = infos[i];
+// if (value != null)
+// {
+// containerAttributes.put(INCLUDE_KEYS[i], value);
+// }
+// }
+// containerAttributesStack.addLast(containerAttributes);
+// }
+// else
+// {
+// if (containerAttributesStack.size() == 0)
+// {
+// Map<String, String> containerAttributes = new HashMap<String,
String>();
+// for (int i = 0;i < infos.length;i++)
+// {
+// String value = infos[i];
+// if (value != null)
+// {
+// containerAttributes.put(FORWARD_KEYS[i], value);
+// }
+// }
+// containerAttributesStack.addLast(containerAttributes);
+// }
+// else
+// {
+// Map<String, String> containerAttributes = new HashMap<String,
String>();
+// for (int i = 0;i < this.infos.length;i++)
+// {
+// String value = this.infos[i];
+// if (value != null)
+// {
+// containerAttributes.put(FORWARD_KEYS[i], value);
+// }
+// }
+// containerAttributesStack.addLast(containerAttributes);
+// }
+// }
+// }
+// else
+// {
+// infos = new String[5];
+//
+// //
+// Map<String, String> containerAttributes = Collections.emptyMap();
+// containerAttributesStack.addLast(containerAttributes);
+// }
+//
+// //
+// return infos;
}
- private String[] build(String path)
+// private String[] build(String path)
+// {
+// if (path == null)
+// {
+// throw new IllegalArgumentException();
+// }
+//
+// //
+// String servletPath;
+// String pathInfo;
+// String queryString;
+// int endOfServletPath = path.indexOf('/', 1);
+// if (endOfServletPath == -1)
+// {
+// endOfServletPath = path.indexOf('?', 1);
+// if (endOfServletPath == -1)
+// {
+// servletPath = path;
+// pathInfo = "";
+// queryString = "";
+// }
+// else
+// {
+// servletPath = path.substring(0, endOfServletPath);
+// pathInfo = null;
+// queryString = path.substring(endOfServletPath + 1);
+// }
+// }
+// else
+// {
+// servletPath = path.substring(0, endOfServletPath);
+// int endOfPathInfo = path.indexOf('?', endOfServletPath + 1);
+// if (endOfPathInfo == -1)
+// {
+// pathInfo = path.substring(endOfServletPath);
+// queryString = "";
+// }
+// else
+// {
+// pathInfo = path.substring(endOfServletPath, endOfPathInfo);
+// queryString = path.substring(endOfPathInfo + 1);
+// }
+// }
+//
+// //
+// String[] infos = new String[5];
+//
+// //
+// StringBuffer requestURI = new StringBuffer(preq.getContextPath());
+// requestURI.append(servletPath);
+// if (pathInfo != null)
+// {
+// requestURI.append(pathInfo);
+// infos[PATH_INFO] = pathInfo;
+// }
+//
+// //
+// infos[SERVLET_PATH] = servletPath;
+// infos[QUERY_STRING] = queryString;
+// infos[REQUEST_URI] = requestURI.toString();
+// infos[CONTEXT_PATH] = preq.getContextPath();
+//
+// //
+// return infos;
+// }
+
+ void popDispatch()
{
- if (path == null)
+ if (dispatches.size() == 2)
{
- throw new IllegalArgumentException();
+ infos = null; // We could remove that as it's not going to change, but for
now...
}
//
- String servletPath;
- String pathInfo;
- String queryString;
- int endOfServletPath = path.indexOf('/', 1);
- if (endOfServletPath == -1)
- {
- endOfServletPath = path.indexOf('?', 1);
- if (endOfServletPath == -1)
- {
- servletPath = path;
- pathInfo = "";
- queryString = "";
- }
- else
- {
- servletPath = path.substring(0, endOfServletPath);
- pathInfo = null;
- queryString = path.substring(endOfServletPath + 1);
- }
- }
- else
- {
- servletPath = path.substring(0, endOfServletPath);
- int endOfPathInfo = path.indexOf('?', endOfServletPath + 1);
- if (endOfPathInfo == -1)
- {
- pathInfo = path.substring(endOfServletPath);
- queryString = "";
- }
- else
- {
- pathInfo = path.substring(endOfServletPath, endOfPathInfo);
- queryString = path.substring(endOfPathInfo + 1);
- }
- }
-
- //
- String[] infos = new String[5];
-
- //
- StringBuffer requestURI = new StringBuffer(preq.getContextPath());
- requestURI.append(servletPath);
- if (pathInfo != null)
- {
- requestURI.append(pathInfo);
- infos[PATH_INFO] = pathInfo;
- }
-
- //
- infos[SERVLET_PATH] = servletPath;
- infos[QUERY_STRING] = queryString;
- infos[REQUEST_URI] = requestURI.toString();
- infos[CONTEXT_PATH] = preq.getContextPath();
-
- //
- return infos;
+ dispatches.removeLast();
}
- void popDispatch()
- {
- containerAttributesStack.removeLast();
- }
-
/**
* Returns the an implementation of
<code>javax.servlet.http.HttpSession</code> that wraps this
* portlet session and use the specified scope for manipulating attributes. This
session is used
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchtedRequestDispatcher.java
===================================================================
---
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchtedRequestDispatcher.java 2008-02-26
23:13:42 UTC (rev 10123)
+++
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/DispatchtedRequestDispatcher.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -75,7 +75,7 @@
dreq.pushDispatch(new Dispatch(DispatchType.FORWARD, path));
try
{
- realDispatcher.forward(req, resp);
+ realDispatcher.include(req, resp);
}
finally
{
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/PortletRequestDispatcherImpl.java
===================================================================
---
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/PortletRequestDispatcherImpl.java 2008-02-26
23:13:42 UTC (rev 10123)
+++
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/PortletRequestDispatcherImpl.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -38,6 +38,7 @@
import javax.portlet.ActionRequest;
import javax.portlet.EventRequest;
import javax.portlet.ResourceRequest;
+import javax.portlet.MimeResponse;
import javax.portlet.filter.PortletRequestWrapper;
import javax.portlet.filter.PortletResponseWrapper;
import javax.servlet.RequestDispatcher;
@@ -140,7 +141,24 @@
dispatcher.include(direq, diresp);
break;
case FORWARD:
- dispatcher.forward(direq, diresp);
+
+ if (resp instanceof MimeResponse)
+ {
+ if (((MimeResponse)resp).isCommitted())
+ {
+ throw new IllegalStateException();
+ }
+ ((MimeResponse)resp).resetBuffer();
+ }
+
+ dispatcher.include(direq, diresp);
+
+ // For now here
+ if (resp instanceof MimeResponse)
+ {
+ ((MimeResponse)resp).flushBuffer();
+ }
+
break;
}
}
Modified:
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/FiltersTestCase.java
===================================================================
---
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/FiltersTestCase.java 2008-02-26
23:13:42 UTC (rev 10123)
+++
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/FiltersTestCase.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -25,7 +25,6 @@
import org.jboss.portal.unit.PortletTestCase;
import org.jboss.portal.unit.PortletTestContext;
import org.jboss.portal.unit.actions.PortletRenderTestAction;
-import org.jboss.portal.test.portlet.framework.UTP2;
import org.jboss.portal.test.portlet.framework.UTP1;
import org.jboss.portal.common.util.Tools;
import org.jboss.portal.unit.annotations.TestCase;
@@ -88,7 +87,7 @@
assertNotNull(prd);
ServletFilter.ids.clear();
prd.forward(request, response);
- assertEquals(Tools.toSet("FORWARD_URL_PATTERN_FILTER",
"FORWARD_NAMED_FILTER"), ServletFilter.ids);
+ assertEquals(Tools.toSet("INCLUDE_URL_PATTERN_FILTER",
"INCLUDE_NAMED_FILTER"), ServletFilter.ids);
//
return new InvokeGetResponse(response.createRenderURL().toString());
@@ -102,7 +101,7 @@
assertNotNull(prd);
ServletFilter.ids.clear();
prd.forward(request, response);
- assertEquals(Collections.singleton("FORWARD_NAMED_FILTER"),
ServletFilter.ids);
+ assertEquals(Collections.singleton("INCLUDE_NAMED_FILTER"),
ServletFilter.ids);
//
return new EndTestResponse();
Added:
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/IncludeMarkupFileTestCase.java
===================================================================
---
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/IncludeMarkupFileTestCase.java
(rev 0)
+++
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr286/ext/dispatcher/IncludeMarkupFileTestCase.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -0,0 +1,77 @@
+/******************************************************************************
+ * 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.test.portlet.jsr286.ext.dispatcher;
+
+import org.jboss.portal.unit.PortletTestCase;
+import org.jboss.portal.unit.PortletTestContext;
+import org.jboss.portal.unit.base.AbstractUniversalTestPortlet;
+import org.jboss.portal.unit.annotations.TestCase;
+import org.jboss.portal.unit.actions.PortletRenderTestAction;
+import org.jboss.portal.test.portlet.framework.UTP1;
+import org.jboss.unit.driver.DriverResponse;
+import org.jboss.unit.driver.response.EndTestResponse;
+import static org.jboss.unit.api.Assert.*;
+import org.jboss.unit.remote.driver.handler.http.response.InvokeGetResponse;
+
+import javax.portlet.Portlet;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequestDispatcher;
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:julien@jboss.org">Julien Viet</a>
+ * @version $Revision: 630 $
+ */
+@TestCase
+public class IncludeMarkupFileTestCase
+{
+ public IncludeMarkupFileTestCase(PortletTestCase seq)
+ {
+ seq.bindAction(0, UTP1.RENDER_JOIN_POINT, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws PortletException, IOException
+ {
+ PortletRequestDispatcher dispatcher =
assertNotNull(((AbstractUniversalTestPortlet)portlet).getPortletContext().getRequestDispatcher("/file.html"));
+ dispatcher.include(request, response);
+
+ //
+ return new InvokeGetResponse(response.createRenderURL().toString());
+ }
+ });
+ seq.bindAction(1, UTP1.RENDER_JOIN_POINT, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws PortletException, IOException
+ {
+ String body = new String(context.getResponseBody(), "UTF-8");
+
+ //
+ assertTrue("Expected " + body + " to contain
@DISPATCHED_MARKUP@ token", body.contains("@DISPATCHED_MARKUP@"));
+
+ //
+ return new EndTestResponse();
+ }
+ });
+ }
+}
Modified:
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/ResourceRenderer.java
===================================================================
---
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/ResourceRenderer.java 2008-02-26
23:13:42 UTC (rev 10123)
+++
modules/portlet/trunk/test/src/main/java/org/jboss/portal/portlet/test/controller/ResourceRenderer.java 2008-02-26
23:28:54 UTC (rev 10124)
@@ -51,20 +51,28 @@
protected void renderContent(HttpServletResponse resp) throws IOException
{
+ String contentType = fragment.getContentType();
+ if (contentType != null)
+ {
+ resp.setContentType(contentType);
+ }
+
//
if (fragment.getType() == FragmentResponse.TYPE_EMPTY)
{
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+// resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ ServletOutputStream out = null;
+ try
+ {
+ out = resp.getOutputStream();
+ }
+ finally
+ {
+ IOTools.safeClose(out);
+ }
}
else
{
- String contentType = fragment.getContentType();
- if (contentType != null)
- {
- resp.setContentType(contentType);
- }
-
- //
if (fragment.getType() == FragmentResponse.TYPE_BYTES)
{
ServletOutputStream out = null;
Added: modules/portlet/trunk/test/src/test/resources/jsr286/ext/dispatcher-war/file.html
===================================================================
--- modules/portlet/trunk/test/src/test/resources/jsr286/ext/dispatcher-war/file.html
(rev 0)
+++
modules/portlet/trunk/test/src/test/resources/jsr286/ext/dispatcher-war/file.html 2008-02-26
23:28:54 UTC (rev 10124)
@@ -0,0 +1 @@
+@DISPATCHED_MARKUP@
\ No newline at end of file