Author: mrdon Date: Sat Jun 21 08:13:59 2008 New Revision: 670209 URL: http://svn.apache.org/viewvc?rev=670209&view=rev Log: First cut at a new filter strategy WW-2193
Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/CleanupOperations.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ExecuteOperations.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/InitOperations.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/PrepareOperations.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareAndExecuteFilter.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/package-info.java Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/CleanupOperations.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/CleanupOperations.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/CleanupOperations.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/CleanupOperations.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,69 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.StrutsException; +import com.opensymphony.xwork2.ActionContext; + +/** + * Contains cleanup operations in all stages for filters + */ +public class CleanupOperations { + + private Dispatcher dispatcher; + + public CleanupOperations(Dispatcher dispatcher) { + this.dispatcher = dispatcher; + } + + /** + * Cleans up the dispatcher instance + */ + public void cleanupDispatcher() { + if (dispatcher == null) { + throw new StrutsException("something is seriously wrong, Dispatcher is not initialized (null) "); + } else { + try { + dispatcher.cleanup(); + } finally { + ActionContext.setContext(null); + } + } + } + + /** + * Cleans up a request of thread locals + */ + public void cleanupRequest() { + // always dontClean up the thread request, even if an action hasn't been executed + ActionContext.setContext(null); + Dispatcher.setInstance(null); + } + + /** + * Cleans up after the initialization process + */ + public void cleanupInit() { + ActionContext.setContext(null); + } + +} Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ExecuteOperations.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ExecuteOperations.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ExecuteOperations.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/ExecuteOperations.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,79 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.StaticContentLoader; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.RequestUtils; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Contains execution operations for filters + */ +public class ExecuteOperations { + private ServletContext servletContext; + private Dispatcher dispatcher; + + public ExecuteOperations(ServletContext servletContext, Dispatcher dispatcher) { + this.dispatcher = dispatcher; + this.servletContext = servletContext; + } + + /** + * Tries to execute a request for a static resource + * @return True if it was handled, false if the filter should fall through + * @throws IOException + * @throws ServletException + */ + public boolean executeStaticResourceRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + // there is no action in this request, should we look for a static resource? + String resourcePath = RequestUtils.getServletPath(request); + + if ("".equals(resourcePath) && null != request.getPathInfo()) { + resourcePath = request.getPathInfo(); + } + + StaticContentLoader staticResourceLoader = dispatcher.getContainer().getInstance(StaticContentLoader.class); + if (staticResourceLoader.canHandle(resourcePath)) { + staticResourceLoader.findStaticResource(resourcePath, request, response); + // The framework did its job here + return true; + + } else { + // this is a normal request, let it pass through + return false; + } + } + + /** + * Executes an action + * @throws ServletException + */ + public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { + dispatcher.serviceAction(request, response, servletContext, mapping); + } +} Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/InitOperations.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/InitOperations.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/InitOperations.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/InitOperations.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,106 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.StaticContentLoader; +import org.apache.struts2.util.ClassLoaderUtils; + +import javax.servlet.FilterConfig; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +/** + * Contains initialization operations + */ +public class InitOperations { + + public InitOperations() { + } + + /** + * Initializes the internal Struts logging + */ + public void initLogging(FilterConfig filterConfig) { + String factoryName = filterConfig.getInitParameter("loggerFactory"); + if (factoryName != null) { + try { + Class cls = ClassLoaderUtils.loadClass(factoryName, this.getClass()); + LoggerFactory fac = (LoggerFactory) cls.newInstance(); + LoggerFactory.setLoggerFactory(fac); + } catch (InstantiationException e) { + System.err.println("Unable to instantiate logger factory: " + factoryName + ", using default"); + e.printStackTrace(); + } catch (IllegalAccessException e) { + System.err.println("Unable to access logger factory: " + factoryName + ", using default"); + e.printStackTrace(); + } catch (ClassNotFoundException e) { + System.err.println("Unable to locate logger factory class: " + factoryName + ", using default"); + e.printStackTrace(); + } + } + } + + /** + * Creates and initializes the dispatcher + */ + public Dispatcher initDispatcher(FilterConfig filterConfig) { + Dispatcher dispatcher = createDispatcher(filterConfig); + dispatcher.init(); + return dispatcher; + } + + /** + * Initializes the static content loader with the filter configuration + */ + public StaticContentLoader initStaticContentLoader(FilterConfig filterConfig, Dispatcher dispatcher) { + StaticContentLoader loader = dispatcher.getContainer().getInstance(StaticContentLoader.class); + loader.setFilterConfig(filterConfig); + return loader; + } + + /** + * @return The dispatcher on the thread. + * @throws IllegalStateException If there is no dispatcher available + */ + public Dispatcher findDispatcherOnThread() { + Dispatcher dispatcher = Dispatcher.getInstance(); + if (dispatcher == null) { + throw new IllegalStateException("Must have the StrutsPrepareFilter execute before this one"); + } + return dispatcher; + } + + /** + * Create a [EMAIL PROTECTED] Dispatcher} + */ + private Dispatcher createDispatcher(FilterConfig filterConfig) { + Map<String, String> params = new HashMap<String, String>(); + for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements();) { + String name = (String) e.nextElement(); + String value = filterConfig.getInitParameter(name); + params.put(name, value); + } + return new Dispatcher(filterConfig.getServletContext(), params); + } +} Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/PrepareOperations.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/PrepareOperations.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/PrepareOperations.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/PrepareOperations.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,117 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.mapper.ActionMapping; +import org.apache.struts2.dispatcher.mapper.ActionMapper; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; + +import java.io.IOException; + +/** + * Contains preparation operations for a request before execution + */ +public class PrepareOperations { + + private ServletContext servletContext; + private Dispatcher dispatcher; + private static final String STRUTS_ACTION_MAPPING_KEY = "struts.actionMapping"; + + public PrepareOperations(ServletContext servletContext, Dispatcher dispatcher) { + this.dispatcher = dispatcher; + this.servletContext = servletContext; + } + + /** + * Creates the action context and initializes the thread local + */ + public ActionContext createActionContext() { + ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack(); + ActionContext ctx = new ActionContext(stack.getContext()); + ActionContext.setContext(ctx); + return ctx; + } + + /** + * Assigns the dispatcher to the dispatcher thread local + */ + public void assignDispatcherToThread() { + Dispatcher.setInstance(dispatcher); + } + + /** + * Sets the request encoding and locale on the response + */ + public void setEncodingAndLocale(HttpServletRequest request, HttpServletResponse response) { + dispatcher.prepare(request, response); + } + + /** + * Wraps the request with the Struts wrapper that handles multipart requests better + * @return The new request, if there is one + * @throws ServletException + */ + public HttpServletRequest wrapRequest(HttpServletRequest oldRequest) throws ServletException { + HttpServletRequest request = oldRequest; + try { + // Wrap request first, just in case it is multipart/form-data + // parameters might not be accessible through before encoding (ww-1278) + request = dispatcher.wrapRequest(request, servletContext); + } catch (IOException e) { + String message = "Could not wrap servlet request with MultipartRequestWrapper!"; + throw new ServletException(message, e); + } + return request; + } + + /** + * Finds and optionally creates an [EMAIL PROTECTED] ActionMapping}. It first looks in the current request to see if one + * has already been found, otherwise, it creates it and stores it in the request. No mapping will be created in the + * case of static resource requests or unidentifiable requests for other servlets, for example. + */ + public ActionMapping findActionMapping(HttpServletRequest request, HttpServletResponse response) { + ActionMapping mapping = (ActionMapping) request.getAttribute(STRUTS_ACTION_MAPPING_KEY); + if (mapping == null) { + try { + mapping = dispatcher.getContainer().getInstance(ActionMapper.class).getMapping(request, dispatcher.getConfigurationManager()); + if (mapping != null) { + request.setAttribute(STRUTS_ACTION_MAPPING_KEY, mapping); + } + } catch (Exception ex) { + dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex); + } + } + + return mapping; + } + + +} Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsExecuteFilter.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,89 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.StrutsStatics; +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.mapper.ActionMapping; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Executes the discovered request information. This filter requires the [EMAIL PROTECTED] StrutsPrepareFilter} to have already + * been executed in the current chain. + */ +public class StrutsExecuteFilter implements StrutsStatics, Filter { + private PrepareOperations prepare; + private CleanupOperations cleanup; + private ExecuteOperations execute; + + private FilterConfig filterConfig; + + public void init(FilterConfig filterConfig) throws ServletException { + this.filterConfig = filterConfig; + } + + protected synchronized void lazyInit() { + if (execute == null) { + InitOperations init = new InitOperations(); + try { + Dispatcher dispatcher = init.findDispatcherOnThread(); + init.initStaticContentLoader(filterConfig, dispatcher); + + prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); + cleanup = new CleanupOperations(dispatcher); + execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); + } finally { + cleanup.cleanupInit(); + } + } + + } + + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + // This is necessary since we need the dispatcher instance, which was created by the prepare filter + lazyInit(); + + ActionMapping mapping = prepare.findActionMapping(request, response); + if (mapping == null) { + boolean handled = execute.executeStaticResourceRequest(request, response); + if (!handled) { + chain.doFilter(request, response); + } + } else { + execute.executeAction(request, response, mapping); + } + } + + public void destroy() { + prepare = null; + execute = null; + cleanup = null; + filterConfig = null; + } +} \ No newline at end of file Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareAndExecuteFilter.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareAndExecuteFilter.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareAndExecuteFilter.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareAndExecuteFilter.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,84 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.StrutsStatics; +import org.apache.struts2.dispatcher.Dispatcher; +import org.apache.struts2.dispatcher.mapper.ActionMapping; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use + * when you don't have another filter that needs access to action context information, such as Sitemesh. + */ +public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter { + private PrepareOperations prepare; + private CleanupOperations cleanup; + private ExecuteOperations execute; + + public void init(FilterConfig filterConfig) throws ServletException { + InitOperations init = new InitOperations(); + try { + init.initLogging(filterConfig); + Dispatcher dispatcher = init.initDispatcher(filterConfig); + init.initStaticContentLoader(filterConfig, dispatcher); + + prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); + cleanup = new CleanupOperations(dispatcher); + execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher); + } finally { + cleanup.cleanupInit(); + } + + } + + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + try { + prepare.createActionContext(); + prepare.assignDispatcherToThread(); + prepare.setEncodingAndLocale(request, response); + request = prepare.wrapRequest(request); + ActionMapping mapping = prepare.findActionMapping(request, response); + if (mapping == null) { + boolean handled = execute.executeStaticResourceRequest(request, response); + if (!handled) { + chain.doFilter(request, response); + } + } else { + execute.executeAction(request, response, mapping); + } + } finally { + cleanup.cleanupRequest(); + } + } + + public void destroy() { + cleanup.cleanupDispatcher(); + } +} Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/StrutsPrepareFilter.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,73 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.struts2.dispatcher.filter; + +import org.apache.struts2.StrutsStatics; +import org.apache.struts2.dispatcher.Dispatcher; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Prepares the request for execution by a later [EMAIL PROTECTED] StrutsExecuteFilter} filter instance. + */ +public class StrutsPrepareFilter implements StrutsStatics, Filter { + private PrepareOperations prepare; + private CleanupOperations cleanup; + + public void init(FilterConfig filterConfig) throws ServletException { + InitOperations init = new InitOperations(); + try { + init.initLogging(filterConfig); + Dispatcher dispatcher = init.initDispatcher(filterConfig); + + prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher); + cleanup = new CleanupOperations(dispatcher); + } finally { + cleanup.cleanupInit(); + } + + } + + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) req; + HttpServletResponse response = (HttpServletResponse) res; + + try { + prepare.createActionContext(); + prepare.assignDispatcherToThread(); + prepare.setEncodingAndLocale(request, response); + request = prepare.wrapRequest(request); + prepare.findActionMapping(request, response); + + chain.doFilter(request, response); + } finally { + cleanup.cleanupRequest(); + } + } + + public void destroy() { + cleanup.cleanupDispatcher(); + } +} \ No newline at end of file Added: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/package-info.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/package-info.java?rev=670209&view=auto ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/package-info.java (added) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/package-info.java Sat Jun 21 08:13:59 2008 @@ -0,0 +1,70 @@ +/* + * $Id: DefaultActionSupport.java 651946 2008-04-27 13:41:38Z apetrelli $ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +/** + * This package contains a reimagining of the traditional Struts filter dispatchers. Each specific deployment has + * their own filters to prevent confusion. In addition, the operations have been explicitly pulled into *Operations + * objects that try to document through method naming what is happening at every step. Here are a few common use + * cases and how you would manage the Struts deployment: + * + * <h3>Simple Dispatcher</h3> + * <pre> + * <filter> + * <filter-name>struts2</filter-name> + * <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> + * </filter> + * + * <filter-mapping> + * <filter-name>struts2</filter-name> + * <url-pattern>/*</url-pattern> + * </filter-mapping> + * </pre> + * + * <h3>Deployment with Sitemesh</h3> + * <pre> + * <filter> + * <filter-name>struts2-prepare</filter-name> + * <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class> + * </filter> + * <filter> + * <filter-name>sitemesh</filter-name> + * <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> + * </filter> + * <filter> + * <filter-name>struts2-execute</filter-name> + * <filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class> + * </filter> + * + * <filter-mapping> + * <filter-name>struts2-prepare</filter-name> + * <url-pattern>/*</url-pattern> + * </filter-mapping> + * <filter-mapping> + * <filter-name>sitemesh</filter-name> + * <url-pattern>/*</url-pattern> + * </filter-mapping> + * <filter-mapping> + * <filter-name>struts2-execute</filter-name> + * <url-pattern>/*</url-pattern> + * </filter-mapping> + * </pre> + * + */ +package org.apache.struts2.dispatcher.filter; \ No newline at end of file