You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sk...@apache.org on 2007/10/04 12:55:19 UTC
svn commit: r581845 - in
/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra:
conversation/jsf/filter/ filter/ frameworkAdapter/ frameworkAdapter/jsf/ lib/
Author: skitching
Date: Thu Oct 4 03:55:18 2007
New Revision: 581845
URL: http://svn.apache.org/viewvc?rev=581845&view=rev
Log:
Alter implementations of orchestra-provided servlet filters. This makes the following incompatible changes:
1. Class frameworkAdapter/FrameworkAdapterServletFilter no longer exists. It is replaced by
frameworkAdapter/jsf/JsfFrameworkAdapterFilter.
2. Class conversation.jsf.OrchestraServletFilter no longer has a servlet config param to choose the framework; it
always chooses jsf (as the package name indicates).
There are some other API changes, but nothing that is likely to affect users.
Added:
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/OrchestraServletFilter.java
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapterFilter.java
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/lib/CompoundFilter.java
Removed:
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/FrameworkAdapterServletFilter.java
Modified:
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/filter/OrchestraServletFilter.java
myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapter.java
Modified: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/filter/OrchestraServletFilter.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/filter/OrchestraServletFilter.java?rev=581845&r1=581844&r2=581845&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/filter/OrchestraServletFilter.java (original)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/conversation/jsf/filter/OrchestraServletFilter.java Thu Oct 4 03:55:18 2007
@@ -19,163 +19,21 @@
package org.apache.myfaces.orchestra.conversation.jsf.filter;
-import org.apache.myfaces.orchestra.connectionManager.ConnectionManagerDataSource;
-import org.apache.myfaces.orchestra.conversation.ConversationContext;
-import org.apache.myfaces.orchestra.conversation.ConversationManager;
-import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapterServletFilter;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import java.io.IOException;
+import org.apache.myfaces.orchestra.lib.CompoundFilter;
/**
- * Perform a number of useful per-request tasks.
- * <p>
- * <h2>Configures the orchestra FrameworkAdapter</h2>
- * Orchestra accesses information about the request, response, session, etc via a
- * FrameworkAdapter so that it can be used with multiple web tier frameworks. This
- * class selects the correct adapter to use; the default is the JsfFrameworkAdapter
- * but setting the appropriate servlet context parameter in web.xml allows other
- * adapter classes to be selected.
- * <p>
- * <h2>Make request/response objects accessible</h2>
- * The request and response objects for the current request are stored in thread-local
- * variables for the duration of this request. This makes it possible for any code to
- * retrieve them via static methods on this class. This is required by at least
- * the JsfFrameworkAdapter class, ie required when using Orchestra with JSF.
- * <p>
- * <h2>Request Synchronization</h2>
- * It is possible for multiple requests associated with the same http session to be
- * received concurrently. In particular, ajax pages can cause this.
- * <p>
- * By default, the servlet engine simply processes all requests concurrently
- * in different threads. However that can cause all sorts of unexpected problems with
- * session-scoped objects.
- * <p>
- * The usual solution is to apply a filter to all requests which uses standard java
- * synchronisation on a session-scoped object, taking the lock on request entry and
- * releasing it on request exit. This ensures that only one request for that session
- * runs at a time, with the others waiting until they can obtain a lock on the
- * appropriate object.
+ * Provides the functionality of two useful orchestra filters together as one, reducing the
+ * amount of web.xml configuration required.
* <p>
- * When using an Orchestra conversationContext, session-scoped data should be avoided and
- * conversation-scoped beans used instead. If there is no session-scoped data in use by
- * an application then it is possible to allow concurrent requests to the same http session,
- * but NOT concurrent access to the same orchestra conversationContext. This filter
- * implements that, by holding a lock on a mutex object held by the appropriate
- * conversationContext.
- * <p>
- * The serialize-requests functionality can be enabled or disabled via a filter init
- * parameter; setting "serializeRequests" to "false" disables this filter. Default
- * value: true (enabled).
- * <p>
- * <h2>JDBC Connection Management</h2>
- * Orchestra provides a special DataSource wrapper that can be configured for any
- * datasource used by the application. The datasource simply wraps all real Connection
- * objects it returns in a proxy, and keeps track of them. Here in this servlet it
- * checks whether all connections borrowed by this thread have been returned, and if
- * not returns the real connection nulls out the connection held by the proxy. See
- * ConnectionManagerDataSource for more details.
+ * @see org.apache.myfaces.orchestra.frameworkAdapter.jsf.JsfFrameworkAdapterFilter
+ * @see org.apache.myfaces.orchestra.filter.OrchestraServletFilter
*/
-public class OrchestraServletFilter implements Filter
+public class OrchestraServletFilter extends CompoundFilter
{
- /**
- * This filter init property can be set to "true" or "false". Default: "true".
- */
- public final static String SERIALIZE_REQUESTS = "serializeRequests"; // NON-NLS
-
- /**
- * A <i>servlet context</i> property that defines the name of a java class which maps from
- * the orchestra FrameworkAdapterInterface to the actual web tier environment
- * that orchestra is running in. Defaults to the standard orchestra JSF adapter.
- * This only needs to be set if Orchestra is being used in a non-JSF environment.
- */
- public final static String FRAMEWORK_ADAPTER_KEY = "org.apache.myfaces.orchestra.FRAMEWORK_ADAPTER_CLASS"; // NON-NLS
-
- /** The default value for FRAMEWORK_ADAPTER_KEY. */
- public final static String FRAMEWORK_ADAPTER_DFLT = "org.apache.myfaces.orchestra.frameworkAdapter.jsf.JsfFrameworkAdapter"; // NON-NLS
-
- /**
- * Key of an attribute within the ConversationContext that is used as a lock to serialize
- * multiple http requests for the same conversation context.
- */
- private final static String CONTEXT_MUTEXT_OBJECT = OrchestraServletFilter.class.getName() + ".SER_MUTEX";
-
- private boolean serializeRequests = true;
-
- private final FrameworkAdapterServletFilter frameworkAdapterServletFilter = new FrameworkAdapterServletFilter();
-
- public void init(FilterConfig filterConfig) throws ServletException
- {
- String value = filterConfig.getInitParameter(SERIALIZE_REQUESTS);
- if ("false".equals(value)) // NON-NLS
- {
- serializeRequests = false;
- }
-
- frameworkAdapterServletFilter.init(filterConfig);
- }
-
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException
- {
- frameworkAdapterServletFilter.doFilter(servletRequest, servletResponse, new FilterChain()
- {
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException
- {
- try
- {
- Object mutex = null;
- if (serializeRequests)
- {
- ConversationManager manager = ConversationManager.getInstance(false);
- if (manager != null)
- {
- ConversationContext conversationContext = manager.getCurrentConversationContext();
- if (conversationContext != null)
- {
- synchronized(conversationContext)
- {
- mutex = conversationContext.getAttribute(CONTEXT_MUTEXT_OBJECT);
- if (mutex == null)
- {
- mutex = new Object();
- conversationContext.setAttribute(CONTEXT_MUTEXT_OBJECT, mutex);
- }
- }
- }
- }
- }
- if (serializeRequests && mutex != null)
- {
- synchronized(mutex)
- {
- filterChain.doFilter(servletRequest, servletResponse);
- }
- }
- else
- {
- filterChain.doFilter(servletRequest, servletResponse);
- }
- }
- finally
- {
- cleanupPersistence();
- }
- }
- });
- }
-
- protected void cleanupPersistence()
- {
- ConnectionManagerDataSource.releaseAllBorrowedConnections();
- }
-
- public void destroy()
+ public OrchestraServletFilter()
{
- frameworkAdapterServletFilter.destroy();
+ super(
+ new org.apache.myfaces.orchestra.frameworkAdapter.jsf.JsfFrameworkAdapterFilter(),
+ new org.apache.myfaces.orchestra.filter.OrchestraServletFilter());
}
}
Added: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/OrchestraServletFilter.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/OrchestraServletFilter.java?rev=581845&view=auto
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/OrchestraServletFilter.java (added)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/filter/OrchestraServletFilter.java Thu Oct 4 03:55:18 2007
@@ -0,0 +1,156 @@
+/*
+ * 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.myfaces.orchestra.filter;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.myfaces.orchestra.connectionManager.ConnectionManagerDataSource;
+import org.apache.myfaces.orchestra.conversation.ConversationContext;
+import org.apache.myfaces.orchestra.conversation.ConversationManager;
+
+/**
+ * Perform a number of useful per-request tasks.
+ * <p>
+ * This filter is entirely optional; it can be omitted if you do not need any of the
+ * functionality provided here.
+ * <p>
+ * Note that it is necessary to define a filter that initialises the Orchestra
+ * framework; this can be done either via a standalone filter such as
+ * JsfFrameworkAdapterFilter, or via a filter that combines framework initialisation
+ * with the functionality of this class, such as JsfOrchestraServletFilter.
+ * <p>
+ * <h2>Request Serialization</h2>
+ * It is possible for multiple requests associated with the same http session to be
+ * received concurrently. In particular, ajax pages can cause this.
+ * <p>
+ * By default, the servlet engine simply processes all requests concurrently
+ * in different threads. However that can cause all sorts of unexpected problems with
+ * session-scoped objects.
+ * <p>
+ * The usual solution is to apply a filter to all requests which uses standard java
+ * synchronisation on a session-scoped object, taking the lock on request entry and
+ * releasing it on request exit. This ensures that only one request for that session
+ * runs at a time, with the others waiting until they can obtain a lock on the
+ * appropriate object. This is referred to as "request serialization" because it causes
+ * requests to be processed serially, ie one after the other, rather than concurrently.
+ * This has nothing to do with java.io.Serializable.
+ * <p>
+ * When using an Orchestra conversationContext, session-scoped data should be avoided and
+ * conversation-scoped beans used instead. If there is no session-scoped data in use by
+ * an application then it is possible to allow concurrent requests to the same http session,
+ * but NOT concurrent access to the same orchestra conversationContext. This filter
+ * implements that, by holding a lock on a mutex object held by the appropriate
+ * conversationContext.
+ * <p>
+ * The request serialization functionality can be enabled or disabled via a filter init
+ * parameter; setting "serializeRequests" to "false" disables this feature. Default
+ * value: true (enabled).
+ * <p>
+ * <h2>JDBC Connection Management</h2>
+ * Orchestra provides a special DataSource wrapper that can be configured for any
+ * datasource used by the application. The datasource simply wraps all real Connection
+ * objects it returns in a proxy, and keeps track of them. Here in this servlet it
+ * checks whether all connections borrowed by this thread have been returned, and if
+ * not returns the real connection nulls out the connection held by the proxy. See
+ * ConnectionManagerDataSource for more details.
+ */
+public class OrchestraServletFilter implements Filter
+{
+ /**
+ * This filter init property can be set to "true" or "false". Default: "true".
+ */
+ public final static String SERIALIZE_REQUESTS = "serializeRequests"; // NON-NLS
+
+ /**
+ * Key of an attribute within the ConversationContext that is used as a lock to serialize
+ * multiple http requests for the same conversation context.
+ */
+ private final static String CONTEXT_MUTEXT_OBJECT = OrchestraServletFilter.class.getName() + ".SER_MUTEX";
+
+ private boolean serializeRequests = true;
+
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ String value = filterConfig.getInitParameter(SERIALIZE_REQUESTS);
+ if ("false".equals(value)) // NON-NLS
+ {
+ serializeRequests = false;
+ }
+ }
+
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException
+ {
+ try
+ {
+ Object mutex = null;
+ if (serializeRequests)
+ {
+ ConversationManager manager = ConversationManager.getInstance(false);
+ if (manager != null)
+ {
+ ConversationContext conversationContext = manager.getCurrentConversationContext();
+ if (conversationContext != null)
+ {
+ synchronized(conversationContext)
+ {
+ mutex = conversationContext.getAttribute(CONTEXT_MUTEXT_OBJECT);
+ if (mutex == null)
+ {
+ mutex = new Object();
+ conversationContext.setAttribute(CONTEXT_MUTEXT_OBJECT, mutex);
+ }
+ }
+ }
+ }
+ }
+ if (serializeRequests && mutex != null)
+ {
+ synchronized(mutex)
+ {
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+ }
+ else
+ {
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+ }
+ finally
+ {
+ cleanupPersistence();
+ }
+ }
+
+ protected void cleanupPersistence()
+ {
+ ConnectionManagerDataSource.releaseAllBorrowedConnections();
+ }
+
+ public void destroy()
+ {
+ }
+}
\ No newline at end of file
Modified: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapter.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapter.java?rev=581845&r1=581844&r2=581845&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapter.java (original)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapter.java Thu Oct 4 03:55:18 2007
@@ -18,15 +18,22 @@
*/
package org.apache.myfaces.orchestra.frameworkAdapter.jsf;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.web.context.support.WebApplicationContextUtils;
-import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapterInterface;
-import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapterServletFilter;
+import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.orchestra.conversation.ConversationWiperThread;
+import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
+import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapterInterface;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* A JSF Implementation for the FrameworkAdapter.
@@ -37,12 +44,44 @@
public class JsfFrameworkAdapter implements FrameworkAdapterInterface
{
private final static String ISE_MESSAGE="can't find a way to access jsf data structures"; // NON-NLS
+ private final static ThreadLocal httpServletRequest = new ThreadLocal();
+ private final static ThreadLocal httpServletResponse = new ThreadLocal();
+
+ private final Log log = LogFactory.getLog(JsfFrameworkAdapter.class);
protected FacesContext getFacesContext()
{
return FacesContext.getCurrentInstance();
}
+ private HttpServletRequest getRequest()
+ {
+ return (HttpServletRequest) httpServletRequest.get();
+ }
+
+ public void beginRequest(ServletRequest req, ServletResponse rsp)
+ {
+ log.debug("Beginning request");
+ if (req instanceof HttpServletRequest)
+ {
+ httpServletRequest.set(req);
+ }
+ if (rsp instanceof HttpServletResponse)
+ {
+ httpServletResponse.set(rsp);
+ }
+
+ FrameworkAdapter.setInstance(this);
+ }
+
+ public void endRequest()
+ {
+ log.debug("Ending request");
+ FrameworkAdapter.setInstance(null);
+ httpServletRequest.set(null);
+ httpServletResponse.set(null);
+ }
+
public String getInitParameter(String key)
{
FacesContext context = getFacesContext();
@@ -58,7 +97,7 @@
return context.getExternalContext().getRequestParameterMap().get(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
return request.getParameter(key);
@@ -75,7 +114,7 @@
return context.getExternalContext().getRequestParameterMap().containsKey(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
return request.getParameter(key) != null;
@@ -92,7 +131,7 @@
return context.getExternalContext().getRequestMap().get(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
return request.getAttribute(key);
@@ -110,7 +149,7 @@
return;
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
request.setAttribute(key, value);
@@ -128,7 +167,7 @@
return context.getExternalContext().getRequestMap().containsKey(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
return request.getAttribute(key) != null;
@@ -145,7 +184,7 @@
return context.getExternalContext().getSessionMap().get(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null && request.getSession(true) != null)
{
return request.getSession(true).getAttribute(key);
@@ -163,7 +202,7 @@
return;
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null && request.getSession(true) != null)
{
request.getSession(true).setAttribute(key, value);
@@ -180,7 +219,7 @@
return context.getExternalContext().getSessionMap().containsKey(key);
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null && request.getSession(true) != null)
{
return request.getSession(true).getAttribute(key) != null;
@@ -197,7 +236,7 @@
return context.getExternalContext().getRequestContextPath();
}
- HttpServletRequest request = FrameworkAdapterServletFilter.getHttpServletRequest();
+ HttpServletRequest request = getRequest();
if (request != null)
{
return request.getContextPath();
Added: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapterFilter.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapterFilter.java?rev=581845&view=auto
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapterFilter.java (added)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/frameworkAdapter/jsf/JsfFrameworkAdapterFilter.java Thu Oct 4 03:55:18 2007
@@ -0,0 +1,72 @@
+/*
+ * 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.myfaces.orchestra.frameworkAdapter.jsf;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Configures the JsfFrameworkAdapter.
+ * <p>
+ * Orchestra accesses information about the request, response, session, etc via a
+ * FrameworkAdapter so that it can be used with multiple web tier frameworks. This
+ * class selects and configures the JSF version of this adapter.
+ * <p>
+ * Note that the JsfOrchestraServletFilter class combines the functionality of this
+ * class and the OrchestraServletFilter class together for convenience (allows just
+ * one filter to be defined rather than two). Of course this is only useful if you
+ * actually want the functionality of the OrchestraServletFilter.
+ */
+public class JsfFrameworkAdapterFilter implements Filter
+{
+ private final Log log = LogFactory.getLog(JsfFrameworkAdapterFilter.class);
+ private final JsfFrameworkAdapter adapter = new JsfFrameworkAdapter();
+
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ }
+
+ public void doFilter(ServletRequest req, ServletResponse rsp, FilterChain filterChain) throws IOException, ServletException
+ {
+ log.debug("doFilter");
+ try
+ {
+ adapter.beginRequest(req, rsp);
+ filterChain.doFilter(req, rsp);
+ }
+ finally
+ {
+ adapter.endRequest();
+ }
+ }
+
+ public void destroy()
+ {
+ }
+}
\ No newline at end of file
Added: myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/lib/CompoundFilter.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/lib/CompoundFilter.java?rev=581845&view=auto
==============================================================================
--- myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/lib/CompoundFilter.java (added)
+++ myfaces/orchestra/trunk/core/src/main/java/org/apache/myfaces/orchestra/lib/CompoundFilter.java Thu Oct 4 03:55:18 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.myfaces.orchestra.lib;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * Compose two filter objects together, as if filter2 is nested within filter1.
+ */
+public abstract class CompoundFilter implements Filter
+{
+ private final Filter filter1;
+ private final Filter filter2;
+
+ public CompoundFilter(Filter filter1, Filter filter2)
+ {
+ this.filter1 = filter1;
+ this.filter2 = filter2;
+ }
+
+ public void init(FilterConfig filterConfig) throws ServletException
+ {
+ filter1.init(filterConfig);
+ filter2.init(filterConfig);
+ }
+
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException
+ {
+ FilterChain chain = new FilterChain()
+ {
+ public void doFilter(ServletRequest req, ServletResponse rsp) throws IOException, ServletException
+ {
+ filter2.doFilter(req, rsp, filterChain);
+ }
+
+ };
+
+ filter1.doFilter(servletRequest, servletResponse, chain);
+ }
+
+ public void destroy()
+ {
+ filter2.destroy();
+ filter1.destroy();
+ }
+}
\ No newline at end of file