Author: costin Date: Tue Jul 14 05:38:02 2009 New Revision: 793797 URL: http://svn.apache.org/viewvc?rev=793797&view=rev Log: Some initial implementations for the 3.0 dynamic registration methods. Moving back web.xml config to separate package - with annotations requiring scanning of all files it needs to be done at deploy time - so it'll be better to just load a .ser file at startup.
Added: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java - copied, changed from r793382, tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextConfig.java Removed: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextConfig.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebAnnotation.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebResourceCollectionData.java Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/FilterConfigImpl.java Tue Jul 14 05:38:02 2009 @@ -19,13 +19,19 @@ import java.util.ArrayList; +import java.util.EnumSet; import java.util.Enumeration; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterConfig; +import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.FilterRegistration.Dynamic; import org.apache.tomcat.servlets.util.Enumerator; @@ -41,29 +47,37 @@ * * @see ServletConfigImpl */ -public final class FilterConfigImpl implements FilterConfig { +public final class FilterConfigImpl implements FilterConfig, FilterRegistration { + DynamicFilterRegistration dynamic = new DynamicFilterRegistration(); + public FilterConfigImpl(ServletContextImpl context) { - this.context = context; + this.ctx = context; } - private ServletContextImpl context = null; + boolean asyncSupported; + + private ServletContextImpl ctx = null; /** * The application Filter we are configured for. */ private transient Filter filter = null; - + + String descryption; + private String filterName; - private String filterClass; + private String filterClassName; + + Map<String, String> initParams; - private Map<String, String> initParams; + private Class<? extends Filter> filterClass; public void setData(String filterName, String filterClass, Map<String, String> params) { this.filterName = filterName; - this.filterClass = filterClass; + this.filterClassName = filterClass; this.initParams = params; } @@ -75,6 +89,11 @@ return filterName; } + public void setFilterClass(Class<? extends Filter> filterClass2) { + this.filterClass = filterClass2; + } + + public String getInitParameter(String name) { if (initParams == null) return null; return initParams.get(name); @@ -96,20 +115,20 @@ * Return the ServletContext of our associated web application. */ public ServletContext getServletContext() { - return context; + return ctx; } /** * Return the application Filter we are configured for. */ - public Filter getFilter() throws ClassCastException, ClassNotFoundException, + public Filter createFilter() throws ClassCastException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException { // Return the existing filter instance, if any if (filter != null) return filter; - ClassLoader classLoader = context.getClassLoader(); + ClassLoader classLoader = ctx.getClassLoader(); ClassLoader oldCtxClassLoader = Thread.currentThread().getContextClassLoader(); @@ -117,14 +136,23 @@ Thread.currentThread().setContextClassLoader(classLoader); } try { - Class clazz = classLoader.loadClass(filterClass); - this.filter = (Filter) clazz.newInstance(); + if (filterClass == null) { + filterClass = (Class<? extends Filter>) classLoader.loadClass(filterClassName); + } + this.filter = (Filter) filterClass.newInstance(); } finally { if (classLoader != oldCtxClassLoader) { Thread.currentThread().setContextClassLoader(oldCtxClassLoader); } } + // TODO: resource injection + + return filter; + } + + public Filter getFilter() throws ClassCastException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException { + Filter filter = createFilter(); filter.init(this); return (this.filter); } @@ -140,4 +168,105 @@ } this.filter = null; } + + @Override + public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes, + boolean isMatchAfter, + String... servletNames) { + if (ctx.startDone) { + // Use the context method instead of the servlet API to + // add mappings after context init. + throw new IllegalStateException(); + } + ArrayList<String> dispatchers = new ArrayList<String>(); + for (DispatcherType dt: dispatcherTypes) { + dispatchers.add(dt.name()); + } + for (String servletName: servletNames) { + ctx.getFilterMapper().addMapping(getFilterName(), + null, servletName, (String[]) dispatchers.toArray(), isMatchAfter); + } + } + + @Override + public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes, + boolean isMatchAfter, + String... urlPatterns) { + if (ctx.startDone) { + // Use the context method instead of the servlet API to + // add mappings after context init. + throw new IllegalStateException(); + } + ArrayList<String> dispatchers = new ArrayList<String>(); + for (DispatcherType dt: dispatcherTypes) { + dispatchers.add(dt.name()); + } + for (String url: urlPatterns) { + ctx.getFilterMapper().addMapping(getFilterName(), + url, null, (String[]) dispatchers.toArray(), isMatchAfter); + } + } + + @Override + public boolean setInitParameter(String name, String value) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameter(ctx, initParams, + name, value); + } + + @Override + public Set<String> setInitParameters(Map<String, String> initParameters) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameters(ctx, initParams, + initParameters); + } + + public Dynamic getDynamic() { + return dynamic; + } + + public class DynamicFilterRegistration implements Dynamic { + + @Override + public void addMappingForServletNames(EnumSet<DispatcherType> dispatcherTypes, + boolean isMatchAfter, + String... servletNames) { + FilterConfigImpl.this.addMappingForServletNames(dispatcherTypes, isMatchAfter, servletNames); + } + + @Override + public void addMappingForUrlPatterns(EnumSet<DispatcherType> dispatcherTypes, + boolean isMatchAfter, + String... urlPatterns) { + FilterConfigImpl.this.addMappingForUrlPatterns(dispatcherTypes, isMatchAfter, urlPatterns); + } + + @Override + public boolean setInitParameter(String name, String value) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameter(ctx, initParams, + name, value); + } + + @Override + public Set<String> setInitParameters(Map<String, String> initParameters) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameters(ctx, initParams, + initParameters); + } + + @Override + public void setAsyncSupported(boolean isAsyncSupported) + throws IllegalStateException { + asyncSupported = isAsyncSupported; + } + + @Override + public void setDescription(String description) + throws IllegalStateException { + FilterConfigImpl.this.descryption = description; + } + } + + } Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletConfigImpl.java Tue Jul 14 05:38:02 2009 @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; @@ -31,6 +32,7 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; import javax.servlet.SingleThreadModel; import javax.servlet.UnavailableException; @@ -48,7 +50,12 @@ * @author Craig R. McClanahan * @author Remy Maucherat */ -public class ServletConfigImpl implements ServletConfig { +...@suppresswarnings("deprecation") +public class ServletConfigImpl implements ServletConfig, ServletRegistration { + + ServletDynamicRegistration dynamic = new ServletDynamicRegistration(); + + protected boolean asyncSupported; private static Logger log= Logger.getLogger(ServletConfigImpl.class.getName()); @@ -60,10 +67,10 @@ // public static final String SINGLE_THREADED_PROXY = // "org.apache.tomcat.servlets.jsp.SingleThreadedProxyServlet"; - + protected String description; protected Map<String, String> initParams = new HashMap<String, String>(); protected String servletName; - protected String servletClass; + protected String servletClassName; protected String jspFile; protected int loadOnStartup = -1; protected String runAs; @@ -89,7 +96,7 @@ */ private transient boolean unloading = false; - private Class classClass = null; + private Class servletClass = null; // Support for SingleThreaded /** @@ -113,7 +120,7 @@ public ServletConfigImpl(ServletContextImpl ctx, String name, String classname) { this.servletName = name; - this.servletClass = classname; + this.servletClassName = classname; this.ctx = ctx; ctx.facade.notifyAdd(this); } @@ -183,7 +190,7 @@ * Return the fully qualified servlet class name for this servlet. */ public String getServletClass() { - return servletClass; + return servletClassName; } /** @@ -368,9 +375,12 @@ } } - private Servlet newInstance() throws ServletException { - String actualClass = servletClass; + public Servlet newInstance() throws ServletException { + String actualClass = servletClassName; + if (instance != null) { + return instance; + } if (actualClass == null) { // No explicit name. Try to use the framework if (jspFile != null) { @@ -378,8 +388,8 @@ // Named JSPs can be handled by a servlet or by the mapper. Servlet res = (Servlet) ctx.getObjectManager().get("filetemplate-servlet"); if (res != null) { - classClass = res.getClass(); - actualClass = classClass.getName(); + servletClass = res.getClass(); + actualClass = servletClass.getName(); initParams.put("jsp-file", jspFile); return res; } else { @@ -396,8 +406,8 @@ Servlet res = (Servlet) ctx.getObjectManager().get( servletName + "-servlet"); if (res != null) { - classClass = res.getClass(); - actualClass = classClass.getName(); + servletClass = res.getClass(); + actualClass = servletClass.getName(); return res; } } @@ -407,7 +417,7 @@ } - if (classClass == null) { + if (servletClass == null) { // set classClass loadClass(actualClass); } @@ -424,14 +434,14 @@ // the jsp proxy is replaced by the web.xml processor - if (classClass == null) { + if (servletClass == null) { unavailable(null); throw new UnavailableException("ClassNotFound: " + actualClass); } // Instantiate and initialize an instance of the servlet class itself try { - return (Servlet) classClass.newInstance(); + return (Servlet) servletClass.newInstance(); } catch (ClassCastException e) { unavailable(null); throw new UnavailableException("ClassCast: (Servlet)" + @@ -509,9 +519,9 @@ // Load the specified servlet class from the appropriate class loader try { - classClass = classLoader.loadClass(actualClass); + servletClass = classLoader.loadClass(actualClass); } catch (ClassNotFoundException e) { - classClass = null; + servletClass = null; } } @@ -526,7 +536,7 @@ } sb.append("Servlet["); sb.append(getServletName()).append(" "); - sb.append(servletClass); + sb.append(servletClassName); if (jspFile != null) { sb.append(" jsp=").append(jspFile); } @@ -652,9 +662,7 @@ * @param name Name of the initialization parameter to retrieve */ public String getInitParameter(String name) { - - return (String)initParams.get(name); - + return initParams.get(name); } @@ -663,11 +671,9 @@ * servlet. If none are defined, an empty Enumeration is returned. */ public Enumeration getInitParameterNames() { - synchronized (initParams) { return (new Enumerator(initParams.keySet())); } - } @@ -805,5 +811,63 @@ this.loadOnStartup = loadOnStartup; } + @Override + public Set<String> addMapping(String... urlPatterns) { + if (ctx.startDone) { + // Use the context method instead of the servlet API to + // add mappings after context init. + throw new IllegalStateException(); + } + Set<String> failed = new HashSet<String>(); + for (String url: urlPatterns) { + if (url == null) { + throw new IllegalArgumentException(); + } + if (ctx.contextConfig.servletMapping.get(url) != null) { + failed.add(url); + } else { + ctx.contextConfig.servletMapping.put(url, getServletName()); + ctx.addMapping(url, this); + } + } + return failed; + } + @Override + public boolean setInitParameter(String name, String value) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameter(ctx, initParams, + name, value); + } + + @Override + public Set<String> setInitParameters(Map<String, String> initParameters) + throws IllegalArgumentException, IllegalStateException { + return ServletContextImpl.setInitParameters(ctx, initParams, + initParameters); + } + + public Dynamic getDynamic() { + return dynamic; + } + + class ServletDynamicRegistration implements Dynamic { + + @Override + public void setAsyncSupported(boolean isAsyncSupported) + throws IllegalStateException { + asyncSupported = isAsyncSupported; + } + + @Override + public void setDescription(String description) + throws IllegalStateException { + ServletConfigImpl.this.description = description; + } + + } + + public void setServletClass(Class<? extends Servlet> servletClass2) { + servletClass = servletClass2; + } } Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextImpl.java Tue Jul 14 05:38:02 2009 @@ -37,9 +37,11 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; +import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; @@ -58,9 +60,10 @@ import org.apache.tomcat.addons.UserSessionManager; import org.apache.tomcat.integration.ObjectManager; -import org.apache.tomcat.lite.ServletContextConfig.FilterData; -import org.apache.tomcat.lite.ServletContextConfig.FilterMappingData; -import org.apache.tomcat.lite.ServletContextConfig.ServletData; +import org.apache.tomcat.lite.webxml.ServletContextConfig; +import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterMappingData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.ServletData; import org.apache.tomcat.servlets.util.Enumerator; import org.apache.tomcat.servlets.util.RequestUtil; import org.apache.tomcat.servlets.util.UrlUtils; @@ -144,6 +147,11 @@ private String hostname; + + boolean initDone = false; + + boolean startDone = false; + // ------------------------------------------------- ServletContext Methods public ServletContextImpl() { } @@ -836,13 +844,6 @@ } } - public void addFilter(String filterName, String filterClass, - Map params) { - FilterConfigImpl fc = new FilterConfigImpl(this); - fc.setData(filterName, filterClass, params); - filters.put(filterName, fc); - } - public void initFilters() throws ServletException { Iterator fI = getFilters().values().iterator(); while (fI.hasNext()) { @@ -856,6 +857,7 @@ } } + public void initServlets() throws ServletException { Iterator fI = getServletConfigs().values().iterator(); Map/*<Integer, List<ServletConfigImpl>>*/ onStartup = @@ -915,6 +917,8 @@ getMapper().addWrapper(getMapper().contextMapElement, path, wrapper); } + + public void setWelcomeFiles(String[] name) { getMapper().contextMapElement.welcomeResources = name; } @@ -1010,12 +1014,13 @@ sc.setConfig(params); addServletConfig(sc); } - + + @Override public javax.servlet.Registration.Dynamic addServlet(String servletName, Servlet servlet) { ServletConfigImpl sc = new ServletConfigImpl(this, servletName, null); sc.setServlet(servlet); addServletConfig(sc); - return null; + return sc.getDynamic(); } public void addServletSec(String serlvetName, String runAs, Map roles) { @@ -1027,7 +1032,7 @@ public void addFilterMapping(String path, String filterName, String[] dispatcher) { getFilterMapper().addMapping(filterName, - path, null, dispatcher); + path, null, dispatcher, true); } @@ -1036,11 +1041,9 @@ String[] dispatcher) { getFilterMapper().addMapping(filterName, null, servlet, - dispatcher); + dispatcher, true); } - boolean initDone = false; - /** * Called from TomcatLite.init(), required before start. * @@ -1167,6 +1170,9 @@ public void start() throws ServletException { + if (startDone) { + return; + } String base = getBasePath(); ArrayList urls = getClasspath(new File(base + "/WEB-INF/lib"), @@ -1205,6 +1211,7 @@ event = new ServletContextEvent(this); } try { + // May add servlets/filters listener.contextInitialized(event); } catch (Throwable t) { log.log(Level.WARNING, "Context.init() contextInitialized() error:", t); @@ -1214,6 +1221,8 @@ initFilters(); initServlets(); + + startDone = true; } public UserSessionManager getManager() { @@ -1392,57 +1401,151 @@ public void setSessionTrackingModes(EnumSet<SessionTrackingMode> sessionTrackingModes) { } + public void addFilter(String filterName, String filterClass, + Map params) { + FilterConfigImpl fc = new FilterConfigImpl(this); + fc.setData(filterName, filterClass, params); + filters.put(filterName, fc); + } + @Override public Dynamic addFilter(String filterName, String className) { - return null; + FilterConfigImpl fc = new FilterConfigImpl(this); + fc.setData(filterName, className, new HashMap()); + filters.put(filterName, fc); + return fc.getDynamic(); } @Override public Dynamic addFilter(String filterName, Filter filter) { - return null; + FilterConfigImpl fc = new FilterConfigImpl(this); + fc.setData(filterName, null, new HashMap()); + fc.setFilter(filter); + filters.put(filterName, fc); + return fc.getDynamic(); } @Override public Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) { - return null; + FilterConfigImpl fc = new FilterConfigImpl(this); + fc.setData(filterName, null, new HashMap()); + fc.setFilterClass(filterClass); + filters.put(filterName, fc); + return fc.getDynamic(); } @Override public javax.servlet.Registration.Dynamic addServlet(String servletName, String className) { - return null; + ServletConfigImpl sc = new ServletConfigImpl(this, servletName, className); + addServletConfig(sc); + return sc.getDynamic(); } @Override - public javax.servlet.Registration.Dynamic addServlet( - String servletName, + public javax.servlet.Registration.Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) { - return null; + ServletConfigImpl sc = new ServletConfigImpl(this, servletName, servletClass.getName()); + sc.setServletClass(servletClass); + addServletConfig(sc); + return sc.getDynamic(); } + // That's tricky - this filter will have no name. We need to generate one + // because our code relies on names. + AtomicInteger autoName = new AtomicInteger(); + @Override public <T extends Filter> T createFilter(Class<T> c) throws ServletException { - return null; + FilterConfigImpl fc = new FilterConfigImpl(this); + String filterName = "_tomcat_auto_filter_" + autoName.incrementAndGet(); + fc.setData(filterName, null, new HashMap()); + fc.setFilterClass(c); + filters.put(filterName, fc); + + try { + return (T) fc.createFilter(); + } catch (ClassCastException e) { + throw new ServletException(e); + } catch (ClassNotFoundException e) { + throw new ServletException(e); + } catch (IllegalAccessException e) { + throw new ServletException(e); + } catch (InstantiationException e) { + throw new ServletException(e); + } } @Override public <T extends Servlet> T createServlet(Class<T> c) throws ServletException { - return null; + String filterName = "_tomcat_auto_servlet_" + autoName.incrementAndGet(); + ServletConfigImpl fc = new ServletConfigImpl(this, filterName, null); + fc.setServletClass(c); + servlets.put(filterName, fc); + + try { + return (T) fc.newInstance(); + } catch (ClassCastException e) { + throw new ServletException(e); + } } @Override public FilterRegistration findFilterRegistration(String filterName) { - return null; + return filters.get(filterName); } @Override public ServletRegistration findServletRegistration(String servletName) { - return null; + return servlets.get(servletName); } - + @Override public boolean setInitParameter(String name, String value) { - return false; + HashMap<String, String> params = contextConfig.contextParam; + return setInitParameter(this, params, name, value); + } + + static Set<String> setInitParameters(ServletContextImpl ctx, + Map<String, String> params, + Map<String, String> initParameters) + throws IllegalArgumentException, IllegalStateException { + if (ctx.startDone) { + throw new IllegalStateException(); + } + Set<String> result = new HashSet<String>(); + for (String name: initParameters.keySet()) { + String value = initParameters.get(name); + if (name == null || value == null) { + throw new IllegalArgumentException(); + } + if (!setInitParameter(ctx, params, name, value)) { + result.add(name); + } + } + return result; + } + + /** + * true if the context initialization parameter with the given name and value was set successfully on this ServletContext, and false if it was not set because this ServletContext already contains a context initialization parameter with a matching name + * Throws: + * java.lang.IllegalStateException - if this ServletContext has already been initialized + */ + static boolean setInitParameter(ServletContextImpl ctx, Map<String, String> params, + String name, String value) { + if (name == null || value == null) { + throw new IllegalArgumentException(); + } + if (ctx.startDone) { + throw new IllegalStateException(); + } + String oldValue = params.get(name); + if (oldValue != null) { + return false; + } else { + params.put(name, value); + return true; + } } } Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletResponseImpl.java Tue Jul 14 05:38:02 2009 @@ -1,5 +1,5 @@ /* - * ontentLicensed to the Apache Software Foundation (ASF) under one or more + * 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 Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/WebappFilterMapper.java Tue Jul 14 05:38:02 2009 @@ -94,12 +94,16 @@ public void addMapping(String filterName, String url, String servletName, - String type[]) { + String type[], boolean isMatchAfter) { FilterMap map = new FilterMap(); map.setURLPattern(url); map.setFilterName(filterName); map.setServletName(servletName); - filterMaps.add(map); + if (isMatchAfter) { + filterMaps.add(map); + } else { + filterMaps.add(0, map); + } } /** Copied: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java (from r793382, tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextConfig.java) URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java?p2=tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java&p1=tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextConfig.java&r1=793382&r2=793797&rev=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/ServletContextConfig.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/ServletContextConfig.java Tue Jul 14 05:38:02 2009 @@ -1,14 +1,15 @@ /** * */ -package org.apache.tomcat.lite; +package org.apache.tomcat.lite.webxml; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; /** - * All the data in web.xml should be represented here. + * All the data in web.xml, annotations, etc should be represented + * here. This class is serializable. * * Public fields to make it easy to access it. * Naming should match the web.xml element name. @@ -84,11 +85,16 @@ public String filterName; } + // Normalized public static class FilterMappingData implements Serializable { private static final long serialVersionUID = -4533568066713041994L; public String filterName; + + // Only one of the 2 public String urlPattern; public String servletName; + + // REQUEST, FORWARD, INCLUDE, ERROR, ASYNC public ArrayList<String> dispatcher = new ArrayList<String>(); } @@ -119,12 +125,19 @@ } + public static class WebResourceCollectionData implements Serializable { + public String webResourceName; + public ArrayList urlPattern = new ArrayList(); + public ArrayList httpMethod = new ArrayList(); + } + public static class SecurityConstraintData implements Serializable { private static final long serialVersionUID = -4780214921810871769L; public ArrayList<String> roleName = new ArrayList<String>(); // auth-constraint/role - public ArrayList<String> webResourceCollection = new ArrayList<String>(); + public ArrayList<WebResourceCollectionData> webResourceCollection = + new ArrayList<WebResourceCollectionData>(); public String transportGuarantee; } Modified: tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java?rev=793797&r1=793796&r2=793797&view=diff ============================================================================== --- tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java (original) +++ tomcat/trunk/modules/tomcat-lite/java/org/apache/tomcat/lite/webxml/WebXml.java Tue Jul 14 05:38:02 2009 @@ -10,12 +10,12 @@ import javax.servlet.ServletException; -import org.apache.tomcat.lite.ServletContextConfig; -import org.apache.tomcat.lite.ServletContextConfig.EnvEntryData; -import org.apache.tomcat.lite.ServletContextConfig.FilterData; -import org.apache.tomcat.lite.ServletContextConfig.FilterMappingData; -import org.apache.tomcat.lite.ServletContextConfig.SecurityConstraintData; -import org.apache.tomcat.lite.ServletContextConfig.ServletData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.EnvEntryData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.FilterMappingData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.SecurityConstraintData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.ServletData; +import org.apache.tomcat.lite.webxml.ServletContextConfig.WebResourceCollectionData; import org.apache.tomcat.util.DomUtil; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -252,7 +252,9 @@ scn = DomUtil.getNext(scn); } cn = DomUtil.getNext(cn); + sd.webResourceCollection.add(wrd); } + d.securityConstraint.add(sd); } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org