diff options
Diffstat (limited to 'jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebInfConfiguration.java')
-rw-r--r-- | jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebInfConfiguration.java | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebInfConfiguration.java b/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebInfConfiguration.java new file mode 100644 index 0000000000..831a494447 --- /dev/null +++ b/jetty-ant/src/main/java/org/eclipse/jetty/ant/AntWebInfConfiguration.java @@ -0,0 +1,146 @@ +// +// ======================================================================== +// Copyright (c) 1995-2012 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.ant; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.List; +import java.util.regex.Pattern; + +import org.apache.tools.ant.AntClassLoader; +import org.eclipse.jetty.util.PatternMatcher; +import org.eclipse.jetty.util.resource.Resource; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.webapp.WebInfConfiguration; + +public class AntWebInfConfiguration extends WebInfConfiguration +{ + + + @Override + public void preConfigure(final WebAppContext context) throws Exception + { + // Look for a work directory + File work = findWorkDirectory(context); + if (work != null) + makeTempDirectory(work, context, false); + + //Make a temp directory for the webapp if one is not already set + resolveTempDirectory(context); + + //Extract webapp if necessary + unpack (context); + + + //Apply an initial ordering to the jars which governs which will be scanned for META-INF + //info and annotations. The ordering is based on inclusion patterns. + String tmp = (String)context.getAttribute(WEBINF_JAR_PATTERN); + Pattern webInfPattern = (tmp==null?null:Pattern.compile(tmp)); + tmp = (String)context.getAttribute(CONTAINER_JAR_PATTERN); + Pattern containerPattern = (tmp==null?null:Pattern.compile(tmp)); + + //Apply ordering to container jars - if no pattern is specified, we won't + //match any of the container jars + PatternMatcher containerJarNameMatcher = new PatternMatcher () + { + public void matched(URI uri) throws Exception + { + context.getMetaData().addContainerJar(Resource.newResource(uri)); + } + }; + ClassLoader loader = context.getClassLoader(); + if (loader != null) + { + loader = loader.getParent(); + if (loader != null) + { + URI[] containerUris = null; + + if (loader instanceof URLClassLoader) + { + URL[] urls = ((URLClassLoader)loader).getURLs(); + if (urls != null) + { + containerUris = new URI[urls.length]; + int i=0; + for (URL u : urls) + { + try + { + containerUris[i] = u.toURI(); + } + catch (URISyntaxException e) + { + containerUris[i] = new URI(u.toString().replaceAll(" ", "%20")); + } + i++; + } + } + } + else if (loader instanceof AntClassLoader) + { + AntClassLoader antLoader = (AntClassLoader)loader; + String[] paths = antLoader.getClasspath().split(new String(new char[]{File.pathSeparatorChar})); + if (paths != null) + { + containerUris = new URI[paths.length]; + int i=0; + for (String p:paths) + { + File f = new File(p); + containerUris[i] = f.toURI(); + i++; + } + } + } + + containerJarNameMatcher.match(containerPattern, containerUris, false); + } + } + + //Apply ordering to WEB-INF/lib jars + PatternMatcher webInfJarNameMatcher = new PatternMatcher () + { + @Override + public void matched(URI uri) throws Exception + { + context.getMetaData().addWebInfJar(Resource.newResource(uri)); + } + }; + List<Resource> jars = findJars(context); + + //Convert to uris for matching + URI[] uris = null; + if (jars != null) + { + uris = new URI[jars.size()]; + int i=0; + for (Resource r: jars) + { + uris[i++] = r.getURI(); + } + } + webInfJarNameMatcher.match(webInfPattern, uris, true); //null is inclusive, no pattern == all jars match + } + + +} |