diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java index c9b67036698..8ee3b205367 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyWebAppContext.java @@ -33,7 +33,6 @@ import java.util.TreeSet; import org.eclipse.jetty.annotations.AnnotationConfiguration; import org.eclipse.jetty.plus.webapp.EnvConfiguration; import org.eclipse.jetty.plus.webapp.PlusConfiguration; -import org.eclipse.jetty.quickstart.ExtraXmlDescriptorProcessor; import org.eclipse.jetty.quickstart.QuickStartConfiguration; import org.eclipse.jetty.quickstart.QuickStartConfiguration.Mode; import org.eclipse.jetty.servlet.FilterHolder; @@ -53,10 +52,10 @@ import org.eclipse.jetty.webapp.WebInfConfiguration; /** * JettyWebAppContext * - * Extends the WebAppContext to specialize for the maven environment. - * We pass in the list of files that should form the classpath for - * the webapp when executing in the plugin, and any jetty-env.xml file - * that may have been configured. + * Extends the WebAppContext to specialize for the maven environment. We pass in + * the list of files that should form the classpath for the webapp when + * executing in the plugin, and any jetty-env.xml file that may have been + * configured. * */ public class JettyWebAppContext extends WebAppContext @@ -64,55 +63,53 @@ public class JettyWebAppContext extends WebAppContext private static final Logger LOG = Log.getLogger(JettyWebAppContext.class); private static final String DEFAULT_CONTAINER_INCLUDE_JAR_PATTERN = ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$|.*javax.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard-impl-.*\\.jar"; + private static final String WEB_INF_CLASSES_PREFIX = "/WEB-INF/classes"; + private static final String WEB_INF_LIB_PREFIX = "/WEB-INF/lib"; private File _classes = null; + private File _testClasses = null; + private final List _webInfClasses = new ArrayList<>(); + private final List _webInfJars = new ArrayList<>(); + private final Map _webInfJarMap = new HashMap(); - private List _classpathFiles; //webInfClasses+testClasses+webInfJars + + private List _classpathFiles; // webInfClasses+testClasses+webInfJars + private String _jettyEnvXml; + private List _overlays; - - - - /** - * Set the "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern" with a pattern for matching jars on - * container classpath to scan. This is analogous to the WebAppContext.setAttribute() call. + * Set the "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern" with + * a pattern for matching jars on container classpath to scan. This is + * analogous to the WebAppContext.setAttribute() call. */ private String _containerIncludeJarPattern = null; - + /** - * Set the "org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern" with a pattern for matching jars on - * webapp's classpath to scan. This is analogous to the WebAppContext.setAttribute() call. + * Set the "org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern" with a + * pattern for matching jars on webapp's classpath to scan. This is + * analogous to the WebAppContext.setAttribute() call. */ private String _webInfIncludeJarPattern = null; - - /** - * If there is no maven-war-plugin config for ordering of the current project in the - * sequence of overlays, use this to control whether the current project is added - * first or last in list of overlaid resources + * If there is no maven-war-plugin config for ordering of the current + * project in the sequence of overlays, use this to control whether the + * current project is added first or last in list of overlaid resources */ private boolean _baseAppFirst = true; - - private boolean _isGenerateQuickStart; - private ExtraXmlDescriptorProcessor _preconfigProcessor; - - - /* ------------------------------------------------------------ */ - public JettyWebAppContext () - throws Exception + public JettyWebAppContext() throws Exception { - super(); + super(); // Turn off copyWebInf option as it is not applicable for plugin. super.setCopyWebInf(false); addConfiguration(new MavenWebInfConfiguration()); @@ -121,95 +118,87 @@ public class JettyWebAppContext extends WebAppContext addConfiguration(new PlusConfiguration()); addConfiguration(new AnnotationConfiguration()); } - - /* ------------------------------------------------------------ */ + public void setContainerIncludeJarPattern(String pattern) { _containerIncludeJarPattern = pattern; } - - /* ------------------------------------------------------------ */ + public String getContainerIncludeJarPattern() { return _containerIncludeJarPattern; } - - /* ------------------------------------------------------------ */ + public String getWebInfIncludeJarPattern() { return _webInfIncludeJarPattern; } - - /* ------------------------------------------------------------ */ + public void setWebInfIncludeJarPattern(String pattern) { _webInfIncludeJarPattern = pattern; } - - /* ------------------------------------------------------------ */ + public List getClassPathFiles() { return this._classpathFiles; } - - /* ------------------------------------------------------------ */ - public void setJettyEnvXml (String jettyEnvXml) + + public void setJettyEnvXml(String jettyEnvXml) { this._jettyEnvXml = jettyEnvXml; } - - /* ------------------------------------------------------------ */ + public String getJettyEnvXml() { return this._jettyEnvXml; } - /* ------------------------------------------------------------ */ public void setClasses(File dir) { _classes = dir; } - - /* ------------------------------------------------------------ */ + public File getClasses() { return _classes; } - - /* ------------------------------------------------------------ */ - public void setWebInfLib (List jars) + + public void setWebInfLib(List jars) { _webInfJars.addAll(jars); } - - /* ------------------------------------------------------------ */ - public void setTestClasses (File dir) + + public void setTestClasses(File dir) { _testClasses = dir; } - - /* ------------------------------------------------------------ */ - public File getTestClasses () + + public File getTestClasses() { return _testClasses; } - - - /* ------------------------------------------------------------ */ + /** * Ordered list of wars to overlay on top of the current project. The list * may contain an overlay that represents the current project. + * * @param overlays the list of overlays */ - public void setOverlays (List overlays) + public void setOverlays(List overlays) { _overlays = overlays; } - - public void setOriginAttribute (String name) + /** + * Set the name of the attribute that is used in each generated xml element + * to indicate the source of the xml element (eg annotation, web.xml etc). + * + * @param name the name of the attribute to use. + */ + public void setOriginAttribute(String name) { - setAttribute(QuickStartConfiguration.ORIGIN_ATTRIBUTE,name); + setAttribute(QuickStartConfiguration.ORIGIN_ATTRIBUTE, name); } /** @@ -218,122 +207,127 @@ public class JettyWebAppContext extends WebAppContext public String getOriginAttribute() { Object attr = getAttribute(QuickStartConfiguration.ORIGIN_ATTRIBUTE); - return attr==null?null:attr.toString(); + return attr == null ? null : attr.toString(); } /** - * @param generateOrigin the generateOrigin to set + * Toggle whether or not the origin attribute will be generated into the + * xml. + * + * @param generateOrigin if true then the origin of each xml element is + * added, otherwise it is omitted. */ public void setGenerateOrigin(boolean generateOrigin) { - setAttribute(QuickStartConfiguration.GENERATE_ORIGIN,generateOrigin); + setAttribute(QuickStartConfiguration.GENERATE_ORIGIN, generateOrigin); } /** - * @return the generateOrigin + * @return true if the origin attribute will be generated, false otherwise */ public boolean isGenerateOrigin() { Object attr = getAttribute(QuickStartConfiguration.GENERATE_ORIGIN); - return attr==null?false:Boolean.valueOf(attr.toString()); + return attr == null ? false : Boolean.valueOf(attr.toString()); } - /* ------------------------------------------------------------ */ public List getOverlays() { return _overlays; } - /* ------------------------------------------------------------ */ public void setBaseAppFirst(boolean value) { _baseAppFirst = value; } - /* ------------------------------------------------------------ */ public boolean getBaseAppFirst() { return _baseAppFirst; } - - /* ------------------------------------------------------------ */ - public void setQuickStartWebDescriptor (String quickStartWebXml) throws Exception + + /** + * Set the file to use into which to generate the quickstart output. + * + * @param quickStartWebXml the full path to the file to use + * @throws Exception + */ + public void setQuickStartWebDescriptor(String quickStartWebXml) throws Exception { setQuickStartWebDescriptor(Resource.newResource(quickStartWebXml)); } - - /* ------------------------------------------------------------ */ - protected void setQuickStartWebDescriptor (Resource quickStartWebXml) + + /** + * Set the Resource to use into which to generate the quickstart output. + * + * @param quickStartWebXml + */ + protected void setQuickStartWebDescriptor(Resource quickStartWebXml) { - setAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML,quickStartWebXml.toString()); + setAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML, quickStartWebXml.toString()); } - - /* ------------------------------------------------------------ */ - public Resource getQuickStartWebDescriptor () - throws Exception + + public Resource getQuickStartWebDescriptor() throws Exception { Object o = getAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML); if (o == null) return null; else if (o instanceof Resource) - return (Resource)o; + return (Resource) o; else - return Resource.newResource((String)o); + return Resource.newResource((String) o); } - - /* ------------------------------------------------------------ */ + /** - * This method is provided as a convenience for jetty maven plugin configuration - * @param resourceBases Array of resources strings to set as a {@link ResourceCollection}. Each resource string may be a comma separated list of resources - * @see Resource + * This method is provided as a convenience for jetty maven plugin + * configuration + * + * @param resourceBases Array of resources strings to set as a + * {@link ResourceCollection}. Each resource string may be a + * comma separated list of resources */ public void setResourceBases(String[] resourceBases) { List resources = new ArrayList(); - for (String rl:resourceBases) + for (String rl : resourceBases) { String[] rs = StringUtil.csvSplit(rl); - for (String r:rs) + for (String r : rs) resources.add(r); } setBaseResource(new ResourceCollection(resources.toArray(new String[resources.size()]))); } - - /* ------------------------------------------------------------ */ + public List getWebInfLib() { return _webInfJars; } - /* ------------------------------------------------------------ */ public List getWebInfClasses() { return _webInfClasses; } - /* ------------------------------------------------------------ */ - public void setGenerateQuickStart (boolean quickStart) + /** + * If true, a quickstart for the webapp is generated. + * + * @param quickStart if true the quickstart is generated, false otherwise + */ + public void setGenerateQuickStart(boolean quickStart) { _isGenerateQuickStart = quickStart; } - - /* ------------------------------------------------------------ */ + public boolean isGenerateQuickStart() { return _isGenerateQuickStart; } - - - - - - /* ------------------------------------------------------------ */ @Override - public void doStart () throws Exception + public void doStart() throws Exception { - //choose if this will be a quickstart or normal start + // choose if this will be a quickstart or normal start if (!isGenerateQuickStart() && getQuickStartWebDescriptor() != null) { MavenQuickStartConfiguration quickStart = new MavenQuickStartConfiguration(); @@ -349,30 +343,30 @@ public class JettyWebAppContext extends WebAppContext addConfiguration(quickStart); } + // Set up the pattern that tells us where the jars are that need + // scanning - //Set up the pattern that tells us where the jars are that need scanning - - //Allow user to set up pattern for names of jars from the container classpath - //that will be scanned - note that by default NO jars are scanned + // Allow user to set up pattern for names of jars from the container + // classpath + // that will be scanned - note that by default NO jars are scanned String tmp = _containerIncludeJarPattern; - if (tmp==null || "".equals(tmp)) - tmp = (String)getAttribute(WebInfConfiguration.CONTAINER_JAR_PATTERN); - + if (tmp == null || "".equals(tmp)) tmp = (String) getAttribute(WebInfConfiguration.CONTAINER_JAR_PATTERN); + tmp = addPattern(tmp, DEFAULT_CONTAINER_INCLUDE_JAR_PATTERN); setAttribute(WebInfConfiguration.CONTAINER_JAR_PATTERN, tmp); - - //Allow user to set up pattern of jar names from WEB-INF that will be scanned. - //Note that by default ALL jars considered to be in WEB-INF will be scanned - setting - //a pattern restricts scanning - if (_webInfIncludeJarPattern != null) - setAttribute(WebInfConfiguration.WEBINF_JAR_PATTERN, _webInfIncludeJarPattern); - - //Set up the classes dirs that comprises the equivalent of WEB-INF/classes - if (_testClasses != null) - _webInfClasses.add(_testClasses); - if (_classes != null) - _webInfClasses.add(_classes); - + + // Allow user to set up pattern of jar names from WEB-INF that will be + // scanned. + // Note that by default ALL jars considered to be in WEB-INF will be + // scanned - setting + // a pattern restricts scanning + if (_webInfIncludeJarPattern != null) setAttribute(WebInfConfiguration.WEBINF_JAR_PATTERN, _webInfIncludeJarPattern); + + // Set up the classes dirs that comprises the equivalent of + // WEB-INF/classes + if (_testClasses != null) _webInfClasses.add(_testClasses); + if (_classes != null) _webInfClasses.add(_classes); + // Set up the classpath _classpathFiles = new ArrayList<>(); _classpathFiles.addAll(_webInfClasses); @@ -384,74 +378,67 @@ public class JettyWebAppContext extends WebAppContext { // Return all jar files from class path String fileName = file.getName(); - if (fileName.endsWith(".jar")) - _webInfJarMap.put(fileName, file); + if (fileName.endsWith(".jar")) _webInfJarMap.put(fileName, file); } - - //check for CDI + + // check for CDI initCDI(); - + // CHECK setShutdown(false); super.doStart(); } - - + @Override protected void loadConfigurations() { super.loadConfigurations(); try { - //inject configurations with config from maven plugin - for (Configuration c:getWebAppConfigurations()) + // inject configurations with config from maven plugin + for (Configuration c : getWebAppConfigurations()) { if (c instanceof EnvConfiguration && getJettyEnvXml() != null) - ((EnvConfiguration)c).setJettyEnvXml(Resource.toURL(new File(getJettyEnvXml()))); + ((EnvConfiguration) c).setJettyEnvXml(Resource.toURL(new File(getJettyEnvXml()))); } } - catch(Exception e) + catch (Exception e) { throw new RuntimeException(e); } } - - /* ------------------------------------------------------------ */ @Override - public void doStop () throws Exception - { - if (_classpathFiles != null) - _classpathFiles.clear(); + public void doStop() throws Exception + { + if (_classpathFiles != null) _classpathFiles.clear(); _classpathFiles = null; - + _classes = null; _testClasses = null; - - if (_webInfJarMap != null) - _webInfJarMap.clear(); - + + if (_webInfJarMap != null) _webInfJarMap.clear(); + _webInfClasses.clear(); _webInfJars.clear(); - - - + // CHECK setShutdown(true); - //just wait a little while to ensure no requests are still being processed + // just wait a little while to ensure no requests are still being + // processed Thread.currentThread().sleep(500L); super.doStop(); - //remove all listeners, servlets and filters. This is because we will re-apply - //any context xml file, which means they would potentially be added multiple times. + // remove all listeners, servlets and filters. This is because we will + // re-apply + // any context xml file, which means they would potentially be added + // multiple times. setEventListeners(new EventListener[0]); getServletHandler().setFilters(new FilterHolder[0]); getServletHandler().setFilterMappings(new FilterMapping[0]); getServletHandler().setServlets(new ServletHolder[0]); getServletHandler().setServletMappings(new ServletMapping[0]); } - - - /* ------------------------------------------------------------ */ + @Override public Resource getResource(String uriInContext) throws MalformedURLException { @@ -459,57 +446,54 @@ public class JettyWebAppContext extends WebAppContext // Try to get regular resource resource = super.getResource(uriInContext); - // If no regular resource exists check for access to /WEB-INF/lib or /WEB-INF/classes + // If no regular resource exists check for access to /WEB-INF/lib or + // /WEB-INF/classes if ((resource == null || !resource.exists()) && uriInContext != null && _classes != null) { String uri = URIUtil.canonicalPath(uriInContext); - if (uri == null) - return null; + if (uri == null) return null; try { // Replace /WEB-INF/classes with candidates for the classpath if (uri.startsWith(WEB_INF_CLASSES_PREFIX)) { - if (uri.equalsIgnoreCase(WEB_INF_CLASSES_PREFIX) || uri.equalsIgnoreCase(WEB_INF_CLASSES_PREFIX+"/")) + if (uri.equalsIgnoreCase(WEB_INF_CLASSES_PREFIX) || uri.equalsIgnoreCase(WEB_INF_CLASSES_PREFIX + "/")) { - //exact match for a WEB-INF/classes, so preferentially return the resource matching the web-inf classes - //rather than the test classes + // exact match for a WEB-INF/classes, so preferentially + // return the resource matching the web-inf classes + // rather than the test classes if (_classes != null) return Resource.newResource(_classes); - else if (_testClasses != null) - return Resource.newResource(_testClasses); + else if (_testClasses != null) return Resource.newResource(_testClasses); } else { - //try matching + // try matching Resource res = null; - int i=0; + int i = 0; while (res == null && (i < _webInfClasses.size())) { String newPath = uri.replace(WEB_INF_CLASSES_PREFIX, _webInfClasses.get(i).getPath()); res = Resource.newResource(newPath); if (!res.exists()) { - res = null; + res = null; i++; } } return res; } - } + } else if (uri.startsWith(WEB_INF_LIB_PREFIX)) { // Return the real jar file for all accesses to // /WEB-INF/lib/*.jar String jarName = uri.replace(WEB_INF_LIB_PREFIX, ""); - if (jarName.startsWith("/") || jarName.startsWith("\\")) - jarName = jarName.substring(1); - if (jarName.length()==0) - return null; + if (jarName.startsWith("/") || jarName.startsWith("\\")) jarName = jarName.substring(1); + if (jarName.length() == 0) return null; File jarFile = _webInfJarMap.get(jarName); - if (jarFile != null) - return Resource.newResource(jarFile.getPath()); + if (jarFile != null) return Resource.newResource(jarFile.getPath()); return null; } @@ -525,21 +509,20 @@ public class JettyWebAppContext extends WebAppContext } return resource; } - - - /* ------------------------------------------------------------ */ + @Override public Set getResourcePaths(String path) { - // Try to get regular resource paths - this will get appropriate paths from any overlaid wars etc + // Try to get regular resource paths - this will get appropriate paths + // from any overlaid wars etc Set paths = super.getResourcePaths(path); - + if (path != null) { TreeSet allPaths = new TreeSet<>(); allPaths.addAll(paths); - - //add in the dependency jars as a virtual WEB-INF/lib entry + + // add in the dependency jars as a virtual WEB-INF/lib entry if (path.startsWith(WEB_INF_LIB_PREFIX)) { for (String fileName : _webInfJarMap.keySet()) @@ -550,8 +533,8 @@ public class JettyWebAppContext extends WebAppContext } else if (path.startsWith(WEB_INF_CLASSES_PREFIX)) { - int i=0; - + int i = 0; + while (i < _webInfClasses.size()) { String newPath = path.replace(WEB_INF_CLASSES_PREFIX, _webInfClasses.get(i).getPath()); @@ -563,35 +546,31 @@ public class JettyWebAppContext extends WebAppContext } return paths; } - - /* ------------------------------------------------------------ */ - public String addPattern (String s, String pattern) + + public String addPattern(String s, String pattern) { if (s == null) s = ""; else s = s.trim(); - + if (!s.contains(pattern)) { - if (s.length() != 0) - s = s + "|"; + if (s.length() != 0) s = s + "|"; s = s + pattern; } - + return s; } - - - /* ------------------------------------------------------------ */ + public void initCDI() { Class cdiInitializer = null; try { cdiInitializer = Thread.currentThread().getContextClassLoader().loadClass("org.eclipse.jetty.cdi.servlet.JettyWeldInitializer"); - Method initWebAppMethod = cdiInitializer.getMethod("initWebApp", new Class[]{WebAppContext.class}); - initWebAppMethod.invoke(null, new Object[]{this}); + Method initWebAppMethod = cdiInitializer.getMethod("initWebApp", new Class[] { WebAppContext.class }); + initWebAppMethod.invoke(null, new Object[] { this }); } catch (ClassNotFoundException e) { @@ -603,7 +582,7 @@ public class JettyWebAppContext extends WebAppContext } catch (Exception e) { - LOG.warn("Problem initializing cdi", e); + LOG.warn("Problem initializing cdi", e); } } } diff --git a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/ExtraXmlDescriptorProcessor.java b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/ExtraXmlDescriptorProcessor.java index e537795deb8..37e49a93c5a 100644 --- a/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/ExtraXmlDescriptorProcessor.java +++ b/jetty-quickstart/src/main/java/org/eclipse/jetty/quickstart/ExtraXmlDescriptorProcessor.java @@ -26,9 +26,9 @@ import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlParser; /** - * Preconfigure DescriptorProcessor + * ExtraXmlDescriptorProcessor * - * Saves literal XML snippets + * Saves literal XML snippets from web.xml. * */