You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ni...@apache.org on 2007/08/09 17:36:53 UTC

svn commit: r564246 - /struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/

Author: nilsga
Date: Thu Aug  9 08:36:52 2007
New Revision: 564246

URL: http://svn.apache.org/viewvc?view=rev&rev=564246
Log:
WW-1989,WW-2053 Provide "mock" implentation of servlet classes wrapping the portlet classes. Eases reuse of components/interceptors that has references to servlet api objects.

Added:
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletHttpSession.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletConfig.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletContext.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletInputStream.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletOutputStream.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequest.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequestDispatcher.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java
    struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/package.html

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletHttpSession.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletHttpSession.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletHttpSession.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletHttpSession.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,214 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import javax.portlet.PortletSession;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionContext;
+
+/**
+ * Wrapper object exposing a {@link PortletSession} as a {@link HttpSession} instance.
+ * Clients accessing this session object will in fact operate on the
+ * {@link PortletSession} object wrapped by this session object.
+ */
+public class PortletHttpSession implements HttpSession {
+
+	private PortletSession portletSession;
+
+	public PortletHttpSession(PortletSession portletSession) {
+		this.portletSession = portletSession;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getAttribute(java.lang.String)
+	 */
+	public Object getAttribute(String name) {
+		return portletSession.getAttribute(name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getAttributeNames()
+	 */
+	public Enumeration getAttributeNames() {
+		return portletSession.getAttributeNames();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getCreationTime()
+	 */
+	public long getCreationTime() {
+		return portletSession.getCreationTime();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getId()
+	 */
+	public String getId() {
+		return portletSession.getId();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getLastAccessedTime()
+	 */
+	public long getLastAccessedTime() {
+		return portletSession.getLastAccessedTime();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getMaxInactiveInterval()
+	 */
+	public int getMaxInactiveInterval() {
+		return portletSession.getMaxInactiveInterval();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getServletContext()
+	 */
+	public ServletContext getServletContext() {
+		return new PortletServletContext(portletSession.getPortletContext());
+	}
+
+	/**
+	 * @see javax.servlet.http.HttpSession#getSessionContext()
+	 * @throws IllegalStateException
+	 *             Not supported in a portlet.
+	 */
+	public HttpSessionContext getSessionContext() {
+		throw new IllegalStateException("Not supported in a portlet");
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getValue(java.lang.String)
+	 */
+	public Object getValue(String name) {
+		return getAttribute(name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#getValueNames()
+	 */
+	public String[] getValueNames() {
+		List<String> names = new ArrayList<String>();
+		Enumeration attrNames = getAttributeNames();
+		while (attrNames.hasMoreElements()) {
+			names.add((String) attrNames.nextElement());
+		}
+		return names.toArray(new String[0]);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#invalidate()
+	 */
+	public void invalidate() {
+		portletSession.invalidate();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#isNew()
+	 */
+	public boolean isNew() {
+		return portletSession.isNew();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#putValue(java.lang.String,
+	 *      java.lang.Object)
+	 */
+	public void putValue(String name, Object value) {
+		setAttribute(name, value);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)
+	 */
+	public void removeAttribute(String name) {
+		portletSession.removeAttribute(name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#removeValue(java.lang.String)
+	 */
+	public void removeValue(String name) {
+		removeAttribute(name);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#setAttribute(java.lang.String,
+	 *      java.lang.Object)
+	 */
+	public void setAttribute(String name, Object value) {
+		portletSession.setAttribute(name, value);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see javax.servlet.http.HttpSession#setMaxInactiveInterval(int)
+	 */
+	public void setMaxInactiveInterval(int interval) {
+		portletSession.setMaxInactiveInterval(interval);
+	}
+
+	/**
+	 * Get the wrapped portlet session.
+	 * 
+	 * @return The wrapped portlet session.
+	 */
+	public PortletSession getPortletSession() {
+		return portletSession;
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletConfig.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletConfig.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletConfig.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletConfig.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,81 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.util.Enumeration;
+
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+
+/**
+ * Wrapper object exposing a {@link PortletConfig} as a {@link ServletConfig} instance.
+ * Clients accessing this config object will in fact operate on the
+ * {@link PortletConfig} object wrapped by this config object.
+ */
+public class PortletServletConfig implements ServletConfig {
+
+	private PortletConfig portletConfig;
+	
+	public PortletServletConfig(PortletConfig portletConfig) {
+		this.portletConfig = portletConfig;
+	}
+	
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String)
+	 */
+	public String getInitParameter(String name) {
+		return portletConfig.getInitParameter(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletConfig#getInitParameterNames()
+	 */
+	public Enumeration getInitParameterNames() {
+		return portletConfig.getInitParameterNames();
+	}
+
+	/**
+	 * Get the {@link PortletContext} as a {@link PortletServletContext} instance.
+	 * @see javax.servlet.ServletConfig#getServletContext()
+	 */
+	public ServletContext getServletContext() {
+		return new PortletServletContext(portletConfig.getPortletContext());
+	}
+
+	/**
+	 * Will return the portlet name.
+	 * @see javax.servlet.ServletConfig#getServletName()
+	 */
+	public String getServletName() {
+		return portletConfig.getPortletName();
+	}
+	
+	/**
+	 * Get the wrapped {@link PortletConfig} instance.
+	 * @return The wrapped {@link PortletConfig} instance.
+	 */
+	public PortletConfig getPortletConfig() {
+		return portletConfig;
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletContext.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletContext.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletContext.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletContext.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,235 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Set;
+
+import javax.portlet.PortletContext;
+import javax.portlet.PortletRequestDispatcher;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+/**
+ * Wrapper object exposing a {@link PortletContext} as a {@link ServletContext} instance.
+ * Clients accessing this context object will in fact operate on the
+ * {@link PortletContext} object wrapped by this context object.
+ */
+public class PortletServletContext implements ServletContext {
+
+	private PortletContext portletContext;
+	
+	public PortletServletContext(PortletContext portletContext) {
+		this.portletContext = portletContext;
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
+	 */
+	public Object getAttribute(String name) {
+		return portletContext.getAttribute(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getAttributeNames()
+	 */
+	public Enumeration getAttributeNames() {
+		return portletContext.getAttributeNames();
+	}
+
+	/**
+	 * @see javax.servlet.ServletContext#getContext(java.lang.String)
+	 * @throws IllegalStateException Not supported in a portlet.
+	 */
+	public ServletContext getContext(String uripath) {
+		throw new IllegalStateException("Not supported in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
+	 */
+	public String getInitParameter(String name) {
+		return portletContext.getInitParameter(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getInitParameterNames()
+	 */
+	public Enumeration getInitParameterNames() {
+		return portletContext.getInitParameterNames();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getMajorVersion()
+	 */
+	public int getMajorVersion() {
+		return portletContext.getMajorVersion();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
+	 */
+	public String getMimeType(String file) {
+		return portletContext.getMimeType(file);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getMinorVersion()
+	 */
+	public int getMinorVersion() {
+		return portletContext.getMinorVersion();
+	}
+
+	/**
+	 * Returns a {@link PortletServletRequestDispatcher} wrapping the {@link PortletRequestDispatcher}
+	 * as a {@link RequestDispatcher} instance.
+	 * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
+	 * @return PortletServletRequestDispatcher
+	 */
+	public RequestDispatcher getNamedDispatcher(String name) {
+		return new PortletServletRequestDispatcher(portletContext.getNamedDispatcher(name));
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
+	 */
+	public String getRealPath(String path) {
+		return portletContext.getRealPath(path);
+	}
+
+	/**
+	 * Returns a {@link PortletServletRequestDispatcher} wrapping the {@link PortletRequestDispatcher}
+	 * as a {@link RequestDispatcher} instance.
+	 * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
+	 * @return PortletServletRequestDispatcher
+	 */
+	public RequestDispatcher getRequestDispatcher(String path) {
+		return new PortletServletRequestDispatcher(portletContext.getRequestDispatcher(path));
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getResource(java.lang.String)
+	 */
+	public URL getResource(String path) throws MalformedURLException {
+		return portletContext.getResource(path);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
+	 */
+	public InputStream getResourceAsStream(String path) {
+		return portletContext.getResourceAsStream(path);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
+	 */
+	public Set getResourcePaths(String path) {
+		return portletContext.getResourcePaths(path);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getServerInfo()
+	 */
+	public String getServerInfo() {
+		return portletContext.getServerInfo();
+	}
+
+	/**
+	 * @see javax.servlet.ServletContext#getServlet(java.lang.String)
+	 * @throws IllegalStateException Not supported in a portlet.
+	 */
+	public Servlet getServlet(String name) throws ServletException {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#getServletContextName()
+	 */
+	public String getServletContextName() {
+		return portletContext.getPortletContextName();
+	}
+
+	/**
+	 * @see javax.servlet.ServletContext#getServletNames()
+ 	 * @throws IllegalStateException Not supported in a portlet.
+	 */
+	public Enumeration getServletNames() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * @see javax.servlet.ServletContext#getServlets()
+	 * @throws IllegalStateException Not supported in a portlet.
+	 */
+	public Enumeration getServlets() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#log(java.lang.String)
+	 */
+	public void log(String msg) {
+		portletContext.log(msg);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String)
+	 */
+	public void log(Exception exception, String msg) {
+		log(msg, exception);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable)
+	 */
+	public void log(String message, Throwable throwable) {
+		portletContext.log(message, throwable);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
+	 */
+	public void removeAttribute(String name) {
+		portletContext.removeAttribute(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
+	 */
+	public void setAttribute(String name, Object object) {
+		portletContext.setAttribute(name, object);
+	}
+	
+	/**
+	 * Get the wrapped {@link PortletContext} instance.
+	 * @return The wrapped {@link PortletContext} instance.
+	 */
+	public PortletContext getPortletContext() {
+		return portletContext;
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletInputStream.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletInputStream.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletInputStream.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletInputStream.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,121 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletInputStream;
+
+/**
+ * Wrapper object exposing a {@link InputStream} from a portlet as a {@link ServletInputStream} instance.
+ * Clients accessing this stream object will in fact operate on the
+ * {@link InputStream} object wrapped by this stream object.
+ */
+public class PortletServletInputStream extends ServletInputStream {
+
+	private InputStream portletInputStream;
+	
+	public PortletServletInputStream(InputStream portletInputStream) {
+		this.portletInputStream = portletInputStream;
+	}
+	
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#read()
+	 */
+	@Override
+	public int read() throws IOException {
+		return portletInputStream.read();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#available()
+	 */
+	@Override
+	public int available() throws IOException {
+		return portletInputStream.available();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#close()
+	 */
+	@Override
+	public void close() throws IOException {
+		portletInputStream.close();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#mark(int)
+	 */
+	@Override
+	public synchronized void mark(int readlimit) {
+		portletInputStream.mark(readlimit);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#markSupported()
+	 */
+	@Override
+	public boolean markSupported() {
+		return portletInputStream.markSupported();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#read(byte[], int, int)
+	 */
+	@Override
+	public int read(byte[] b, int off, int len) throws IOException {
+		return portletInputStream.read(b, off, len);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#read(byte[])
+	 */
+	@Override
+	public int read(byte[] b) throws IOException {
+		return portletInputStream.read(b);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#reset()
+	 */
+	@Override
+	public synchronized void reset() throws IOException {
+		portletInputStream.reset();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.InputStream#skip(long)
+	 */
+	@Override
+	public long skip(long n) throws IOException {
+		return portletInputStream.skip(n);
+	}
+	
+	/**
+	 * Get the wrapped {@link InputStream} instance.
+	 * @return The wrapped {@link InputStream} instance.
+	 */
+	public InputStream getInputStream() {
+		return portletInputStream;
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletOutputStream.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletOutputStream.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletOutputStream.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletOutputStream.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,88 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.servlet.ServletOutputStream;
+
+/**
+ * Wrapper object exposing a {@link OutputStream} from a portlet as a {@link ServletOutputStream} instance.
+ * Clients accessing this stream object will in fact operate on the
+ * {@link OutputStream} object wrapped by this stream object.
+ */
+public class PortletServletOutputStream extends ServletOutputStream {
+
+	private OutputStream portletOutputStream;
+	
+	public PortletServletOutputStream(OutputStream portletOutputStream) {
+		this.portletOutputStream = portletOutputStream;
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.OutputStream#write(int)
+	 */
+	@Override
+	public void write(int ch) throws IOException {
+		portletOutputStream.write(ch);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.OutputStream#close()
+	 */
+	@Override
+	public void close() throws IOException {
+		portletOutputStream.close();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.OutputStream#flush()
+	 */
+	@Override
+	public void flush() throws IOException {
+		portletOutputStream.flush();
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.OutputStream#write(byte[])
+	 */
+	@Override
+	public void write(byte[] b) throws IOException {
+		portletOutputStream.write(b);
+	}
+
+	/* (non-Javadoc)
+	 * @see java.io.OutputStream#write(byte[], int, int)
+	 */
+	@Override
+	public void write(byte[] b, int off, int len) throws IOException {
+		portletOutputStream.write(b, off, len);
+	}
+	
+	/**
+	 * Get the wrapped {@link OutputStream} instance.
+	 * @return The wrapped {@link OutputStream} instance.
+	 */
+	public OutputStream getOutputStream() {
+		return portletOutputStream;
+	}
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequest.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequest.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequest.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,558 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.PortletContext;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletRequestDispatcher;
+import javax.portlet.PortletSession;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.struts2.portlet.PortletActionConstants;
+
+/**
+ * Wrapper object exposing a {@link PortletRequest} as a {@link HttpServletRequest} instance.
+ * Clients accessing this request object will in fact operate on the
+ * {@link PortletRequest} object wrapped by this request object.
+ */
+public class PortletServletRequest implements HttpServletRequest, PortletActionConstants {
+
+	private PortletRequest portletRequest;
+	private PortletContext portletContext;
+	
+	public PortletServletRequest(PortletRequest portletRequest, PortletContext portletContext) {
+		this.portletRequest = portletRequest;
+		this.portletContext = portletContext;
+	}
+	
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getAuthType()
+	 */
+	public String getAuthType() {
+		return portletRequest.getAuthType();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getContextPath()
+	 */
+	public String getContextPath() {
+		return portletRequest.getContextPath();
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public Cookie[] getCookies() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getCookies();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public long getDateHeader(String name) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Gets a property from the {@link PortletRequest}. Note that a {@link PortletRequest} is not 
+	 * guaranteed to map properties to headers.
+	 * @see PortletRequest#getProperty(String)
+	 * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
+	 */
+	public String getHeader(String name) {
+		return portletRequest.getProperty(name);
+	}
+
+	/**
+	 * Gets the property names from the {@link PortletRequest}. Note that a {@link PortletRequest} is not 
+	 * guaranteed to map properties to headers.
+	 * @see PortletRequest#getPropertyNames()
+	 * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
+	 */
+	public Enumeration getHeaderNames() {
+		return portletRequest.getPropertyNames();
+	}
+
+	/**
+	 * Gets the values for the specified property from the {@link PortletRequest}. Note that a 
+	 * {@link PortletRequest} is not guaranteed to map properties to headers.
+	 * @see PortletRequest#getProperties(String)
+	 * @see HttpServletRequest#getHeaders(String)
+	 */
+	public Enumeration getHeaders(String name) {
+		return portletRequest.getProperties(name);
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public int getIntHeader(String name) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getMethod()
+	 */
+	public String getMethod() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getPathInfo()
+	 */
+	public String getPathInfo() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
+	 */
+	public String getPathTranslated() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getQueryString()
+	 */
+	public String getQueryString() {
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
+	 */
+	public String getRemoteUser() {
+		return portletRequest.getRemoteUser();
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getRequestURI() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public StringBuffer getRequestURL() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
+	 */
+	public String getRequestedSessionId() {
+		return portletRequest.getRequestedSessionId();
+	}
+
+	/**
+	 * A {@link PortletRequest} has no servlet path. But for compatibility with Struts 2 components and
+	 * interceptors, the action parameter on the request is mapped to the servlet path.
+	 * @see javax.servlet.http.HttpServletRequest#getServletPath()
+	 */
+	public String getServletPath() {
+		String actionPath = getParameter(ACTION_PARAM);
+		if(actionPath != null && !actionPath.endsWith(".action")) {
+			actionPath += ".action";
+		}
+		return actionPath;
+	}
+
+	/**
+	 * Get the {@link PortletSession} as a {@link PortletHttpSession} instance.
+	 * @see javax.servlet.http.HttpServletRequest#getSession()
+	 */
+	public HttpSession getSession() {
+		return new PortletHttpSession(portletRequest.getPortletSession());
+	}
+
+	/**
+	 * Get the {@link PortletSession} as a {@link PortletHttpSession} instance.
+	 * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
+	 */
+	public HttpSession getSession(boolean create) {
+		return new PortletHttpSession(portletRequest.getPortletSession(create));
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
+	 */
+	public Principal getUserPrincipal() {
+		return portletRequest.getUserPrincipal();
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public boolean isRequestedSessionIdFromCookie() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public boolean isRequestedSessionIdFromURL() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public boolean isRequestedSessionIdFromUrl() {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
+	 */
+	public boolean isRequestedSessionIdValid() {
+		return portletRequest.isRequestedSessionIdValid();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
+	 */
+	public boolean isUserInRole(String role) {
+		return portletRequest.isUserInRole(role);
+	}
+
+	/**
+	 * Gets an attribute value on the {@link PortletRequest}. If the attribute name is 
+	 * <tt>javax.servlet.include.servlet_path</tt>, it returns the same as
+	 * {@link PortletServletRequest#getServletPath()}
+	 * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
+	 */
+	public Object getAttribute(String name) {
+		if("javax.servlet.include.servlet_path".equals(name)) {
+			return getServletPath();
+		}
+		else {
+			return portletRequest.getAttribute(name);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getAttributeNames()
+	 */
+	public Enumeration getAttributeNames() {
+		return portletRequest.getAttributeNames();
+	}
+
+	/**
+	 * Can only be invoked in the event phase.
+	 * @see ServletRequest#getCharacterEncoding()
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public String getCharacterEncoding() {
+		if(portletRequest instanceof ActionRequest) {
+			return ((ActionRequest)portletRequest).getCharacterEncoding();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+
+	/**
+	 * Can only be invoked in the event phase.
+	 * @see ServletRequest#getContentLength()
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public int getContentLength() {
+		if(portletRequest instanceof ActionRequest) {
+			return ((ActionRequest)portletRequest).getContentLength();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+
+	/**
+	 * Can only be invoked in the event phase.
+	 * @see ServletRequest#getContentType()
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public String getContentType() {
+		if(portletRequest instanceof ActionRequest) {
+			return ((ActionRequest)portletRequest).getContentType();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+
+	/**
+	 * Can only be invoked in the event phase. When invoked in the event phase, it will wrap the
+	 * portlet's {@link InputStream} as a {@link PortletServletInputStream}.
+	 * @see ServletRequest#getInputStream()
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public ServletInputStream getInputStream() throws IOException {
+		if(portletRequest instanceof ActionRequest) {
+			return new PortletServletInputStream(((ActionRequest)portletRequest).getPortletInputStream());
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getLocalAddr() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getLocalAddr();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getLocalName() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getLocalName();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public int getLocalPort() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getLocalPort();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getLocale()
+	 */
+	public Locale getLocale() {
+		return portletRequest.getLocale();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getLocales()
+	 */
+	public Enumeration getLocales() {
+		return portletRequest.getLocales();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
+	 */
+	public String getParameter(String name) {
+		return portletRequest.getParameter(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getParameterMap()
+	 */
+	public Map getParameterMap() {
+		return portletRequest.getParameterMap();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getParameterNames()
+	 */
+	public Enumeration getParameterNames() {
+		return portletRequest.getParameterNames();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
+	 */
+	public String[] getParameterValues(String name) {
+		return portletRequest.getParameterValues(name);
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getProtocol() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getProtocol();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Can only be invoked in the event phase.
+	 * @see ServletRequest#getReader()
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public BufferedReader getReader() throws IOException {
+		if(portletRequest instanceof ActionRequest) {
+			return ((ActionRequest)portletRequest).getReader();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
+	 */
+	public String getRealPath(String path) {
+		return portletContext.getRealPath(path);
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getRemoteAddr() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getRemoteAddr();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public String getRemoteHost() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getRemoteHost();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public int getRemotePort() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getRemotePort();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/**
+	 * Get the {@link PortletRequestDispatcher} as a {@link PortletServletRequestDispatcher} instance.
+	 * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
+	 */
+	public RequestDispatcher getRequestDispatcher(String path) {
+		return new PortletServletRequestDispatcher(portletContext.getRequestDispatcher(path));
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getScheme()
+	 */
+	public String getScheme() {
+		return portletRequest.getScheme();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#getServerName()
+	 */
+	public String getServerName() {
+		return portletRequest.getServerName();
+	}
+
+	/**
+	 * Not allowed in a portlet. 
+	 * @throws IllegalStateException Not allowed in a portlet.
+	 */
+	public int getServerPort() {
+		if(portletRequest instanceof HttpServletRequest) {
+			return ((HttpServletRequest)portletRequest).getServerPort();
+		}
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#isSecure()
+	 */
+	public boolean isSecure() {
+		return portletRequest.isSecure();
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
+	 */
+	public void removeAttribute(String name) {
+		portletRequest.removeAttribute(name);
+	}
+
+	/* (non-Javadoc)
+	 * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
+	 */
+	public void setAttribute(String name, Object o) {
+		portletRequest.setAttribute(name, o);
+	}
+
+	/**
+	 * Can only be invoked in the event phase.
+	 * @see ServletRequest#setCharacterEncoding(String)
+	 * @throws IllegalStateException If the portlet is not in the event phase.
+	 */
+	public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
+		if(portletRequest instanceof ActionRequest) {
+			((ActionRequest)portletRequest).setCharacterEncoding(env);
+		}
+		else {
+			throw new IllegalStateException("Not allowed in render phase");
+		}
+	}
+	
+	/**
+	 * Get the wrapped {@link PortletRequest} instance. 
+	 * @return The wrapped {@link PortletRequest} instance.
+	 */
+	public PortletRequest getPortletRequest() {
+		return portletRequest;
+	}
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequestDispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequestDispatcher.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequestDispatcher.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletRequestDispatcher.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,70 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.IOException;
+
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletRequestDispatcher;
+import javax.portlet.PortletResponse;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class PortletServletRequestDispatcher implements RequestDispatcher {
+
+	private PortletRequestDispatcher portletRequestDispatcher;
+	
+	public PortletServletRequestDispatcher(PortletRequestDispatcher portletRequestDispatcher) {
+		this.portletRequestDispatcher = portletRequestDispatcher;
+	}
+
+	public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException {
+		throw new IllegalStateException("Not allowed in a portlet");
+		
+	}
+
+	public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException {
+		if(request instanceof PortletServletRequest && response instanceof PortletServletResponse) {
+			PortletRequest req = ((PortletServletRequest)request).getPortletRequest();
+			PortletResponse resp = ((PortletServletResponse)response).getPortletResponse();
+			if(req instanceof RenderRequest && resp instanceof RenderResponse) {
+				try {
+					portletRequestDispatcher.include((RenderRequest)req, (RenderResponse)resp);
+				}
+				catch(PortletException e) {
+					throw new ServletException(e);
+				}
+			}
+			else {
+				throw new IllegalStateException("Can only be invoked in the render phase");
+			}
+		}
+		else {
+			throw new IllegalStateException("Can only be invoked in a portlet");
+		}
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/PortletServletResponse.java Thu Aug  9 08:36:52 2007
@@ -0,0 +1,233 @@
+/*
+ * $Id: $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.struts2.portlet.servlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import javax.portlet.PortletResponse;
+import javax.portlet.RenderResponse;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+public class PortletServletResponse implements HttpServletResponse {
+
+	private PortletResponse portletResponse;
+	
+	public PortletServletResponse(PortletResponse portletResponse) {
+		this.portletResponse = portletResponse;
+	}
+	
+	public void addCookie(Cookie cookie) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void addDateHeader(String name, long date) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void addHeader(String name, String value) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void addIntHeader(String name, int value) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public boolean containsHeader(String name) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public String encodeRedirectURL(String url) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public String encodeRedirectUrl(String url) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public String encodeURL(String url) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public String encodeUrl(String url) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void sendError(int sc) throws IOException {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void sendError(int sc, String msg) throws IOException {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void sendRedirect(String location) throws IOException {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setDateHeader(String name, long date) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setHeader(String name, String value) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setIntHeader(String name, int value) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setStatus(int sc) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setStatus(int sc, String sm) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void flushBuffer() throws IOException {
+		if(portletResponse instanceof RenderResponse) {
+			((RenderResponse)portletResponse).flushBuffer();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public int getBufferSize() {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).getBufferSize();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public String getCharacterEncoding() {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).getCharacterEncoding();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public String getContentType() {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).getContentType();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public Locale getLocale() {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).getLocale();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public ServletOutputStream getOutputStream() throws IOException {
+		if(portletResponse instanceof RenderResponse) {
+			return new PortletServletOutputStream(((RenderResponse)portletResponse).getPortletOutputStream());
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public PrintWriter getWriter() throws IOException {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).getWriter();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public boolean isCommitted() {
+		if(portletResponse instanceof RenderResponse) {
+			return ((RenderResponse)portletResponse).isCommitted();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public void reset() {
+		if(portletResponse instanceof RenderResponse) {
+			((RenderResponse)portletResponse).reset();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public void resetBuffer() {
+		if(portletResponse instanceof RenderResponse) {
+			((RenderResponse)portletResponse).resetBuffer();
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public void setBufferSize(int size) {
+		if(portletResponse instanceof RenderResponse) {
+			((RenderResponse)portletResponse).setBufferSize(size);
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public void setCharacterEncoding(String charset) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setContentLength(int len) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public void setContentType(String type) {
+		if(portletResponse instanceof RenderResponse) {
+			((RenderResponse)portletResponse).setContentType(type);
+		}
+		else {
+			throw new IllegalStateException("Not allowed in event phase");
+		}
+	}
+
+	public void setLocale(Locale loc) {
+		throw new IllegalStateException("Not allowed in a portlet");
+	}
+
+	public PortletResponse getPortletResponse() {
+		return portletResponse;
+	}
+
+}

Added: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/package.html
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/package.html?view=auto&rev=564246
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/package.html (added)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/servlet/package.html Thu Aug  9 08:36:52 2007
@@ -0,0 +1,27 @@
+<!--
+/*
+ * $Id: package.html 559206 2007-07-24 21:01:18Z apetrelli $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+-->
+<body>
+	Portlet wrapper objects for some of the servlet api objects. The wrappers simply delegate to the 
+	underlying, corresponding portlet objects. The portlet wrapper objects makes it easier to reuse 
+	interceptors and components from struts2 core.
+</body>
\ No newline at end of file