You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by at...@apache.org on 2007/06/14 19:17:44 UTC

svn commit: r547319 - in /incubator/wicket/branches/wicket-1.3-portlet-support: ./ jdk-1.4/wicket/ jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/

Author: ate
Date: Thu Jun 14 10:17:42 2007
New Revision: 547319

URL: http://svn.apache.org/viewvc?view=rev&rev=547319
Log:
WICKET-656: New Wicket Portlet support: adding portlet support with a new WicketPortlet, WicketPortletFilter and support classes
See: https://issues.apache.org/jira/browse/WICKET-656

Added:
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java   (with props)
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java   (with props)
Modified:
    incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/pom.xml
    incubator/wicket/branches/wicket-1.3-portlet-support/pom.xml

Modified: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/pom.xml
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/pom.xml?view=diff&rev=547319&r1=547318&r2=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/pom.xml (original)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/pom.xml Thu Jun 14 10:17:42 2007
@@ -39,6 +39,20 @@
 		component model backed by POJO data beans that can easily be 
 		persisted using your favorite technology.
 	</description>
+	<dependencies>
+		<dependency>
+			<groupId>javax.portlet</groupId>
+			<artifactId>portlet-api</artifactId>
+			<scope>provided</scope>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.portals.bridges</groupId>
+			<artifactId>portals-bridges-common</artifactId>
+			<scope>provided</scope>
+			<optional>true</optional>
+		</dependency>
+	</dependencies>
 	<build>
 		<plugins>
 			<plugin>

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,116 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.wicket.RenderContext;
+import org.apache.wicket.Response;
+import org.apache.wicket.markup.html.internal.HeaderResponse;
+import org.apache.wicket.response.StringResponse;
+
+/**
+ * @author Ate Douma
+ */
+public class EmbeddedPortletHeaderResponse extends HeaderResponse
+{
+	private Response realResponse;
+	private StringResponse bufferedResponse;
+	
+	public EmbeddedPortletHeaderResponse(Response realResponse)
+	{
+		this.realResponse = realResponse;
+		bufferedResponse = new StringResponse();
+	}
+
+	public void renderCSSReference(String url, String media)
+	{
+		if (!isClosed())
+		{
+			List token = Arrays.asList(new Object[] { "css", url, media });
+			if (wasRendered(token) == false)
+			{
+				getResponse().write("<script type=\"text/javascript\">");
+				getResponse().write("var elem=document.createElement(\"link\");");
+				getResponse().write("elem.setAttribute(\"rel\",\"stylesheet\");");
+				getResponse().write("elem.setAttribute(\"type\",\"text/css\");");
+				getResponse().write("elem.setAttribute(\"href\",\""+url+"\");");
+				if (media != null)
+				{
+					getResponse().write("elem.setAttribute(\"media\",\""+media+"\");");
+				}
+				getResponse().write("document.getElementsByTagName(\"head\")[0].appendChild(elem);");
+				getResponse().println("</script>");
+				markRendered(token);
+			}
+		}
+	}
+
+	
+	/**
+	 * @see org.apache.wicket.markup.html.internal.HeaderResponse#close()
+	 */
+	public void close()
+	{
+		super.close();
+		// Automatically add <head> if necessary
+		CharSequence output = bufferedResponse.getBuffer();
+		if (output.length() > 0)
+		{
+			if (output.charAt(0) == '\r')
+			{
+				for (int i = 2; i < output.length(); i += 2)
+				{
+					char ch = output.charAt(i);
+					if (ch != '\r')
+					{
+						output = output.subSequence(i - 2, output.length());
+						break;
+					}
+				}
+			}
+			else if (output.charAt(0) == '\n')
+			{
+				for (int i = 1; i < output.length(); i++)
+				{
+					char ch = output.charAt(i);
+					if (ch != '\n')
+					{
+						output = output.subSequence(i - 1, output.length());
+						break;
+					}
+				}
+			}
+		}
+		if (output.length() > 0)
+		{
+			realResponse.write("<span id=\""+RenderContext.get().getNamespace()+"_embedded_head\">");
+			realResponse.write(output);
+			realResponse.write("</span>");
+		}
+		bufferedResponse.reset();
+	}
+
+	/**
+	 * @see org.apache.wicket.markup.html.internal.HeaderResponse#getRealResponse()
+	 */
+	protected Response getRealResponse()
+	{
+		return bufferedResponse;
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/EmbeddedPortletHeaderResponse.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,138 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * @author Ate Douma
+ */
+public class PortletActionServletResponseWrapper extends PortletServletResponseWrapper
+{
+
+	public PortletActionServletResponseWrapper(HttpServletResponse response, WicketResponseState responseState)
+    {
+        super(response, responseState);
+	}
+
+	public void addCookie(Cookie cookie)
+	{
+	}
+
+	public void addDateHeader(String s, long l)
+	{
+	}
+
+	public void addHeader(String s, String s1)
+	{
+	}
+
+	public void addIntHeader(String s, int i)
+	{
+	}
+
+	public String encodeRedirectUrl(String s)
+	{
+		return s;
+	}
+
+	public String encodeRedirectURL(String s)
+	{
+		return s;
+	}
+
+	public String encodeUrl(String s)
+	{
+		return s;
+	}
+
+	public String encodeURL(String s)
+	{
+		return s;
+	}
+
+	public void flushBuffer() throws IOException
+	{
+	}
+
+	public int getBufferSize()
+	{
+		return 0;
+	}
+
+	public ServletOutputStream getOutputStream() throws IOException
+	{
+		return null;
+	}
+
+	public PrintWriter getWriter() throws IOException
+	{
+		return null;
+	}
+
+	public boolean isCommitted()
+	{
+		return false;
+	}
+
+	public void reset()
+	{
+	}
+
+	public void resetBuffer()
+	{
+	}
+
+	public void setBufferSize(int i)
+	{
+	}
+
+	public void setCharacterEncoding(String charset)
+	{
+	}
+
+	public void setContentLength(int i)
+	{
+	}
+
+	public void setContentType(String s)
+	{
+	}
+
+	public void setDateHeader(String s, long l)
+	{
+	}
+
+	public void setHeader(String s, String s1)
+	{
+	}
+
+	public void setIntHeader(String s, int i)
+	{
+	}
+
+	public void setLocale(Locale locale)
+	{
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletActionServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,230 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.util.HashMap;
+
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletException;
+import javax.portlet.PortletURL;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.portals.bridges.common.PortletResourceURLFactory;
+import org.apache.portals.bridges.util.PortletWindowUtils;
+import org.apache.portals.bridges.util.ServletPortletSessionProxy;
+import org.apache.wicket.RenderContext;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.markup.html.IHeaderResponse;
+import org.apache.wicket.protocol.http.WebRequest;
+
+/**
+ * @author Ate Douma
+ */
+public class PortletRenderContext extends RenderContext
+{
+	private final PortletConfig portletConfig;
+	private final RenderRequest renderRequest;
+	private final RenderResponse renderResponse;
+	private final PortletResourceURLFactory resourceURLFactory;
+	private final IHeaderResponse headerResponse;
+	private String portletWindowId;
+	private String[] lastEncodedUrl = new String[2];
+
+	private static final String SERVLET_RESOURCE_URL_PORTLET_WINDOW_ID_PREFIX = "/ps:";
+	
+    public static HttpServletRequest getPortletServletRequest(ServletContext context, HttpServletRequest request, String filterPath)
+    {
+    	String pathInfo = request.getRequestURI().substring(request.getContextPath().length()+filterPath.length());
+    	if (pathInfo != null && pathInfo.startsWith(SERVLET_RESOURCE_URL_PORTLET_WINDOW_ID_PREFIX))
+    	{
+    		String portletWindowId = null;
+    		int nextPath = pathInfo.indexOf('/',1);
+    		if (nextPath > -1)
+    		{
+    			portletWindowId = pathInfo.substring(SERVLET_RESOURCE_URL_PORTLET_WINDOW_ID_PREFIX.length(),nextPath);
+    			pathInfo = pathInfo.substring(nextPath);
+    		}
+    		else
+    		{
+    			portletWindowId = pathInfo.substring(SERVLET_RESOURCE_URL_PORTLET_WINDOW_ID_PREFIX.length());
+    			pathInfo = null;
+    		}
+    		return new PortletServletRequestWrapper(context,request,ServletPortletSessionProxy.createProxy(request, portletWindowId), "/"+filterPath.substring(0,filterPath.length()-1), pathInfo);
+    	}
+    	return request;
+    }
+    
+	public PortletRenderContext(final PortletConfig portletConfig, final RenderRequest renderRequest, final RenderResponse renderResponse, final PortletResourceURLFactory resourceURLFactory, final IHeaderResponse headerResponse)
+	{
+		super();
+		this.portletConfig = portletConfig;
+		this.renderRequest = renderRequest;
+		this.renderResponse = renderResponse;
+		this.resourceURLFactory = resourceURLFactory;
+		this.headerResponse = headerResponse;
+	}
+
+	public String getLastEncodedPath(String url)
+	{
+		if (url != null && lastEncodedUrl != null && url.equals(lastEncodedUrl[0]))
+		{
+			return lastEncodedUrl[1];
+		}
+		return null;
+	}
+	
+	protected String saveLastEncodedUrl(String url, String path)
+	{
+		lastEncodedUrl[0] = url;
+		lastEncodedUrl[1] = path;
+		return url;
+	}
+	
+	/**
+	 * @see org.apache.wicket.RenderContext#encodeActionURL(java.lang.CharSequence)
+	 */
+	public CharSequence encodeActionURL(CharSequence path)
+	{
+		if ( path != null )
+		{
+			path = getQualifiedPath(path);
+			if (renderResponse != null)
+			{
+				PortletURL url = renderResponse.createActionURL();
+				url.setParameter(WicketPortlet.WICKET_URL_PORTLET_PARAMETER, path.toString());
+				path = saveLastEncodedUrl(url.toString(), path.toString());
+			}
+		}
+		return path;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#encodeMarkupId(java.lang.String)
+	 */
+	public String encodeMarkupId(String markupId)
+	{
+		if ( markupId != null )
+		{
+			markupId = getNamespace() + "_" + markupId;
+		}
+		return markupId;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#encodeRenderURL(java.lang.CharSequence)
+	 */
+	public CharSequence encodeRenderURL(CharSequence path)
+	{
+		if ( path != null )
+		{			
+			path = getQualifiedPath(path);
+			if (renderResponse != null)
+			{
+				PortletURL url = renderResponse.createRenderURL();
+				url.setParameter(WicketPortlet.WICKET_URL_PORTLET_PARAMETER, path.toString());
+				path = saveLastEncodedUrl(url.toString(), path.toString());
+				path = url.toString();
+			}
+		}
+		return path;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#encodeResourceURL(java.lang.CharSequence)
+	 */
+	public CharSequence encodeResourceURL(CharSequence path)
+	{
+		if ( path != null )
+		{
+			path = getQualifiedPath(path);
+			if (renderResponse != null)
+			{
+				try
+				{
+					HashMap parameters = new HashMap(1);
+					parameters.put(WicketPortlet.WICKET_URL_PORTLET_PARAMETER, new String[]{path.toString()});
+					parameters.put(WicketPortlet.PORTLET_RESOURCE_URL_PARAMETER, new String[]{"true"});
+					path = saveLastEncodedUrl(resourceURLFactory.createResourceURL(portletConfig, renderRequest, renderResponse, parameters), path.toString());
+				}
+				catch (PortletException e)
+				{
+					throw new RuntimeException(e);
+				}
+			}
+		}
+		return path;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#encodeSharedResourceURL(java.lang.CharSequence)
+	 */
+	public CharSequence encodeSharedResourceURL(CharSequence path)
+	{
+		if ( path != null )
+		{
+			String url = (SERVLET_RESOURCE_URL_PORTLET_WINDOW_ID_PREFIX.substring(1) + getPortletWindowId() + "/" + path);
+			return saveLastEncodedUrl(url,url);
+		}
+		return null;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#getHeaderResponse()
+	 */
+	public IHeaderResponse getHeaderResponse()
+	{
+		return headerResponse;
+	}
+
+	/**
+	 * @see org.apache.wicket.RenderContext#getNamespace()
+	 */
+	public CharSequence getNamespace()
+	{
+		return renderResponse != null ? renderResponse.getNamespace() : "";
+	}
+	
+	/**
+	 * @see org.apache.wicket.RenderContext#isEmbedded()
+	 */
+	public boolean isEmbedded()
+	{
+		return true;
+	}
+	
+	protected String getQualifiedPath(CharSequence path)
+	{
+		HttpServletRequest request = ((WebRequest)RequestCycle.get().getRequest()).getHttpServletRequest();
+		if (renderRequest == null)
+		{
+			return request.getContextPath() + request.getServletPath() + path;
+		}
+		return request.getServletPath() + path;
+	}
+	
+	protected String getPortletWindowId()
+	{
+		if (portletWindowId == null)
+		{
+	    	portletWindowId = PortletWindowUtils.getPortletWindowId(renderRequest.getPortletSession());
+		}
+		return portletWindowId;
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderContext.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,60 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.io.IOException;
+
+import javax.portlet.RenderResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.wicket.RenderContext;
+
+/**
+ * @author Ate Douma
+ */
+public class PortletRenderServletResponseWrapper extends PortletServletResponseWrapper
+{
+	RenderResponse renderResponse;
+    
+    public PortletRenderServletResponseWrapper(HttpServletResponse response, RenderResponse renderResponse, WicketResponseState responseState)
+    {
+        super(response, responseState);
+        this.renderResponse = renderResponse;
+    }
+
+	/**
+	 * @see javax.servlet.ServletResponseWrapper#setContentType(java.lang.String)
+	 */
+	public void setContentType(String arg0)
+	{
+		renderResponse.setContentType(arg0);
+	}
+
+    public void sendRedirect(String redirectLocation) throws IOException
+	{
+    	RenderContext rc = RenderContext.get();
+    	if (rc instanceof PortletRenderContext)
+    	{
+    		String wicketUrl = ((PortletRenderContext)rc).getLastEncodedPath(redirectLocation);
+    		if (wicketUrl != null)
+    		{
+    			redirectLocation = wicketUrl;
+    		}
+    	}
+		super.sendRedirect(redirectLocation);
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletRenderServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,103 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpSession;
+
+/**
+ * @author Ate Douma
+ */
+public class PortletServletRequestWrapper extends HttpServletRequestWrapper
+{
+    private ServletContext context;
+    private boolean included;
+    private boolean pathOverride;
+    private String servletPath;
+    private String pathInfo;
+    private String requestURI;
+    private HttpSession session;
+    
+    public PortletServletRequestWrapper(ServletContext context, HttpServletRequest request, HttpSession proxiedSession)
+    {
+        super(request);
+        this.context = context;
+        session = proxiedSession;
+        if ( proxiedSession == null )
+        {
+            session = request.getSession(false);
+        }
+        this.included = request.getAttribute("javax.servlet.include.context_path") != null;
+    }
+
+    public PortletServletRequestWrapper(ServletContext context, HttpServletRequest request, HttpSession proxiedSession, String servletPath, String pathInfo)
+    {
+        this(context, request, proxiedSession);
+        this.servletPath = servletPath;
+        this.pathInfo = pathInfo;
+        this.requestURI = request.getContextPath()+servletPath+(pathInfo!=null?pathInfo:"");
+        this.pathOverride = true;
+    }
+
+    public String getPathInfo()
+    {
+        return pathOverride ? pathInfo : included ? (String) super.getAttribute("javax.servlet.include.path_info") : super.getPathInfo();
+    }
+
+    public String getContextPath()
+    {
+        return included ? (String) super.getAttribute("javax.servlet.include.context_path") : super.getContextPath();
+    }
+
+    public String getRequestURI()
+    {
+        return pathOverride ? requestURI : included ? (String) super.getAttribute("javax.servlet.include.request_uri") : super.getRequestURI();
+    }
+    
+	public String getServletPath()
+    {
+        return pathOverride ? servletPath : included ? (String) super.getAttribute("javax.servlet.include.servlet_path") : super.getServletPath();
+    }
+
+    public String getQueryString()
+    {
+        return included ? (String) super.getAttribute("javax.servlet.include.query_string") : super.getQueryString();
+    }
+
+    public HttpSession getSession()
+    {
+        return getSession(true);
+    }
+    
+    public HttpSession getSession(boolean create)
+    {
+        return session != null ? session : super.getSession(create);
+    }
+    
+    public Object getAttribute(String name)
+    {
+    	// TODO: check if these can possibly be set/handled
+    	// nullifying these for now to prevent Wicket ServletWebRequest.getRelativePathPrefixToWicketHandler() going the wrong route
+    	if ("javax.servlet.error.request_uri".equals(name) || "javax.servlet.forward.servlet_path".equals(name))
+    	{
+    		return null;
+    	}
+    	return super.getAttribute(name);
+    }
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletRequestWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,70 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * @author Ate Douma
+ */
+public class PortletServletResponseWrapper extends HttpServletResponseWrapper
+{
+	private WicketResponseState responseState;
+	
+	public PortletServletResponseWrapper(HttpServletResponse response, WicketResponseState responseState)
+	{
+		super(response);
+		this.responseState = responseState;
+	}
+
+	/**
+	 * @see javax.servlet.http.HttpServletResponseWrapper#sendError(int, java.lang.String)
+	 */
+	public void sendError(int errorCode, String errorMessage) throws IOException
+	{
+		responseState.setErrorCode(errorCode);
+		responseState.setErrorMessage(errorMessage);
+	}
+	
+	/**
+	 * @see javax.servlet.http.HttpServletResponseWrapper#sendError(int)
+	 */
+	public void sendError(int errorCode) throws IOException
+	{
+		responseState.setErrorCode(errorCode);
+		responseState.setErrorMessage(null);
+	}
+
+	/**
+	 * @see javax.servlet.http.HttpServletResponseWrapper#sendRedirect(java.lang.String)
+	 */
+	public void sendRedirect(String redirectLocation) throws IOException
+	{
+		responseState.setRedirectLocation(redirectLocation);
+	}
+
+	/**
+	 * @see javax.servlet.http.HttpServletResponseWrapper#setStatus(int)
+	 */
+	public void setStatus(int statusCode)
+	{
+		responseState.setStatusCode(statusCode);
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/PortletServletResponseWrapper.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,296 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.io.IOException;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.GenericPortlet;
+import javax.portlet.PortletConfig;
+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.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.portals.bridges.common.PortletResourceURLFactory;
+import org.apache.portals.bridges.common.ServletContextProvider;
+
+/**
+ * @author Ate Douma
+ */
+public class WicketPortlet extends GenericPortlet
+{
+	public static final String WICKET_URL_PORTLET_PARAMETER = "wicketUrl";
+	public static final String PORTLET_RESOURCE_URL_PARAMETER = "resourceUrl";
+	public static final String WICKET_FILTER_PATH_PARAM = "wicketFilterPath";
+	public static final String PARAM_SERVLET_CONTEXT_PROVIDER = "ServletContextProvider";
+	public static final String PARAM_PORTLET_RESOURCE_URL_FACTORY = "PortletResourceURLFactory";
+	public static final String ACTION_REQUEST = "ACTION";
+	public static final String VIEW_REQUEST = "VIEW";
+	public static final String RESOURCE_REQUEST = "RESOURCE";
+	public static final String CUSTOM_REQUEST = "CUSTOM";
+	public static final String EDIT_REQUEST = "EDIT";
+	public static final String HELP_REQUEST = "HELP";
+	public static final String REQUEST_TYPE_ATTR = WicketPortlet.class.getName() + "REQUEST_TYPE";
+	public static final String RESPONSE_STATE_ATTR = WicketResponseState.class.getName();
+	public static final String RESOURCE_URL_FACTORY_ATTR = PortletResourceURLFactory.class.getName();
+	public static final String PORTLET_RESOURCE_URL_ATTR = "resourceUrl";
+
+	private ServletContextProvider servletContextProvider;
+	private PortletResourceURLFactory resourceURLFactory;
+	private String wicketFilterPath;
+
+	public void init(PortletConfig config) throws PortletException
+	{
+		super.init(config);
+		String contextProviderClassName = getContextProviderClassNameParameter(config);
+		if (contextProviderClassName == null)
+		{
+			contextProviderClassName = config.getPortletContext().getInitParameter(
+					ServletContextProvider.class.getName());
+		}
+		if (contextProviderClassName == null)
+		{
+			throw new PortletException("Portlet " + config.getPortletName()
+					+ " is incorrectly configured. Init parameter "
+					+ PARAM_SERVLET_CONTEXT_PROVIDER + " not specified, nor context parameter "
+					+ ServletContextProvider.class.getName() + ".");
+		}
+		try
+		{
+			Class clazz = Class.forName(contextProviderClassName);
+			servletContextProvider = (ServletContextProvider)clazz.newInstance();
+		}
+		catch (Exception e)
+		{
+			if (e instanceof PortletException)
+			{
+				throw (PortletException)e;
+			}
+			throw new PortletException("Initialization failure", e);
+		}
+		
+		String resourceURLFactoryClassName = getPortletResourceURLFactoryClassNameParameter(config);
+		if (resourceURLFactoryClassName == null)
+		{
+			resourceURLFactoryClassName = config.getPortletContext().getInitParameter(
+					PortletResourceURLFactory.class.getName());
+		}
+		if (resourceURLFactoryClassName == null)
+		{
+			throw new PortletException("Portlet " + config.getPortletName()
+					+ " is incorrectly configured. Init parameter "
+					+ PARAM_PORTLET_RESOURCE_URL_FACTORY + " not specified, nor context parameter "
+					+ PortletResourceURLFactory.class.getName() + ".");
+		}
+		try
+		{
+			Class clazz = Class.forName(resourceURLFactoryClassName);
+			resourceURLFactory = (PortletResourceURLFactory)clazz.newInstance();
+		}
+		catch (Exception e)
+		{
+			if (e instanceof PortletException)
+			{
+				throw (PortletException)e;
+			}
+			throw new PortletException("Initialization failure", e);
+		}
+		
+		wicketFilterPath = config.getInitParameter(WICKET_FILTER_PATH_PARAM);
+		if (wicketFilterPath == null || wicketFilterPath.length() == 0)
+		{
+			wicketFilterPath = "/";
+		}
+		else
+		{
+			if (!wicketFilterPath.startsWith("/"))
+			{
+				wicketFilterPath = "/" + wicketFilterPath;
+			}
+			if (wicketFilterPath.endsWith("*"))
+			{
+				wicketFilterPath = wicketFilterPath.substring(0, wicketFilterPath.length() - 1);
+			}
+			if (!wicketFilterPath.endsWith("/"))
+			{
+				wicketFilterPath += "/";
+			}
+		}
+	}
+
+	public void processAction(ActionRequest request, ActionResponse response)
+			throws PortletException, IOException
+	{
+		processRequest(request, response, ACTION_REQUEST);
+	}
+
+	protected void doView(RenderRequest request, RenderResponse response) throws PortletException,
+			IOException
+	{
+		processRequest(request, response, VIEW_REQUEST);
+	}
+
+	public void destroy()
+	{
+		resourceURLFactory = null;
+		servletContextProvider = null;
+		super.destroy();
+	}
+
+	protected String getContextProviderClassNameParameter(PortletConfig config)
+	{
+		return config.getInitParameter(PARAM_SERVLET_CONTEXT_PROVIDER);
+	}
+
+	protected String getPortletResourceURLFactoryClassNameParameter(PortletConfig config)
+	{
+		return config.getInitParameter(PARAM_PORTLET_RESOURCE_URL_FACTORY);
+	}
+
+	protected ServletContextProvider getServletContextProvider()
+	{
+		return servletContextProvider;
+	}
+
+	protected ServletContext getServletContext(GenericPortlet portlet, PortletRequest request,
+			PortletResponse response)
+	{
+		return getServletContextProvider().getServletContext(portlet);
+	}
+
+	protected HttpServletRequest getHttpServletRequest(GenericPortlet portlet,
+			PortletRequest request, PortletResponse response)
+	{
+		return getServletContextProvider().getHttpServletRequest(portlet, request);
+	}
+
+	protected HttpServletResponse getHttpServletResponse(GenericPortlet portlet,
+			PortletRequest request, PortletResponse response)
+	{
+		return getServletContextProvider().getHttpServletResponse(portlet, response);
+	}
+
+	protected void processRequest(PortletRequest request, PortletResponse response,
+			String requestType) throws PortletException, IOException
+	{
+		String wicketURL = request.getParameter(WICKET_URL_PORTLET_PARAMETER);
+
+		if (wicketURL == null)
+		{
+			wicketURL = wicketFilterPath;
+		}
+
+		boolean actionRequest = ACTION_REQUEST.equals(requestType);
+		
+		WicketResponseState responseState = new WicketResponseState();
+
+		request.setAttribute(RESPONSE_STATE_ATTR, responseState);
+		request.setAttribute(RESOURCE_URL_FACTORY_ATTR, resourceURLFactory);
+		request.setAttribute(REQUEST_TYPE_ATTR, requestType);
+		String portletResourceURL = request.getParameter(PORTLET_RESOURCE_URL_PARAMETER);
+		if (portletResourceURL != null)
+		{
+			request.setAttribute(PORTLET_RESOURCE_URL_ATTR,portletResourceURL);
+		}
+
+		if (actionRequest)
+		{
+			ServletContext servletContext = getServletContext(this, request, response);
+			HttpServletRequest req = getHttpServletRequest(this, request, response);
+			HttpServletResponse res = getHttpServletResponse(this, request, response);
+			RequestDispatcher rd = servletContext.getRequestDispatcher(wicketURL);
+
+			if (rd != null)
+			{
+				// http://issues.apache.org/jira/browse/PB-2:
+				// provide servlet access to the Portlet components even from
+				// an actionRequest in extension to the JSR-168 requirement
+				// PLT.16.3.2 which (currently) only covers renderRequest
+				// servlet inclusion.
+				if (req.getAttribute("javax.portlet.config") == null)
+				{
+					req.setAttribute("javax.portlet.config", getPortletConfig());
+				}
+				if (req.getAttribute("javax.portlet.request") == null)
+				{
+					req.setAttribute("javax.portlet.request", request);
+				}
+				if (req.getAttribute("javax.portlet.response") == null)
+				{
+					req.setAttribute("javax.portlet.response", response);
+				}
+				try
+				{
+					rd.include(req, res);
+					processActionResponseState(wicketURL, (ActionRequest)request, (ActionResponse)response, responseState);
+				}
+				catch (ServletException e)
+				{
+					throw new PortletException(e);
+				}
+			}
+		}
+		else
+		{
+			PortletRequestDispatcher rd = null;
+			String previousURL = null;
+			while (true)
+			{
+				rd = getPortletContext().getRequestDispatcher(wicketURL);
+				if (rd != null)
+				{
+					rd.include((RenderRequest)request, (RenderResponse)response);
+					if (responseState.getRedirectLocation() != null && responseState.getRedirectLocation().startsWith(wicketFilterPath)
+							&& ((previousURL == null || previousURL != responseState.getRedirectLocation())))
+					{
+						previousURL = wicketURL;
+						wicketURL = responseState.getRedirectLocation();
+						((RenderResponse)response).reset();
+						responseState.reset();
+						continue;
+					}
+				}
+				break;
+			}
+		}
+	}
+	
+	protected void processActionResponseState(String wicketURL, ActionRequest request, ActionResponse response, WicketResponseState responseState) throws PortletException, IOException
+	{
+		if ( responseState.getRedirectLocation() != null )
+		{
+			wicketURL = responseState.getRedirectLocation();
+			if (wicketURL.startsWith(request.getContextPath()+wicketFilterPath))
+			{
+				response.setRenderParameter(WICKET_URL_PORTLET_PARAMETER, wicketURL.substring(request.getContextPath().length()));
+			}
+			else
+			{
+				response.sendRedirect(responseState.getRedirectLocation());
+			}
+		}
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortlet.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,114 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+import java.io.IOException;
+
+import javax.portlet.PortletConfig;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.portals.bridges.common.PortletResourceURLFactory;
+import org.apache.portals.bridges.util.ServletPortletSessionProxy;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.http.WebRequest;
+import org.apache.wicket.protocol.http.WebResponse;
+import org.apache.wicket.protocol.http.WicketFilter;
+import org.apache.wicket.settings.IRequestCycleSettings;
+
+/**
+ * @author Ate Douma
+ */
+public class WicketPortletFilter extends WicketFilter
+{
+	private int filterPathPrefixLength = -1;
+	
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
+        super.init(filterConfig);
+        // Get the instance of the application object from the servlet context
+        // make integration with outside world easier
+        String contextKey = "wicket:" + filterConfig.getFilterName();
+        WebApplication webApplication = (WebApplication)filterConfig.getServletContext().getAttribute(contextKey);
+        webApplication.getRequestCycleSettings().setRenderStrategy(IRequestCycleSettings.REDIRECT_TO_RENDER);
+    }
+
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+    {
+    	HttpServletRequest servletRequest = (HttpServletRequest)request;
+    	PortletConfig portletConfig = (PortletConfig)request.getAttribute("javax.portlet.config");
+        if ( portletConfig != null )
+        {
+        	WicketResponseState responseState = (WicketResponseState)request.getAttribute(WicketPortlet.RESPONSE_STATE_ATTR);
+            request = new PortletServletRequestWrapper(getFilterConfig().getServletContext(),servletRequest, ServletPortletSessionProxy.createProxy(servletRequest));
+            if ( WicketPortlet.ACTION_REQUEST.equals(request.getAttribute(WicketPortlet.REQUEST_TYPE_ATTR)))
+            {
+                response = new PortletActionServletResponseWrapper((HttpServletResponse)response, responseState);
+            }
+            else
+            {   
+                response = new PortletRenderServletResponseWrapper( (HttpServletResponse)response, (RenderResponse)request.getAttribute("javax.portlet.response"),responseState);
+            }            
+        }
+        else
+        {
+        	request = PortletRenderContext.getPortletServletRequest(getFilterConfig().getServletContext(),servletRequest, getFilterPath(servletRequest));
+        }
+        super.doFilter(request, response, chain);
+    }
+    
+    protected int getFilterPathPrefixLength(HttpServletRequest request)
+    {
+    	if (filterPathPrefixLength == -1)
+    	{
+    		filterPathPrefixLength = request.getContextPath().length()+getFilterPath(request).length();
+    	}
+    	return filterPathPrefixLength;
+    }
+    
+    protected void createRenderContext(WebRequest request, WebResponse response)
+    {
+    	HttpServletRequest servletRequest = request.getHttpServletRequest();
+    	PortletConfig portletConfig = (PortletConfig)servletRequest.getAttribute("javax.portlet.config");
+        if ( portletConfig != null )
+        {
+            if ( WicketPortlet.ACTION_REQUEST.equals(servletRequest.getAttribute(WicketPortlet.REQUEST_TYPE_ATTR)))
+            {
+            	new PortletRenderContext(null, null, null, null, null);
+            }
+            else
+            {
+            	PortletResourceURLFactory resourceURLFactory = (PortletResourceURLFactory)servletRequest.getAttribute(WicketPortlet.RESOURCE_URL_FACTORY_ATTR);
+            	RenderRequest renderRequest = (RenderRequest)servletRequest.getAttribute("javax.portlet.request");
+            	RenderResponse renderResponse = (RenderResponse)servletRequest.getAttribute("javax.portlet.response");
+            	boolean isResourceRequest = "true".equals(servletRequest.getAttribute(WicketPortlet.PORTLET_RESOURCE_URL_ATTR));
+            	new PortletRenderContext(portletConfig, renderRequest, renderResponse, resourceURLFactory, isResourceRequest ? null : new EmbeddedPortletHeaderResponse(response));
+            }
+        }
+        else
+        {
+        	super.createRenderContext(request, response);
+        }
+    }
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketPortletFilter.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java?view=auto&rev=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java (added)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java Thu Jun 14 10:17:42 2007
@@ -0,0 +1,108 @@
+/*
+ * 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.wicket.protocol.http.portlet;
+
+/**
+ * @author Ate Douma
+ */
+public class WicketResponseState
+{
+	private int errorCode;
+	private String errorMessage;
+	private int statusCode;
+	private String redirectLocation;
+
+	/**
+	 * Gets errorCode.
+	 * @return errorCode
+	 */
+	public int getErrorCode()
+	{
+		return errorCode;
+	}
+
+	/**
+	 * Sets errorCode.
+	 * @param errorCode errorCode
+	 */
+	public void setErrorCode(int errorCode)
+	{
+		this.errorCode = errorCode;
+	}
+	
+	/**
+	 * Gets errorMessage.
+	 * @return errorMessage
+	 */
+	public String getErrorMessage()
+	{
+		return errorMessage;
+	}
+	
+	/**
+	 * Sets errorMessage.
+	 * @param errorMessage errorMessage
+	 */
+	public void setErrorMessage(String errorMessage)
+	{
+		this.errorMessage = errorMessage;
+	}
+	
+	/**
+	 * Gets redirectLocation.
+	 * @return redirectLocation
+	 */
+	public String getRedirectLocation()
+	{
+		return redirectLocation;
+	}
+	
+	/**
+	 * Sets redirectLocation.
+	 * @param redirectLocation redirectLocation
+	 */
+	public void setRedirectLocation(String redirectLocation)
+	{
+		this.redirectLocation = redirectLocation;
+	}
+	
+	/**
+	 * Gets statusCode.
+	 * @return statusCode
+	 */
+	public int getStatusCode()
+	{
+		return statusCode;
+	}
+	
+	/**
+	 * Sets statusCode.
+	 * @param statusCode statusCode
+	 */
+	public void setStatusCode(int statusCode)
+	{
+		this.statusCode = statusCode;
+	}
+	
+	public void reset()
+	{
+		errorCode = 0;
+		errorMessage = null;
+		statusCode = 0;
+		redirectLocation = null;
+	}
+}

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/wicket/branches/wicket-1.3-portlet-support/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/portlet/WicketResponseState.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: incubator/wicket/branches/wicket-1.3-portlet-support/pom.xml
URL: http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.3-portlet-support/pom.xml?view=diff&rev=547319&r1=547318&r2=547319
==============================================================================
--- incubator/wicket/branches/wicket-1.3-portlet-support/pom.xml (original)
+++ incubator/wicket/branches/wicket-1.3-portlet-support/pom.xml Thu Jun 14 10:17:42 2007
@@ -197,6 +197,15 @@
 		</mailingList>
 	</mailingLists>
 
+	<repositories>
+		<repository>
+			<!-- for portals-bridges-common -->
+			<id>com.bluesunrise.m2</id>			
+			<name>Maven2 BlueSunrise</name>
+			<url>http://www.bluesunrise.com/maven2</url>
+		</repository>
+	</repositories>
+	
 	<dependencyManagement>
 		<dependencies>
 			<dependency>
@@ -387,6 +396,20 @@
 				<artifactId>jwebunit-htmlunit-plugin</artifactId>
 				<version>1.4-rc3</version>
 				<scope>test</scope>
+			</dependency>
+			<dependency>
+				<groupId>javax.portlet</groupId>
+				<artifactId>portlet-api</artifactId>
+				<version>1.0</version>
+				<scope>provided</scope>
+				<optional>true</optional>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.portals.bridges</groupId>
+				<artifactId>portals-bridges-common</artifactId>
+				<version>1.0.2-beta1</version>
+				<scope>provided</scope>
+				<optional>true</optional>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>