diff options
author | Greg Wilkins | 2015-12-04 05:26:58 +0000 |
---|---|---|
committer | Greg Wilkins | 2015-12-04 05:26:58 +0000 |
commit | 14bde1f69691f979fdb3c31f6b7841208fed0157 (patch) | |
tree | 66181e00e0a4f5c3f64ab189b30a8c15a1b1f69a | |
parent | 46ce2aef3abe68bbf6816874904c76506ccc848f (diff) | |
download | org.eclipse.jetty.project-14bde1f69691f979fdb3c31f6b7841208fed0157.tar.gz org.eclipse.jetty.project-14bde1f69691f979fdb3c31f6b7841208fed0157.tar.xz org.eclipse.jetty.project-14bde1f69691f979fdb3c31f6b7841208fed0157.zip |
work in progress on Configurations as services
15 files changed, 231 insertions, 171 deletions
diff --git a/jetty-annotations/src/main/config/etc/jetty-annotations.xml b/jetty-annotations/src/main/config/etc/jetty-annotations.xml index 82bb14f996..d81eb9645a 100644 --- a/jetty-annotations/src/main/config/etc/jetty-annotations.xml +++ b/jetty-annotations/src/main/config/etc/jetty-annotations.xml @@ -5,9 +5,9 @@ <!-- =========================================================== --> <!-- Add annotation Configuring classes to all webapps for this Server --> <!-- =========================================================== --> - <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault"> + <Call class="org.eclipse.jetty.webapp.Configurations" name="setServerDefault"> <Arg><Ref refid="Server" /></Arg> - <Call name="addIfAbsent"> + <Call name="add"> <Arg> <Array type="String"> <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item> diff --git a/jetty-ant/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration b/jetty-ant/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration index ab9a4416c3..f6b19b712e 100644 --- a/jetty-ant/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration +++ b/jetty-ant/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration @@ -1,3 +1,2 @@ org.eclipse.jetty.ant.AntWebInfConfiguration org.eclipse.jetty.ant.AntWebXmlConfiguration -org.eclipse.jetty.ant.types.FileMatchingConfiguration diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java index 6d79d6de35..d13ba20376 100644 --- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java +++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java @@ -174,7 +174,7 @@ public class ScanningAppProviderRuntimeUpdatesTest waitForDirectoryScan(); jetty.assertWebAppContextsExists("/foo"); - + // Test that webapp response contains "-1" jetty.assertResponseContains("/foo/info","FooServlet-1"); diff --git a/jetty-deploy/src/test/resources/jetty-logging.properties b/jetty-deploy/src/test/resources/jetty-logging.properties index 9d7bbe4489..66cc7b7769 100644 --- a/jetty-deploy/src/test/resources/jetty-logging.properties +++ b/jetty-deploy/src/test/resources/jetty-logging.properties @@ -1,3 +1,4 @@ org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog org.eclipse.jetty.deploy.LEVEL=WARN org.eclipse.jetty.util.Scanner=WARN +org.eclipse.jetty.webapp.LEVEL=DEBUG diff --git a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml index a3850c9259..8a874a440e 100644 --- a/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml +++ b/jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml @@ -63,25 +63,15 @@ <!-- =========================================================== --> - <!-- Set up the list of default configuration classes --> + <!-- Update the list of default configuration classes --> <!-- =========================================================== --> - <Call name="setAttribute"> - <Arg>org.eclipse.jetty.webapp.configuration</Arg> - <Arg> - <New class="org.eclipse.jetty.webapp.Configuration$ClassList"> - <Arg> - <Array type="String"> - <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item> - <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item> - <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item> - <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item> - <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item> - </Array> - </Arg> - </New> - </Arg> + <Call name="getConfigurations"> + <Call name="add"> + <Arg> + <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item> + </Arg> + </Call> </Call> - <Call class="java.lang.System" name="setProperty"> <Arg>java.naming.factory.initial</Arg> diff --git a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml index a3850c9259..2b73ec08a7 100644 --- a/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml +++ b/jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml @@ -52,7 +52,6 @@ <Set name="headerCacheSize">512</Set> </New> - <!-- =========================================================== --> <!-- extra options --> <!-- =========================================================== --> @@ -61,27 +60,16 @@ <Set name="dumpAfterStart">false</Set> <Set name="dumpBeforeStop">false</Set> - <!-- =========================================================== --> - <!-- Set up the list of default configuration classes --> + <!-- Update the list of default configuration classes --> <!-- =========================================================== --> - <Call name="setAttribute"> - <Arg>org.eclipse.jetty.webapp.configuration</Arg> - <Arg> - <New class="org.eclipse.jetty.webapp.Configuration$ClassList"> - <Arg> - <Array type="String"> - <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item> - <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item> - <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item> - <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item> - <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item> - </Array> - </Arg> - </New> - </Arg> + <Call name="getConfigurations"> + <Call name="add"> + <Arg> + <Item>org.eclipse.jetty.osgi.boot.OSGiWebInfConfiguration</Item> + </Arg> + </Call> </Call> - <Call class="java.lang.System" name="setProperty"> <Arg>java.naming.factory.initial</Arg> diff --git a/jetty-plus/src/main/config/etc/jetty-plus.xml b/jetty-plus/src/main/config/etc/jetty-plus.xml index bfdac6a1ee..84c01e54d9 100644 --- a/jetty-plus/src/main/config/etc/jetty-plus.xml +++ b/jetty-plus/src/main/config/etc/jetty-plus.xml @@ -9,9 +9,9 @@ <!-- =========================================================== --> <!-- Add plus Configuring classes to all webapps for this Server --> <!-- =========================================================== --> - <Call class="org.eclipse.jetty.webapp.Configuration$ClassList" name="setServerDefault"> + <Call class="org.eclipse.jetty.webapp.Configurations" name="setServerDefault"> <Arg><Ref refid="Server" /></Arg> - <Call name="addIfAbsent"> + <Call name="add"> <Arg> <Array type="String"> <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item> diff --git a/jetty-runner/pom.xml b/jetty-runner/pom.xml index c7eb427888..e7f890f984 100644 --- a/jetty-runner/pom.xml +++ b/jetty-runner/pom.xml @@ -37,26 +37,26 @@ </executions> </plugin> <plugin> - <groupId>org.apache.felix</groupId> - <artifactId>maven-bundle-plugin</artifactId> - <extensions>true</extensions> - <executions> - <execution> - <id>bundle-manifest</id> - <phase>process-classes</phase> - <goals> - <goal>manifest</goal> - </goals> - </execution> - </executions> - <configuration> - <instructions> - <Main-Class>org.eclipse.jetty.runner.Runner</Main-Class> - <Import-Package>!*</Import-Package> - <Export-Package></Export-Package> - </instructions> - </configuration> - </plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <executions> + <execution> + <id>bundle-manifest</id> + <phase>process-classes</phase> + <goals> + <goal>manifest</goal> + </goals> + </execution> + </executions> + <configuration> + <instructions> + <Main-Class>org.eclipse.jetty.runner.Runner</Main-Class> + <Import-Package>!*</Import-Package> + <Export-Package></Export-Package> + </instructions> + </configuration> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java index 01d58109d0..dae14bb741 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java @@ -34,6 +34,8 @@ public interface Configuration { public final static String ATTR="org.eclipse.jetty.webapp.configuration"; + public default String getClassName() { return getClass().getName(); } + /* ------------------------------------------------------------------------------- */ /** Get a class that this class replaces/extends * @return The class this Configuration replaces/extends or null if it replaces no other configuration @@ -141,15 +143,15 @@ public interface Configuration { if (configClass!=null && afterClass!=null) { - ListIterator<String> iter = _configurations.listIterator(); + ListIterator<Configuration> iter = _configurations.listIterator(); while (iter.hasNext()) { - Configuration c=getConfiguration(iter.next()); + Configuration c=iter.next(); if (afterClass.equals(c.getClass().getName()) || afterClass.equals(c.replaces().getName())) { for (String cc: configClass) - iter.add(cc); + iter.add(getConfiguration(cc)); return; } } @@ -162,16 +164,16 @@ public interface Configuration { if (configClass!=null && beforeClass!=null) { - ListIterator<String> iter = _configurations.listIterator(); + ListIterator<Configuration> iter = _configurations.listIterator(); while (iter.hasNext()) { - Configuration c=getConfiguration(iter.next()); + Configuration c=iter.next(); if (beforeClass.equals(c.getClass().getName()) || beforeClass.equals(c.replaces().getName())) { iter.previous(); for (String cc: configClass) - iter.add(cc); + iter.add(getConfiguration(cc)); return; } } diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configurations.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configurations.java index 3a5aac744f..c1e851ed32 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configurations.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configurations.java @@ -18,10 +18,13 @@ package org.eclipse.jetty.webapp; +import java.util.AbstractList; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -35,7 +38,7 @@ import org.eclipse.jetty.util.annotation.Name; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -public class Configurations +public class Configurations extends AbstractList<Configuration> { private static final Logger LOG = Log.getLogger(Configurations.class); @@ -44,7 +47,8 @@ public class Configurations { ServiceLoader<Configuration> configs = ServiceLoader.load(Configuration.class); for (Configuration configuration : configs) - __known.put(configuration.getClass().getName(),configuration); + __known.put(configuration.getClassName(),configuration); + LOG.debug("Known Configurations {}",__known.keySet()); } public static Collection<Configuration> getKnown() @@ -52,8 +56,6 @@ public class Configurations return Collections.unmodifiableCollection(__known.values()); } - protected List<String> _configurations = new ArrayList<>(); - /* ------------------------------------------------------------ */ /** Get/Set/Create the server default Configuration ClassList. * <p>Get the class list from: a Server bean; or the attribute (which can @@ -66,13 +68,13 @@ public class Configurations */ public static Configurations setServerDefault(Server server) throws ClassNotFoundException, InstantiationException, IllegalAccessException { - Configurations cl=server.getBean(Configurations.class); - if (cl!=null) - return cl; - cl=serverDefault(server); - server.addBean(cl); + Configurations configurations=server.getBean(Configurations.class); + if (configurations!=null) + return configurations; + configurations=serverDefault(server); + server.addBean(configurations); server.setAttribute(Configuration.ATTR,null); - return cl; + return configurations; } /* ------------------------------------------------------------ */ @@ -85,24 +87,42 @@ public class Configurations */ public static Configurations serverDefault(Server server) { - Configurations cl=null; - if (server!=null) + Configurations configurations; + if (server==null) + configurations=new Configurations(WebAppContext.DEFAULT_CONFIGURATION_CLASSES); + else { - cl= server.getBean(Configurations.class); - if (cl!=null) - return new Configurations(cl); - Object attr = server.getAttribute(Configuration.ATTR); - if (attr instanceof Configurations) - return new Configurations((Configurations)attr); - if (attr instanceof String[]) - return new Configurations((String[])attr); + configurations= server.getBean(Configurations.class); + if (configurations!=null) + configurations= new Configurations(configurations); + else + { + Object attr = server.getAttribute(Configuration.ATTR); + LOG.debug("{} attr({})= {}",server,Configuration.ATTR,attr); + if (attr instanceof Configurations) + configurations = new Configurations((Configurations)attr); + else if (attr instanceof String[]) + configurations = new Configurations((String[])attr); + else + configurations=new Configurations(WebAppContext.DEFAULT_CONFIGURATION_CLASSES); + } } - return new Configurations(); + + if (LOG.isDebugEnabled()) + LOG.debug("default configurations for {}: {}",server,configurations); + + return configurations; } + + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + /* ------------------------------------------------------------ */ + + protected List<Configuration> _configurations = new ArrayList<>(); + public Configurations() { - this(WebAppContext.DEFAULT_CONFIGURATION_CLASSES); } protected static Configuration getConfiguration(String classname) @@ -122,7 +142,6 @@ public class Configurations } LOG.info("Unknown configuration {}",classname); - __known.put(configuration.getClass().getName(),configuration); } return configuration; } @@ -141,53 +160,79 @@ public class Configurations { _configurations.addAll(classlist._configurations); } + + public void add(Configuration... configurations) + { + for (Configuration configuration : configurations) + add(configuration.getClassName(),configuration); + } public void add(@Name("configClass")String... configClass) { - loop: for (String c : configClass) + for (String name : configClass) + add(name,getConfiguration(name)); + } + + public void clear() + { + _configurations.clear(); + } + + public void set(Configuration... configurations) + { + clear(); + for (Configuration configuration : configurations) + add(configuration.getClassName(),configuration); + } + + public void set(@Name("configClass")String... configClass) + { + clear(); + for (String name : configClass) + add(name,getConfiguration(name)); + } + + public void remove(Configuration... configurations) + { + List<String> names = Arrays.asList(configurations).stream().map(Configuration::getClassName).collect(Collectors.toList()); + for (ListIterator<Configuration> i=_configurations.listIterator();i.hasNext();) { - Configuration configuration = getConfiguration(c); - - // Do we need to replace any existing configuration? - Class<? extends Configuration> replaces = configuration.replaces(); - if (replaces!=null) - { - for (ListIterator<String> i=_configurations.listIterator();i.hasNext();) - { - if (i.next().equals(replaces.getName())) - { - i.set(c); - continue loop; - } - } - } + Configuration configuration=i.next(); + if (names.contains(configuration.getClassName())) + i.remove(); + } + } - if (!_configurations.contains(c)) - _configurations.add(c); + public void remove(@Name("configClass")String... configClass) + { + List<String> names = Arrays.asList(configClass); + for (ListIterator<Configuration> i=_configurations.listIterator();i.hasNext();) + { + Configuration configuration=i.next(); + if (names.contains(configuration.getClassName())) + i.remove(); } } - public int size() { return _configurations.size(); } - public String[] toArray(String[] asArray) + public String[] toArray() { - return _configurations.toArray(new String[_configurations.size()]); + return _configurations.stream().map(Configuration::getClassName).toArray(String[]::new); } - public List<Configuration> getConfigurations() + public void sort() { - // instantiate configurations list - List<Configuration> configurations = _configurations.stream().map(n->{return __known.get(n);}).collect(Collectors.toList()); - // Sort the configurations Map<String,Configuration> map = new HashMap<>(); TopologicalSort<Configuration> sort = new TopologicalSort<>(); - - for (Configuration c:configurations) + + for (Configuration c:_configurations) + map.put(c.getClassName(),c); + for (Configuration c:_configurations) { for (String b:c.getBeforeThis()) { @@ -202,10 +247,54 @@ public class Configurations sort.addBeforeAfter(c,after); } } - sort.sort(configurations); + + sort.sort(_configurations); if (LOG.isDebugEnabled()) - LOG.debug("{} configurations {}",configurations); - return configurations; + LOG.debug("sorted {}",_configurations); + } + + public List<Configuration> getConfigurations() + { + return Collections.unmodifiableList(_configurations); + } + + @Override + public Configuration get(int index) + { + return _configurations.get(index); + } + + @Override + public Iterator<Configuration> iterator() + { + return getConfigurations().iterator(); + } + + private void add(String name,Configuration configuration) + { + // Is this configuration known? + if (!__known.containsKey(name)) + LOG.info("Unknown configuration {}",name); + + // Do we need to replace any existing configuration? + Class<? extends Configuration> replaces = configuration.replaces(); + if (replaces!=null) + { + for (ListIterator<Configuration> i=_configurations.listIterator();i.hasNext();) + { + if (i.next().getClassName().equals(replaces.getName())) + { + i.set(configuration); + return; + } + } + + _configurations.add(configuration); + return; + } + + if (!_configurations.stream().map(Configuration::getClassName).anyMatch(n->{return name.equals(n);})) + _configurations.add(configuration); } @Override diff --git a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java index c726169021..983e12cc3b 100644 --- a/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java +++ b/jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java @@ -106,7 +106,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL .filter(c->{return c.isEnabledByDefault();}) .map(c->{return c.getClass().getName();}) .toArray(String[]::new); - + // System classes are classes that cannot be replaced by // the web application, and they are *always* loaded via // system classloader. @@ -153,15 +153,13 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL "-org.eclipse.jetty.alpn.", // don't hide ALPN "org.eclipse.jdt.", // hide jdt used by jetty - "org.eclipse.jetty." // hide other jetty classes } ; - private final List<String> _configurationClasses = new ArrayList<>(); + private final Configurations _configurations = new Configurations(); private ClasspathPattern _systemClasses = null; private ClasspathPattern _serverClasses = null; - private final List<Configuration> _configurations = new ArrayList<>(); private String _defaultsDescriptor=WEB_DEFAULTS_XML; private String _descriptor=null; private final List<String> _overrideDescriptors = new ArrayList<>(); @@ -462,6 +460,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL // Setup Configuration classes for this webapp! loadConfigurations(); + _configurations.sort(); for (Configuration configuration:_configurations) { for (String pattern: configuration.getSystemClasses()) @@ -566,19 +565,16 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL { // Prepare for configuration MultiException mx=new MultiException(); - if (_configurations!=null) + for (Configuration configuration : _configurations) { - for (int i=_configurations.size();i-->0;) + try { - try - { - _configurations.get(i).destroy(this); - } - catch(Exception e) - { - mx.add(e); - } + configuration.destroy(this); } + catch(Exception e) + { + mx.add(e); + } } _configurations.clear(); super.destroy(); @@ -610,7 +606,8 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL @ManagedAttribute(value="configuration classes used to configure webapp", readonly=true) public String[] getConfigurationClasses() { - return _configurationClasses.toArray(new String[_configurationClasses.size()]); + loadConfigurations(); + return _configurations.toArray(); } /* ------------------------------------------------------------ */ @@ -619,7 +616,8 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL */ public Configuration[] getConfigurations() { - return _configurations.toArray(new Configuration[_configurations.size()]); + loadConfigurations(); + return _configurations.getConfigurations().toArray(new Configuration[_configurations.size()]); } /* ------------------------------------------------------------ */ @@ -921,22 +919,8 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL if (_configurations.size()>0) return; - if (_configurationClasses.size()==0) - { - _configurations.addAll(Configurations.serverDefault(getServer()).getConfigurations()); - } - else - { - try - { - for (String configClass : _configurationClasses) - _configurations.add((Configuration)Loader.loadClass(configClass).newInstance()); - } - catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) - { - throw new RuntimeException(e); - } - } + _configurations.add(Configurations.serverDefault(getServer()).toArray()); + _configurations.sort(); } /* ------------------------------------------------------------ */ @@ -961,7 +945,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL Collections.singletonList(new ClassLoaderDump(getClassLoader())), Collections.singletonList(new DumpableCollection("Systemclasses "+this,_systemClasses.getPatterns())), Collections.singletonList(new DumpableCollection("Serverclasses "+this,_serverClasses.getPatterns())), - Collections.singletonList(new DumpableCollection("Configurations "+this,_configurations)), + Collections.singletonList(new DumpableCollection("Configurations "+this,_configurations.getConfigurations())), Collections.singletonList(new DumpableCollection("Handler attributes "+this,((AttributesMap)getAttributes()).getAttributeEntrySet())), Collections.singletonList(new DumpableCollection("Context attributes "+this,((Context)getServletContext()).getAttributeEntrySet())), Collections.singletonList(new DumpableCollection("Initparams "+this,getInitParams().entrySet())) @@ -977,10 +961,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL { if (isStarted()) throw new IllegalStateException(); - _configurationClasses.clear(); - if (configurations!=null) - _configurationClasses.addAll(Arrays.asList(configurations)); - _configurations.clear(); + _configurations.set(configurations); } public void setConfigurationClasses(List<String> configurations) @@ -996,9 +977,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL { if (isStarted()) throw new IllegalStateException(); - _configurations.clear(); - if (configurations!=null) - _configurations.addAll(Arrays.asList(configurations)); + _configurations.set(configurations); } /* ------------------------------------------------------------ */ @@ -1007,8 +986,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL if (isStarted()) throw new IllegalStateException(); loadConfigurations(); - for (Configuration c:configuration) - _configurations.add(c); + _configurations.add(configuration); } /* ------------------------------------------------------------ */ @@ -1370,7 +1348,7 @@ public class WebAppContext extends ServletContextHandler implements WebAppClassL { stopWebapp(); try - { + { for (int i=_configurations.size();i-->0;) _configurations.get(i).deconfigure(this); diff --git a/jetty-webapp/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration b/jetty-webapp/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration index 7bfedb9773..84a6b90c32 100644 --- a/jetty-webapp/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration +++ b/jetty-webapp/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration @@ -1,4 +1,3 @@ -org.eclipse.jetty.webapp.CloneConfiguration org.eclipse.jetty.webapp.FragmentConfiguration org.eclipse.jetty.webapp.JettyWebXmlConfiguration org.eclipse.jetty.webapp.MetaInfConfiguration diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java index 60a6904fcc..1e3778df89 100644 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java +++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java @@ -56,8 +56,6 @@ public class WebAppClassLoaderTest this.testWebappDir = MavenTestingUtils.getProjectDirPath("src/test/webapp"); Resource webapp = new PathResource(testWebappDir); - System.err.printf("testWebappDir = %s%n", testWebappDir); - _context = new WebAppContext(); _context.setBaseResource(webapp); _context.setContextPath("/test"); diff --git a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java index 479cd058af..9cf73dc223 100644 --- a/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java +++ b/jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java @@ -18,14 +18,17 @@ package org.eclipse.jetty.webapp; +import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.stream.Collectors; import javax.servlet.GenericServlet; import javax.servlet.ServletContext; @@ -37,9 +40,9 @@ import org.eclipse.jetty.server.LocalConnector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.ResourceCollection; +import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; @@ -51,7 +54,7 @@ public class WebAppContextTest Server server = new Server(); //test if no classnames set, its the defaults WebAppContext wac = new WebAppContext(); - assertEquals(0,wac.getConfigurations().length); + assertThat(Arrays.asList(wac.getConfigurations()).stream().map(c->{return c.getClass().getName();}).collect(Collectors.toList()),Matchers.containsInAnyOrder(WebAppContext.DEFAULT_CONFIGURATION_CLASSES)); String[] classNames = wac.getConfigurationClasses(); assertNotNull(classNames); @@ -60,6 +63,19 @@ public class WebAppContextTest assertTrue(Arrays.equals(classNames, wac.getConfigurationClasses())); } + @Test + public void testConfigurationOrder () + { + WebAppContext wac = new WebAppContext(); + wac.setServer(new Server()); + Assert.assertThat(Arrays.asList(wac.getConfigurations()).stream().map(Configuration::getClassName).collect(Collectors.toList()), + Matchers.contains( + "org.eclipse.jetty.webapp.WebInfConfiguration", + "org.eclipse.jetty.webapp.WebXmlConfiguration", + "org.eclipse.jetty.webapp.MetaInfConfiguration", + "org.eclipse.jetty.webapp.FragmentConfiguration", + "org.eclipse.jetty.webapp.JettyWebXmlConfiguration")); + } @Test public void testConfigurationInstances () @@ -181,7 +197,7 @@ public class WebAppContextTest try { String response = connector.getResponses("GET http://localhost:8080 HTTP/1.1\r\nHost: localhost:8080\r\nConnection: close\r\n\r\n"); - Assert.assertTrue(response.indexOf("200 OK")>=0); + assertThat(response,containsString("200 OK")); } finally { diff --git a/jetty-webapp/src/test/resources/jetty-logging.properties b/jetty-webapp/src/test/resources/jetty-logging.properties index 4c4c7f8edd..853d984b59 100644 --- a/jetty-webapp/src/test/resources/jetty-logging.properties +++ b/jetty-webapp/src/test/resources/jetty-logging.properties @@ -1,6 +1,6 @@ # Setup default logging implementation for during testing org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog org.eclipse.jetty.LEVEL=INFO -# org.eclipse.jetty.webapp.WebAppClassLoader.LEVEL=DEBUG +org.eclipse.jetty.webapp.LEVEL=DEBUG # org.eclipse.jetty.util.LEVEL=DEBUG # org.eclipse.jetty.util.PathWatcher.Noisy.LEVEL=OFF |