Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Wilkins2015-12-04 05:26:58 +0000
committerGreg Wilkins2015-12-04 05:26:58 +0000
commit14bde1f69691f979fdb3c31f6b7841208fed0157 (patch)
tree66181e00e0a4f5c3f64ab189b30a8c15a1b1f69a
parent46ce2aef3abe68bbf6816874904c76506ccc848f (diff)
downloadorg.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
-rw-r--r--jetty-annotations/src/main/config/etc/jetty-annotations.xml4
-rw-r--r--jetty-ant/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration1
-rw-r--r--jetty-deploy/src/test/java/org/eclipse/jetty/deploy/providers/ScanningAppProviderRuntimeUpdatesTest.java2
-rw-r--r--jetty-deploy/src/test/resources/jetty-logging.properties1
-rw-r--r--jetty-osgi/jetty-osgi-boot/jettyhome/etc/jetty.xml24
-rw-r--r--jetty-osgi/test-jetty-osgi/src/test/config/etc/jetty.xml26
-rw-r--r--jetty-plus/src/main/config/etc/jetty-plus.xml4
-rw-r--r--jetty-runner/pom.xml40
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configuration.java14
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/Configurations.java195
-rw-r--r--jetty-webapp/src/main/java/org/eclipse/jetty/webapp/WebAppContext.java64
-rw-r--r--jetty-webapp/src/main/resources/META-INF/services/org.eclipse.jetty.webapp.Configuration1
-rw-r--r--jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppClassLoaderTest.java2
-rw-r--r--jetty-webapp/src/test/java/org/eclipse/jetty/webapp/WebAppContextTest.java22
-rw-r--r--jetty-webapp/src/test/resources/jetty-logging.properties2
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

Back to the top