You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mr...@apache.org on 2008/06/21 17:13:59 UTC
svn commit: r670209 -
/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/filter/
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 {@link 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 {@link 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 {@link 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 {@link 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