You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by so...@apache.org on 2009/01/29 21:02:51 UTC
svn commit: r738986 - in /myfaces/trinidad/branches/sobryan-portlet: ./
trinidad-api/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/
trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/ trinidad-impl/
trinidad-impl/src/main/java...
Author: sobryan
Date: Thu Jan 29 20:02:50 2009
New Revision: 738986
URL: http://svn.apache.org/viewvc?rev=738986&view=rev
Log:
A number of changes to prototype Portlet 2.0
Added:
myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java
Removed:
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/ActionRequestWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/ActionResponseWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletContextWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletRequestDispatcherWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletRequestWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/PortletResponseWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/RenderRequestWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/wrappers/RenderResponseWrapper.java
Modified:
myfaces/trinidad/branches/sobryan-portlet/pom.xml
myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml
myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java
myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java
Modified: myfaces/trinidad/branches/sobryan-portlet/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/pom.xml Thu Jan 29 20:02:50 2009
@@ -40,15 +40,16 @@
<!-- Standards -->
<jdk.version>1.5</jdk.version>
<servlet.version>2.5</servlet.version>
- <portlet.version>1.0</portlet.version>
+ <portlet.version>2.0</portlet.version>
<jsp.version>2.1</jsp.version>
<jstl.version>1.2</jstl.version>
<jsf-spec.version>1.2</jsf-spec.version>
<jsf-ri.version>1.2_09</jsf-ri.version>
<jsf-myfaces.version>1.2.4</jsf-myfaces.version>
<jsf-facelets.version>1.1.14</jsf-facelets.version>
- <portlet-bridge.version>1.0.0-alpha-2</portlet-bridge.version>
+ <portlet-bridge.version>2.0.0-alpha</portlet-bridge.version>
<commons-lang.version>2.4</commons-lang.version>
+ <myfaces-commons.version>1.0.1-SNAPSHOT</myfaces-commons.version>
<!-- Testing -->
<shale.version>1.0.4</shale.version>
@@ -261,6 +262,12 @@
</dependency>
<dependency>
+ <groupId>org.apache.myfaces.commons</groupId>
+ <artifactId>myfaces-commons-utils12</artifactId>
+ <version>${myfaces-commons.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.myfaces.trinidad</groupId>
<artifactId>trinidad-build</artifactId>
<version>${pom.version}</version>
@@ -313,7 +320,7 @@
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
- </dependency>
+ </dependency>
</dependencies>
</dependencyManagement>
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/pom.xml Thu Jan 29 20:02:50 2009
@@ -61,6 +61,16 @@
<scope>provided</scope> <!-- force provided scope here -->
</dependency>
+ <dependency>
+ <groupId>org.apache.myfaces.portlet-bridge</groupId>
+ <artifactId>portlet-bridge-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.myfaces.commons</groupId>
+ <artifactId>myfaces-commons-utils12</artifactId>
+ </dependency>
+
<!-- "test" scope dependencies -->
<dependency>
<groupId>junit</groupId>
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/Configurator.java Thu Jan 29 20:02:50 2009
@@ -21,6 +21,8 @@
import javax.faces.context.ExternalContext;
import javax.servlet.ServletRequest;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
+
/**
* This defines an abstract class for the Configurator. Classes implementing
* this abstraction should be listed in the jar's /META-INF/services folder
@@ -158,7 +160,7 @@
*/
public static final void disableConfiguratorServices(ServletRequest srq)
{
- srq.setAttribute(_DISABLE_SERVICES, Boolean.TRUE);
+ RequestStateMap.getInstance(srq).put(_DISABLE_SERVICES, Boolean.TRUE);
}
/**
@@ -180,7 +182,7 @@
*/
protected static final boolean isConfiguratorServiceDisabled(ExternalContext ec)
{
- return Boolean.TRUE.equals(ec.getRequestMap().get(_DISABLE_SERVICES));
+ return Boolean.TRUE.equals(RequestStateMap.getInstance(ec).get(_DISABLE_SERVICES));
}
static private final String _DISABLE_SERVICES = Configurator.class.getName()+".DISABLE_SERVICES";
Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-api/src/main/java/org/apache/myfaces/trinidad/util/RequestStateMap.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,94 @@
+package org.apache.myfaces.trinidad.util;
+
+import java.lang.reflect.Method;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.faces.annotation.ExcludeFromManagedRequestScope;
+
+import javax.servlet.ServletRequest;
+
+import org.apache.myfaces.commons.util.RequestType;
+
+/**
+ * TODO: get rid of this object
+ */
+ @ExcludeFromManagedRequestScope
+ public class RequestStateMap extends HashMap<String, Object>
+ {
+ static public RequestStateMap getInstance(ServletRequest req)
+ {
+ RequestStateMap map = (RequestStateMap)req.getAttribute(_STATE_MAP);
+
+ if(map == null)
+ {
+ map = new RequestStateMap();
+ req.setAttribute(_STATE_MAP, map);
+ }
+
+ return map;
+ }
+
+ static public RequestStateMap getInstance(ExternalContext ec)
+ {
+ Map<String, Object> reqMap = ec.getRequestMap();
+ RequestStateMap map = (RequestStateMap)reqMap.get(_STATE_MAP);
+
+ //For now, always check this on a render so it can be removed from the session.
+ //This can be optimized to only save the state when request attributes are NOT preserved
+ if(RequestType.RENDER.equals(org.apache.myfaces.commons.util.ExternalContextUtils.getRequestType(ec)))
+ {
+ String uuid = ec.getRequestParameterMap().get(_STATE_MAP);
+ if(uuid!= null)
+ {
+ RequestStateMap myMap= (RequestStateMap)ec.getSessionMap().remove(_STATE_MAP+"."+uuid);
+ if(map == null)
+ {
+ map = myMap;
+ }
+ else
+ {
+ //TODO: put optimization code here
+ }
+ }
+ }
+
+ if(map == null)
+ {
+ map = new RequestStateMap();
+ reqMap.put(_STATE_MAP, map);
+ }
+
+ return map;
+ }
+
+ private RequestStateMap(){};
+
+ public void saveState(ExternalContext ec)
+ {
+ if(RequestType.ACTION.equals(org.apache.myfaces.commons.util.ExternalContextUtils.getRequestType(ec)))
+ {
+ try
+ {
+ //TODO: use reflection here but it can be replaced..
+ Object actionResp = ec.getResponse();
+ Method m = actionResp.getClass().getMethod("setRenderParameter", String.class, String.class);
+ String uuid = UUID.randomUUID().toString();
+
+ ec.getRequestMap().put(_STATE_MAP+"."+uuid, this);
+ m.invoke(actionResp, _STATE_MAP, uuid);
+ }
+ catch(Throwable t)
+ {
+ //TODO: Log exception
+ t.printStackTrace();
+ }
+ }
+ }
+
+ private static final String _STATE_MAP = RequestStateMap.class.getName();
+ }
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/pom.xml Thu Jan 29 20:02:50 2009
@@ -81,6 +81,11 @@
<artifactId>jsf-facelets</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.apache.myfaces.commons</groupId>
+ <artifactId>myfaces-commons-utils12</artifactId>
+ </dependency>
+
<!-- "test" scope dependencies -->
<dependency>
<groupId>org.apache.myfaces.trinidad</groupId>
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -19,14 +19,20 @@
package org.apache.myfaces.trinidadinternal.config;
+import java.lang.reflect.Method;
+
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import javax.faces.context.ExternalContext;
+import javax.portlet.faces.annotation.ExcludeFromManagedRequestScope;
+
+import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
@@ -40,6 +46,9 @@
import org.apache.myfaces.trinidad.logging.TrinidadLogger;
import org.apache.myfaces.trinidad.skin.SkinFactory;
import org.apache.myfaces.trinidad.util.ClassLoaderUtils;
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+import org.apache.myfaces.commons.util.RequestType;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
import org.apache.myfaces.trinidadinternal.context.RequestContextFactoryImpl;
import org.apache.myfaces.trinidadinternal.context.external.ServletCookieMap;
import org.apache.myfaces.trinidadinternal.context.external.ServletRequestHeaderMap;
@@ -49,7 +58,6 @@
import org.apache.myfaces.trinidadinternal.context.external.ServletRequestParameterValuesMap;
import org.apache.myfaces.trinidadinternal.skin.SkinFactoryImpl;
import org.apache.myfaces.trinidadinternal.skin.SkinUtils;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
/**
* This is the implementation of the Trinidad's Global configurator. It provides the entry point for
@@ -123,7 +131,7 @@
*/
static public boolean isRequestStarted(final ExternalContext ec)
{
- return (RequestType.getType(ec) != null);
+ return (RequestStateMap.getInstance(ec).get(_STATE_REQUEST_TYPE) != null);
}
/**
@@ -182,13 +190,16 @@
{
// asserts for debug which disappear in production
assert externalContext != null;
-
+ RequestStateMap state = RequestStateMap.getInstance(externalContext);
+ RequestType reqType = (RequestType)state.get(_STATE_REQUEST_TYPE);
+
// Do per-virtual request stuff
- if (RequestType.getType(externalContext) == null)
+ if (reqType == null)
{
- // RequestType may change in a portal environment. Make sure it's set up to enforce the
- // contracts
- RequestType.setType(externalContext);
+ reqType = ExternalContextUtils.getRequestType(externalContext);
+ // RequestType may change in a portal environment. Make sure it's set up
+ // to enforce the contracts
+ state.put(_STATE_REQUEST_TYPE, reqType);
// By contract, Configurators beginRequest is only called once per physical request.
// The globalConfigurator may be called multiple times, however, so we need to enforce
@@ -203,7 +214,7 @@
_attachRequestContext(externalContext);
- if (externalContext.getRequestMap().get(_IN_REQUEST) == null)
+ if (state.get(_IN_REQUEST) == null)
{
_startConfiguratorServiceRequest(externalContext);
}
@@ -213,7 +224,7 @@
_LOG.fine("GlobalConfigurator: Configurators have been disabled for this request.");
}
}
- else if (!RequestType.isCorrectType(externalContext))
+ else if (reqType.equals(state.get(_STATE_REQUEST_TYPE)))
{
// This will happen if the actionRequest was not ended before dispatching to the render
// request
@@ -275,28 +286,35 @@
@Override
public void endRequest(final ExternalContext externalContext)
{
+ RequestStateMap state = RequestStateMap.getInstance(externalContext);
+ boolean responseWritable = ExternalContextUtils.isResponseWritable(externalContext);
+
// do per virtual-request stuff
- if (RequestType.getType(externalContext) != null)
+ if (state.get(_STATE_REQUEST_TYPE) != null)
{
if (!_isDisabled(externalContext))
{
try
{
- final RequestType type = RequestType.getType(externalContext);
+ final RequestType type = ExternalContextUtils.getRequestType(externalContext);
// Do not end services at the end of a portal action request
- if (type != RequestType.PORTAL_ACTION)
+ if (responseWritable)
{
_endConfiguratorServiceRequest(externalContext);
}
}
finally
{
+ if(!responseWritable)
+ {
+ state.saveState(externalContext);
+ }
_releaseRequestContext(externalContext);
- _releaseManagedThreadLocals();
}
}
- RequestType.clearType(externalContext);
+
+ state.remove(_STATE_REQUEST_TYPE);
}
}
@@ -315,7 +333,8 @@
@Override
public ExternalContext getExternalContext(ExternalContext externalContext)
{
- if (RequestType.getType(externalContext) == null)
+ RequestStateMap state = RequestStateMap.getInstance(externalContext);
+ if (state.get(_STATE_REQUEST_TYPE) == null)
{
beginRequest(externalContext);
}
@@ -438,8 +457,7 @@
{
_LOG.warning("REQUESTCONTEXT_NOT_PROPERLY_RELEASED");
}
- context.release();
- _releaseManagedThreadLocals();
+ _releaseRequestContext(externalContext);
}
// See if we've got a cached RequestContext instance; if so,
@@ -452,32 +470,25 @@
if (cachedRequestContext instanceof RequestContext)
{
context = (RequestContext) cachedRequestContext;
- context.attach();
}
else
{
final RequestContextFactory factory = RequestContextFactory.getFactory();
assert factory != null;
context = factory.createContext(externalContext);
- externalContext.getRequestMap().put(_REQUEST_CONTEXT, context);
+ RequestStateMap.getInstance(externalContext).put(_REQUEST_CONTEXT, context);
}
-
+ context.attach();
assert RequestContext.getCurrentInstance() == context;
}
private void _releaseRequestContext(final ExternalContext ec)
{
- //If it's not a portal action, we should remove the cached request because
- //well want to create a new one next request
- if(RequestType.getType(ec) != RequestType.PORTAL_ACTION)
- {
- ec.getRequestMap().remove(_REQUEST_CONTEXT);
- }
-
final RequestContext context = RequestContext.getCurrentInstance();
if (context != null)
{
context.release();
+ _releaseManagedThreadLocals();
assert RequestContext.getCurrentInstance() == null;
}
@@ -497,12 +508,19 @@
{
// Physical request has now ended
// Clear the in-request flag
- ec.getRequestMap().remove(_IN_REQUEST);
+ RequestStateMap.getInstance(ec).remove(_IN_REQUEST);
if(_services != null)
{
for (final Configurator config : _services)
{
- config.endRequest(ec);
+ try
+ {
+ config.endRequest(ec);
+ }
+ catch (Throwable t)
+ {
+ t.printStackTrace();
+ }
}
}
}
@@ -514,12 +532,19 @@
final boolean disabled = isConfiguratorServiceDisabled(ec);
// Tell whether the services were disabled when the requests had begun
- ec.getRequestMap().put(_IN_REQUEST, disabled);
+ RequestStateMap.getInstance(ec).put(_IN_REQUEST, disabled);
// If this hasn't been initialized then please initialize
for (final Configurator config : _services)
{
- config.beginRequest(ec);
+ try
+ {
+ config.beginRequest(ec);
+ }
+ catch(Throwable t)
+ {
+ t.printStackTrace();
+ }
}
}
@@ -675,6 +700,7 @@
return (HttpServletRequest)getRequest();
}
}
+
private static volatile boolean _sSetRequestBugTested = false;
@@ -690,58 +716,11 @@
static private final String _REQUEST_CONTEXT =
GlobalConfiguratorImpl.class.getName()
+ ".REQUEST_CONTEXT";
-
-
- private enum RequestType
- {
- PORTAL_ACTION,
- PORTAL_RENDER,
- SERVLET;
-
- public static void clearType(final ExternalContext ec)
- {
- ec.getRequestMap().remove(_REQUEST_TYPE);
- }
-
- public static RequestType getType(final ExternalContext ec)
- {
- return (RequestType) ec.getRequestMap().get(_REQUEST_TYPE);
- }
-
- public static boolean isCorrectType(final ExternalContext ec)
- {
- return _findType(ec) == getType(ec);
- }
-
- @SuppressWarnings("unchecked")
- public static void setType(final ExternalContext ec)
- {
- ec.getRequestMap().put(_REQUEST_TYPE, _findType(ec));
- }
-
- private static final RequestType _findType(final ExternalContext ec)
- {
- if (ExternalContextUtils.isPortlet(ec))
- {
- if (ExternalContextUtils.isAction(ec))
- {
- return PORTAL_ACTION;
- }
- else
- {
- return PORTAL_RENDER;
- }
- }
- else
- {
- return SERVLET;
- }
- }
-
- static private final String _REQUEST_TYPE = GlobalConfiguratorImpl.class.getName()
- + ".REQUEST_TYPE";
- }
-
+
+ static private final String _DISABLE_SERVICES = Configurator.class.getName()+".DISABLE_SERVICES";
+
+ static private final String _STATE_REQUEST_TYPE = GlobalConfiguratorImpl.class.getName()
+ + ".REQUEST_TYPE";
static private class TestRequest extends ServletRequestWrapper
{
public TestRequest(ServletRequest request)
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchRenderResponse.java Thu Jan 29 20:02:50 2009
@@ -25,7 +25,7 @@
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
-import org.apache.myfaces.trinidadinternal.webapp.wrappers.RenderResponseWrapper;
+import javax.portlet.filter.RenderResponseWrapper;
@SuppressWarnings("deprecation")
class DispatchRenderResponse extends RenderResponseWrapper
@@ -33,7 +33,7 @@
public DispatchRenderResponse(ExternalContext ec)
{
super((RenderResponse)ec.getResponse());
- _request = (RenderRequest)ec.getRequest();
+ _request = (RenderRequest)ec.getRequest();
}
@Override
@@ -72,6 +72,5 @@
private final RenderRequest _request;
- static private final Pattern _CONTENT_TYPE_PATTERN =
- Pattern.compile("([^;]+)(?:;charset=(.*))?");
+ static private final Pattern _CONTENT_TYPE_PATTERN = Pattern.compile("([^;]+)(?:;charset=(.*))?");
}
Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResourceResponse.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,60 @@
+package org.apache.myfaces.trinidadinternal.config.dispatch;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.filter.ResourceResponseWrapper;
+
+public class DispatchResourceResponse
+ extends ResourceResponseWrapper
+{
+ public DispatchResourceResponse(ExternalContext ec)
+ {
+ super((ResourceResponse)ec.getResponse());
+ _request = (ResourceRequest)ec.getRequest();
+ }
+
+ @Override
+ public void setContentType(
+ String contentTypeAndCharset)
+ {
+ if(contentTypeAndCharset != null)
+ {
+ Matcher matcher = _CONTENT_TYPE_PATTERN.matcher(contentTypeAndCharset);
+ if (matcher.matches())
+ {
+ String contentType = matcher.group(1);
+ String charset = (matcher.groupCount() > 1) ? matcher.group(2) : null;
+
+ // capture the content type on the request
+ _request.setAttribute(DispatchResponseConfiguratorImpl.__CONTENT_TYPE_KEY, contentType);
+
+ // TODO: use Agent APIs when available
+ if ("application/xhtml+xml".equals(contentType))
+ {
+ //TODO: Is this still needed in IE7??
+ String userAgent = _request.getProperty("User-agent");
+ if (userAgent != null && userAgent.indexOf("compatible; MSIE") != -1)
+ {
+ // IE must serve XHTML as text/html
+ contentTypeAndCharset = "text/html";
+
+ if (charset != null)
+ contentTypeAndCharset += ";charset=" + charset;
+ }
+ }
+ }
+ }
+ super.setContentType(contentTypeAndCharset);
+ }
+
+ private final ResourceRequest _request;
+
+ static private final Pattern _CONTENT_TYPE_PATTERN = Pattern.compile("([^;]+)(?:;charset=(.*))?");
+}
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/dispatch/DispatchResponseConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -24,7 +24,8 @@
import javax.faces.context.FacesContext;
import org.apache.myfaces.trinidad.config.Configurator;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
/**
* TODO: Document this
@@ -40,18 +41,22 @@
{
if(!isApplied(externalContext))
{
- if(ExternalContextUtils.isPortlet(externalContext))
+ switch(ExternalContextUtils.getRequestType(externalContext))
{
- if(!ExternalContextUtils.isAction(externalContext))
- {
+ case RENDER:
+ //TODO: not sure if this is needed
externalContext.setResponse(new DispatchRenderResponse(externalContext));
- }
+ break;
+
+ case RESOURCE:
+ //TODO: Not sure if this is needed
+ externalContext.setResponse(new DispatchResourceResponse(externalContext));
+ break;
+
+ case SERVLET:
+ externalContext.setResponse(new DispatchServletResponse(externalContext));
}
- else
- {
- externalContext.setResponse(new DispatchServletResponse(externalContext));
- }
-
+
apply(externalContext);
}
@@ -75,7 +80,7 @@
*/
static public boolean isApplied(ExternalContext context)
{
- return (context.getRequestMap().get(_APPLIED)!=null);
+ return (RequestStateMap.getInstance(context).get(_APPLIED)!=null);
}
/**
@@ -84,7 +89,7 @@
@SuppressWarnings("unchecked")
static public void apply(ExternalContext context)
{
- context.getRequestMap().put(_APPLIED, Boolean.TRUE);
+ RequestStateMap.getInstance(context).put(_APPLIED, Boolean.TRUE);
}
static private final String _APPLIED =
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ActionUploadRequestWrapper.java Thu Jan 29 20:02:50 2009
@@ -30,9 +30,10 @@
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
+import javax.portlet.filter.ActionRequestWrapper;
+
import org.apache.myfaces.trinidad.logging.TrinidadLogger;
import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
-import org.apache.myfaces.trinidadinternal.webapp.wrappers.ActionRequestWrapper;
public class ActionUploadRequestWrapper
extends ActionRequestWrapper
@@ -110,7 +111,6 @@
}
_extractedAndDecodedParams.put(key, newValue);
- _response.setRenderParameters(_extractedAndDecodedParams);
}
// Let the UploadedFiles know, so it can fix up filenames
Modified: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java?rev=738986&r1=738985&r2=738986&view=diff
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java (original)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/FileUploadConfiguratorImpl.java Thu Jan 29 20:02:50 2009
@@ -30,11 +30,14 @@
import javax.servlet.http.HttpServletRequest;
+import org.apache.myfaces.commons.util.ExternalContextUtils;
+
+import org.apache.myfaces.commons.util.RequestType;
import org.apache.myfaces.trinidad.config.Configurator;
import org.apache.myfaces.trinidad.context.RequestContext;
import org.apache.myfaces.trinidad.logging.TrinidadLogger;
import org.apache.myfaces.trinidad.model.UploadedFile;
-import org.apache.myfaces.trinidad.util.ExternalContextUtils;
+import org.apache.myfaces.trinidad.util.RequestStateMap;
import org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler;
import org.apache.myfaces.trinidadinternal.share.util.MultipartFormItem;
@@ -55,7 +58,7 @@
static public Map<String, String[]> getAddedParameters(ExternalContext externalContext)
{
@SuppressWarnings("unchecked")
- Map<String, String[]> map = (Map<String, String[]>) externalContext.getRequestMap().get(_PARAMS);
+ Map<String, String[]> map = (Map<String, String[]>) RequestStateMap.getInstance(externalContext).get(_PARAMS);
return map;
}
@@ -68,7 +71,7 @@
*/
static public boolean isApplied(ExternalContext context)
{
- return (context.getRequestMap().get(_APPLIED)!=null);
+ return (RequestStateMap.getInstance(context).get(_APPLIED)!=null);
}
/**
@@ -77,7 +80,7 @@
@SuppressWarnings("unchecked")
static public void apply(ExternalContext context)
{
- context.getRequestMap().put(_APPLIED, AppliedClass.APPLIED);
+ RequestStateMap.getInstance(context).put(_APPLIED, AppliedClass.APPLIED);
}
/* (non-Javadoc)
@@ -87,6 +90,8 @@
@SuppressWarnings("unchecked")
public void beginRequest(ExternalContext externalContext)
{
+ RequestType type = ExternalContextUtils.getRequestType(externalContext);
+
/*
* Note: This class does not do a dispose on the file uploads. The
* reason for this is that in a portal environment, multiple render-requests
@@ -100,7 +105,7 @@
// as possible is a good thing
//Process MultipartForm if need be
if (MultipartFormHandler.isMultipartRequest(externalContext) &&
- (externalContext.getRequest() instanceof HttpServletRequest || ExternalContextUtils.isPortlet(externalContext)))
+ (ExternalContextUtils.isHttpServletRequest(externalContext) || type.isPortlet()))
{
try
{
@@ -110,7 +115,7 @@
// AdamWiner: looks like the previous Trinidad incarnation
// of this code didn't have any allowed configuration...
mfh.setMaximumAllowedBytes(_maxAllowedBytes);
- mfh.setCharacterEncoding(ExternalContextUtils.getCharacterEncoding(externalContext));
+ mfh.setCharacterEncoding(externalContext.getRequestCharacterEncoding());
final HashMap<String, String[]> parameters = new HashMap<String, String[]>();
MultipartFormItem item;
@@ -223,24 +228,23 @@
static private ExternalContext _getExternalContextWrapper(ExternalContext externalContext, Map<String, String[]> addedParams)
{
+ /**
+ * Only need to support Servlet, Action, and Resource (for ppr) Requests.
+ */
if(!isApplied(externalContext))
{
- if(!ExternalContextUtils.isPortlet(externalContext))
- {
- externalContext.setRequest(new UploadRequestWrapper(
- (HttpServletRequest)externalContext.getRequest(),
- addedParams));
- }
- else if(ExternalContextUtils.isAction(externalContext))
+ switch(ExternalContextUtils.getRequestType(externalContext))
{
- /*
- * We only need to do this if we have an action request. Why?
- * Because durring the ActionRequest, the wrapper will set the
- * RenderParameters. This is a cool thing because subsequent
- * render requests will retain these parameters for us.
- */
- externalContext.setRequest(new ActionUploadRequestWrapper(externalContext,
- addedParams));
+ case SERVLET:
+ externalContext.setRequest(new UploadRequestWrapper((HttpServletRequest)externalContext.getRequest(), addedParams));
+ break;
+
+ case ACTION:
+ externalContext.setRequest(new ActionUploadRequestWrapper(externalContext, addedParams));
+ break;
+
+ case RESOURCE:
+ externalContext.setRequest(new ResourceUploadRequestWrapper(externalContext, addedParams));
}
apply(externalContext);
}
Added: myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java?rev=738986&view=auto
==============================================================================
--- myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java (added)
+++ myfaces/trinidad/branches/sobryan-portlet/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/ResourceUploadRequestWrapper.java Thu Jan 29 20:02:50 2009
@@ -0,0 +1,158 @@
+package org.apache.myfaces.trinidadinternal.config.upload;
+
+import java.io.UnsupportedEncodingException;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.context.ExternalContext;
+
+import javax.portlet.ResourceRequest;
+import javax.portlet.ResourceResponse;
+import javax.portlet.filter.ResourceRequestWrapper;
+
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
+
+public class ResourceUploadRequestWrapper
+ extends ResourceRequestWrapper
+{
+ public ResourceUploadRequestWrapper(ExternalContext ec,
+ Map<String, String[]> params)
+ {
+ super((ResourceRequest) ec.getRequest());
+ _response = (ResourceResponse) ec.getResponse();
+
+ @SuppressWarnings("unchecked")
+ Map<String, String[]> origionalMap = super.getParameterMap();
+
+ _extractedParams = new HashMap<String, String[]>(origionalMap);
+ _extractedParams.putAll(params);
+
+ _encoding = super.getCharacterEncoding();
+ }
+
+ /**
+ * Hide the content type so that no one tries to re-download the
+ * uploaded files.
+ */
+ @Override
+ public String getContentType()
+ {
+ return _WWW_FORM_URLENCODED_TYPE;
+ }
+
+ @Override
+ public String getCharacterEncoding()
+ {
+ return _encoding;
+ }
+
+
+ /**
+ * Trap calls to setCharacterEncoding() to decode parameters correctly
+ */
+ @Override
+ public void setCharacterEncoding(String encoding)
+ throws UnsupportedEncodingException
+ {
+ // If the encoding is already right, we can bail
+ if (encoding.equals(_encoding))
+ return;
+
+ // Don't call super.setCharacterEncoding() - it's too late
+ // and we'll get a warning
+ _encoding = encoding;
+ if (_LOG.isFine())
+ _LOG.fine("Switching encoding of wrapper to " + encoding);
+
+ _extractedAndDecodedParams =
+ new HashMap<String, String[]>(_extractedParams.size());
+
+ byte[] buffer = new byte[256];
+
+ for (Map.Entry<String, String[]> entry: _extractedParams.entrySet())
+ {
+ String key = entry.getKey();
+ key = CaboHttpUtils.decodeRequestParameter(key, encoding, buffer);
+
+ String[] oldValue = entry.getValue();
+ int length = oldValue.length;
+ String[] newValue = new String[length];
+ for (int i = 0; i < length; i++)
+ {
+ newValue[i] =
+ CaboHttpUtils.decodeRequestParameter(oldValue[i], encoding,
+ buffer);
+ if (_LOG.isFinest())
+ _LOG.finest("Parameter " + key + ":" + newValue[i]);
+ }
+
+ _extractedAndDecodedParams.put(key, newValue);
+ }
+
+ // Let the UploadedFiles know, so it can fix up filenames
+ UploadedFiles.setCharacterEncoding(this, encoding);
+ }
+
+ @Override
+ public String getParameter(String param)
+ {
+ String[] value = _getParameterValues(param);
+ if (value == null)
+ return null;
+
+ return value[0];
+ }
+
+ @Override
+ public Map<String, String[]> getParameterMap()
+ {
+ Map<String, String[]> map = _getMap();
+ return Collections.unmodifiableMap(map);
+ }
+
+ @Override
+ public Enumeration<String> getParameterNames()
+ {
+ return Collections.enumeration(_getMap().keySet());
+ }
+
+ @Override
+ public String[] getParameterValues(String param)
+ {
+ String[] value = _getParameterValues(param);
+ if (value == null)
+ return null;
+
+ return (String[]) value.clone();
+ }
+
+ private String[] _getParameterValues(String param)
+ {
+ return _getMap().get(param);
+ }
+
+ /**
+ * Get the correct map of parameters whether or not setCharacterEncoding()
+ * was called.
+ */
+ private Map<String, String[]> _getMap()
+ {
+ if (_extractedAndDecodedParams != null)
+ return _extractedAndDecodedParams;
+
+ return _extractedParams;
+ }
+
+ private Map<String, String[]> _extractedAndDecodedParams;
+ private Map<String, String[]> _extractedParams;
+ private ResourceResponse _response;
+ private String _encoding;
+ private static final String _WWW_FORM_URLENCODED_TYPE =
+ "application/x-www-form-urlencoded";
+ private static final TrinidadLogger _LOG =
+ TrinidadLogger.createTrinidadLogger(ResourceUploadRequestWrapper.class);
+}