You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by sebb <se...@gmail.com> on 2009/12/08 02:24:57 UTC
Re: svn commit: r887992 - in /tomcat/trunk/java/org/apache/catalina:
core/ApplicationDispatcher.java core/ApplicationFilterChain.java
core/StandardWrapperValve.java deploy/FilterDef.java startup/ContextConfig.java
startup/WebXml.java
On 07/12/2009, markt@apache.org <ma...@apache.org> wrote:
> Author: markt
> Date: Mon Dec 7 16:43:25 2009
> New Revision: 887992
>
> URL: http://svn.apache.org/viewvc?rev=887992&view=rev
> Log:
> Add support for WebFilter
> Remove wrappers to implement isAsyncSupported() having found the setAttribute() code
> It is individual filters rather than the whole filter chain that need to be considered for isAsyncSupported
>
> Modified:
> tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
> tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
> tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
> tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java
> tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
> tomcat/trunk/java/org/apache/catalina/startup/WebXml.java
>
> Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationDispatcher.java Mon Dec 7 16:43:25 2009
> @@ -641,15 +641,6 @@
> ApplicationFilterChain filterChain = factory.createFilterChain(request,
> wrapper,servlet);
>
> - Object origAsyncSupported = request.getAttribute(Globals.ASYNC_SUPPORTED_ATTR);
> - //we have a new filter chain, setup isAsyncSupported here
> - boolean filterAsyncSupported = filterChain.isAsyncSupported();
> - if (!filterAsyncSupported && request.isAsyncSupported()) {
> - //the request says we support it, but the filters don't
> - //TODO SERVLET3 - async
> - request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, Boolean.FALSE);
> - }
> -
> // Call the service() method for the allocated servlet instance
> try {
> String jspFile = wrapper.getJspFile();
> @@ -704,8 +695,6 @@
> wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
> wrapper.getName()), e);
> runtimeException = e;
> - } finally {
> - request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR, origAsyncSupported);
> }
>
> // Release the filter chain (if any) for this request
> @@ -715,7 +704,7 @@
> } catch (Throwable e) {
> wrapper.getLogger().error(sm.getString("standardWrapper.releaseFilters",
> wrapper.getName()), e);
> - // FIXME: Exception handling needs to be simpiler to what is in the StandardWrapperValue
> + // FIXME: Exception handling needs to be simpler to what is in the StandardWrapperValue
Should that be "similar to" ?
If it really is "simpler", then it would be "simpler than".
> }
>
> // Deallocate the allocated servlet instance
>
> Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/core/ApplicationFilterChain.java Mon Dec 7 16:43:25 2009
> @@ -28,10 +28,8 @@
> import javax.servlet.Servlet;
> import javax.servlet.ServletException;
> import javax.servlet.ServletRequest;
> -import javax.servlet.ServletRequestWrapper;
> import javax.servlet.ServletResponse;
> import javax.servlet.http.HttpServletRequest;
> -import javax.servlet.http.HttpServletRequestWrapper;
> import javax.servlet.http.HttpServletResponse;
>
> import org.apache.catalina.Globals;
> @@ -224,6 +222,11 @@
> support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
> filter, request, response);
>
> + if (request.isAsyncSupported() && "false".equalsIgnoreCase(
> + filterConfig.getFilterDef().getAsyncSupported())) {
> + request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
> + Boolean.FALSE);
> + }
> if( Globals.IS_SECURITY_ENABLED ) {
> final ServletRequest req = request;
> final ServletResponse res = response;
> @@ -275,25 +278,17 @@
>
> support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
> servlet, request, response);
> - ServletRequest wRequest;
> if (request.isAsyncSupported()
> && !support.getWrapper().isAsyncSupported()) {
> - if (request instanceof HttpServletRequest) {
> - wRequest = new HttpServletRequestNoAsyc(
> - (HttpServletRequest) request);
> - } else {
> - // Must be a ServletRequest
> - wRequest = new ServletRequestNoAsyc(request);
> - }
> - } else {
> - wRequest = request;
> + request.setAttribute(Globals.ASYNC_SUPPORTED_ATTR,
> + Boolean.FALSE);
> }
> // Use potentially wrapped request from this point
> - if ((wRequest instanceof HttpServletRequest) &&
> + if ((request instanceof HttpServletRequest) &&
> (response instanceof HttpServletResponse)) {
>
> if( Globals.IS_SECURITY_ENABLED ) {
> - final ServletRequest req = wRequest;
> + final ServletRequest req = request;
> final ServletResponse res = response;
> Principal principal =
> ((HttpServletRequest) req).getUserPrincipal();
> @@ -305,12 +300,11 @@
> principal);
> args = null;
> } else {
> - servlet.service(wRequest, response);
> + servlet.service(request, response);
> }
> } else {
> - servlet.service(wRequest, response);
> + servlet.service(request, response);
> }
> - // Stop using wrapped request now Servlet has been processed
> support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
> servlet, request, response);
> } catch (IOException e) {
> @@ -586,42 +580,4 @@
> this.support = support;
>
> }
> -
> - public boolean isAsyncSupported() {
> - boolean supported = true;
> - for (ApplicationFilterConfig config : filters) {
> - if (config!=null && config.getFilterDef()!=null) {
> - supported = supported & config.getFilterDef().isAsyncSupported();
> - }
> - }
> - return supported;
> - }
> -
> -
> - // --------------------------------- Wrapper classes for isAsyncSupported()
> -
> - private class HttpServletRequestNoAsyc extends HttpServletRequestWrapper {
> -
> - public HttpServletRequestNoAsyc(HttpServletRequest request) {
> - super(request);
> - }
> -
> - @Override
> - public boolean isAsyncSupported() {
> - return false;
> - }
> - }
> -
> - private class ServletRequestNoAsyc extends ServletRequestWrapper {
> -
> - public ServletRequestNoAsyc(ServletRequest request) {
> - super(request);
> - }
> -
> - @Override
> - public boolean isAsyncSupported() {
> - return false;
> - }
> - }
> -
> }
>
> Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapperValve.java Mon Dec 7 16:43:25 2009
> @@ -203,10 +203,6 @@
>
> // Reset comet flag value after creating the filter chain
> request.setComet(false);
> - //check filters to see if we support async or not.
> - if (filterChain != null && request.isAsyncSupported()) {
> - request.setAsyncSupported(filterChain.isAsyncSupported());
> - }
>
> // Call the filter chain for this request
> // NOTE: This also calls the servlet's service() method
>
> Modified: tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/deploy/FilterDef.java Mon Dec 7 16:43:25 2009
> @@ -136,13 +136,13 @@
> this.smallIcon = smallIcon;
> }
>
> - private boolean asyncSupported = false;
> + private String asyncSupported = null;
>
> - public boolean isAsyncSupported() {
> + public String getAsyncSupported() {
> return asyncSupported;
> }
> -
> - public void setAsyncSupported(boolean asyncSupported) {
> +
> + public void setAsyncSupported(String asyncSupported) {
> this.asyncSupported = asyncSupported;
> }
>
>
> Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Mon Dec 7 16:43:25 2009
> @@ -1673,10 +1673,11 @@
> String type = ae.getAnnotationType();
> if ("Ljavax/servlet/annotation/WebServlet;".equals(type)) {
> processAnnotationWebServlet(className, ae, fragment);
> + }else if ("Ljavax/servlet/annotation/WebFilter;".equals(type)) {
> + processAnnotationWebFilter(className, ae, fragment);
> }else if ("Ljavax/servlet/annotation/WebListener;".equals(type)) {
> fragment.addListener(className);
> } else {
> - // TODO SERVLET 3 - Other annotations
> // Unknown annotation - ignore
> }
> }
> @@ -1688,22 +1689,22 @@
> // Skip this annotation. Entry in web.xml takes priority
> return;
> }
> - boolean mappingSet = false;
> + boolean urlPatternsSet = false;
> ServletDef servletDef = new ServletDef();
> servletDef.setServletName(className);
> servletDef.setServletClass(className);
> - String[] mappings = null;
> + String[] urlPatterns = null;
>
> ElementValuePair[] evps = ae.getElementValuePairs();
> for (ElementValuePair evp : evps) {
> String name = evp.getNameString();
> if ("value".equals(name) || "urlPatterns".equals(name)) {
> - if (mappingSet) {
> + if (urlPatternsSet) {
> throw new IllegalArgumentException(sm.getString(
> "contextConfig.urlPatternValue", className));
> }
> - mappingSet = true;
> - mappings = processAnnotationsUrlPatterns(evp.getValue());
> + urlPatternsSet = true;
> + urlPatterns = processAnnotationsStringArray(evp.getValue());
> } else if ("name".equals(name)) {
> servletDef.setServletName(evp.getValue().stringifyValue());
> } else if ("description".equals(name)) {
> @@ -1729,16 +1730,82 @@
> // Ignore
> }
> }
> - if (mappings != null) {
> + if (urlPatterns != null) {
> fragment.addServlet(servletDef);
> - for (String mapping : mappings) {
> - fragment.addServletMapping(mapping,
> + for (String urlPattern : urlPatterns) {
> + fragment.addServletMapping(urlPattern,
> servletDef.getServletName());
> }
> }
> }
>
> - protected String[] processAnnotationsUrlPatterns(ElementValue ev) {
> + protected void processAnnotationWebFilter(String className,
> + AnnotationEntry ae, WebXml fragment) {
> + if (fragment.getFilters().containsKey(className)) {
> + // Skip this annotation. Entry in web.xml takes priority
> + return;
> + }
> + boolean urlPatternsSet = false;
> + FilterDef filterDef = new FilterDef();
> + FilterMap filterMap = new FilterMap();
> + filterDef.setFilterName(className);
> + filterDef.setFilterClass(className);
> + String[] urlPatterns = null;
> +
> + ElementValuePair[] evps = ae.getElementValuePairs();
> + for (ElementValuePair evp : evps) {
> + String name = evp.getNameString();
> + if ("value".equals(name) || "urlPatterns".equals(name)) {
> + if (urlPatternsSet) {
> + throw new IllegalArgumentException(sm.getString(
> + "contextConfig.urlPatternValue", className));
> + }
> + urlPatternsSet = true;
> + urlPatterns = processAnnotationsStringArray(evp.getValue());
> + for (String urlPattern : urlPatterns) {
> + filterMap.addURLPattern(urlPattern);
> + }
> + } else if ("filterName".equals(name)) {
> + filterDef.setFilterName(evp.getValue().stringifyValue());
> + } else if ("servletNames".equals(name)) {
> + String[] servletNames =
> + processAnnotationsStringArray(evp.getValue());
> + for (String servletName : servletNames) {
> + filterMap.addServletName(servletName);
> + }
> + } else if ("dispatcherTypes".equals(name)) {
> + String[] dispatcherTypes =
> + processAnnotationsStringArray(evp.getValue());
> + for (String dispatcherType : dispatcherTypes) {
> + filterMap.setDispatcher(dispatcherType);
> + }
> + } else if ("description".equals(name)) {
> + filterDef.setDescription(evp.getValue().stringifyValue());
> + } else if ("displayName".equals(name)) {
> + filterDef.setDisplayName(evp.getValue().stringifyValue());
> + } else if ("largeIcon".equals(name)) {
> + filterDef.setLargeIcon(evp.getValue().stringifyValue());
> + } else if ("smallIcon".equals(name)) {
> + filterDef.setSmallIcon(evp.getValue().stringifyValue());
> + } else if ("asyncSupported".equals(name)) {
> + filterDef.setAsyncSupported(evp.getValue().stringifyValue());
> + } else if ("initParams".equals(name)) {
> + Map<String,String> initParams =
> + processAnnotationWebInitParams(evp.getValue());
> + for (String paramName : initParams.keySet()) {
> + filterDef.addInitParameter(paramName,
> + initParams.get(paramName));
> + }
> + } else {
> + // Ignore
> + }
> + }
> + fragment.addFilter(filterDef);
> + filterMap.setFilterName(filterDef.getFilterName());
> + fragment.addFilterMapping(filterMap);
> + }
> +
> + protected String[] processAnnotationsStringArray(ElementValue ev) {
> ArrayList<String> values = new ArrayList<String>();
> if (ev instanceof ArrayElementValue) {
> ElementValue[] arrayValues =
>
> Modified: tomcat/trunk/java/org/apache/catalina/startup/WebXml.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/WebXml.java?rev=887992&r1=887991&r2=887992&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/startup/WebXml.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/startup/WebXml.java Mon Dec 7 16:43:25 2009
> @@ -962,11 +962,15 @@
> }
>
> private boolean mergeFilter(FilterDef src, FilterDef dest, boolean failOnConflict) {
> - if (src.isAsyncSupported() != dest.isAsyncSupported()) {
> - // Always fail
> - return false;
> + if (dest.getAsyncSupported() == null) {
> + dest.setAsyncSupported(src.getAsyncSupported());
> + } else if (src.getAsyncSupported() != null) {
> + if (failOnConflict &&
> + !src.getAsyncSupported().equals(dest.getAsyncSupported())) {
> + return false;
> + }
> }
> -
> +
> if (dest.getFilterClass() == null) {
> dest.setFilterClass(src.getFilterClass());
> } else if (src.getFilterClass() != null) {
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r887992 - in /tomcat/trunk/java/org/apache/catalina:
core/ApplicationDispatcher.java core/ApplicationFilterChain.java core/StandardWrapperValve.java
deploy/FilterDef.java startup/ContextConfig.java startup/WebXml.java
Posted by Mark Thomas <ma...@apache.org>.
sebb wrote:
> On 07/12/2009, markt@apache.org <ma...@apache.org> wrote:
>> - // FIXME: Exception handling needs to be simpiler to what is in the StandardWrapperValue
>> + // FIXME: Exception handling needs to be simpler to what is in the StandardWrapperValue
>
> Should that be "similar to" ?
>
> If it really is "simpler", then it would be "simpler than".
Probably. I'll go look at the code and figure out which.
Mark
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org