diff --git a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java index acccfe5c0aa..a2357f14596 100644 --- a/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java +++ b/jetty-deploy/src/main/java/org/eclipse/jetty/deploy/DeploymentManager.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.stream.Collectors; import org.eclipse.jetty.deploy.bindings.StandardDeployer; import org.eclipse.jetty.deploy.bindings.StandardStarter; @@ -311,7 +312,7 @@ public class DeploymentManager extends ContainerLifeCycle */ public Collection getApps(Node node) { - List ret = new ArrayList(); + List ret = new ArrayList<>(); for (AppEntry entry : _apps) { if (entry.lifecyleNode == node) @@ -592,13 +593,40 @@ public class DeploymentManager extends ContainerLifeCycle { return _lifecycle.getNodes(); } + + @SuppressWarnings("unused") + @ManagedOperation(value="list nodes that are tracked by DeploymentManager", impact="INFO") + public Collection getNodeNames() + { + return _lifecycle.getNodes().stream().map(Node::getName).collect(Collectors.toList()); + } - @ManagedOperation(value="list apps that are located at specified App LifeCycle nodes", impact="ACTION") public Collection getApps(@Name("nodeName") String nodeName) { return getApps(_lifecycle.getNodeByName(nodeName)); } + @SuppressWarnings("unused") + @ManagedOperation(value="list apps that are located at specified App LifeCycle nodes", impact="ACTION") + public Collection getAppNames(@Name("nodeName") String nodeName) + { + Node node = _lifecycle.getNodeByName(nodeName); + if(node == null) + { + throw new IllegalArgumentException("Unable to find node [" + nodeName + "]"); + } + + List ret = new ArrayList<>(); + for (AppEntry entry : _apps) + { + if (entry.lifecyleNode == node) + { + ret.add(String.format("contextPath=%s,originId=%s,appProvider=%s", entry.app.getContextPath(), entry.app.getOriginId(), entry.app.getAppProvider().getClass().getName())); + } + } + return ret; + } + public void scope(XmlConfiguration xmlc, Resource webapp) throws IOException { diff --git a/jetty-maven-plugin/src/it/jetty-run-forked-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java b/jetty-maven-plugin/src/it/jetty-run-forked-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java index 31a195c1407..286dcccae2c 100644 --- a/jetty-maven-plugin/src/it/jetty-run-forked-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java +++ b/jetty-maven-plugin/src/it/jetty-run-forked-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java @@ -40,13 +40,13 @@ public class TestHelloServlet String response = httpClient.GET( "http://localhost:" + port + "/hello?name=beer" ).getContentAsString(); - System.out.println( "httpResponse:" + response ); + System.out.println( "httpResponse hello annotation servlet:" + response ); Assert.assertEquals( "hello beer", response.trim() ); response = httpClient.GET( "http://localhost:" + port + "/ping?name=beer" ).getContentAsString(); - System.out.println( "httpResponse:" + response ); + System.out.println( "httpResponse ping fragment servlet:" + response ); Assert.assertEquals( "pong beer", response.trim() ); } diff --git a/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/pom.xml b/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/pom.xml index 7fb521911d7..a7e8ccdba9b 100644 --- a/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/pom.xml +++ b/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/pom.xml @@ -21,6 +21,11 @@ jetty-simple-base + + org.slf4j + slf4j-simple + + org.eclipse.jetty jetty-servlet diff --git a/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java b/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java index 5d700a60525..6fc5cb06e25 100644 --- a/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java +++ b/jetty-maven-plugin/src/it/jetty-run-mojo-it/jetty-simple-webapp/src/test/java/org/eclipse/jetty/its/jetty_run_mojo_it/TestHelloServlet.java @@ -41,13 +41,13 @@ public class TestHelloServlet String response = httpClient.GET( "http://localhost:" + port + "/hello?name=beer" ).getContentAsString(); - System.out.println( "httpResponse:" + response ); + System.out.println( "httpResponse hello annotation servlet:" + response ); Assert.assertEquals( "hello beer", response.trim() ); response = httpClient.GET( "http://localhost:" + port + "/ping?name=beer" ).getContentAsString(); - System.out.println( "httpResponse:" + response ); + System.out.println( "httpResponse ping fragment servlet:" + response ); Assert.assertEquals( "pong beer", response.trim() ); } diff --git a/jetty-maven-plugin/src/it/jetty-run-mojo-it/pom.xml b/jetty-maven-plugin/src/it/jetty-run-mojo-it/pom.xml index 213a79af16b..313904bfff4 100644 --- a/jetty-maven-plugin/src/it/jetty-run-mojo-it/pom.xml +++ b/jetty-maven-plugin/src/it/jetty-run-mojo-it/pom.xml @@ -46,6 +46,12 @@ 1.7.21 + + org.slf4j + slf4j-simple + 1.7.21 + + commons-io commons-io diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java index 30785b43419..8e85e8cbc3c 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyEffectiveWebXml.java @@ -151,7 +151,7 @@ public class JettyEffectiveWebXml extends JettyRunMojo //just show the result in the log getLog().info(IO.toString(webApp.getQuickStartWebDescriptor().getInputStream())); } - catch (IOException e) + catch (Exception e) { throw new MojoExecutionException("Unable to output effective web.xml", e); } diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java index 4de7f20ae53..d7ddbd1aafd 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunForkedMojo.java @@ -295,7 +295,7 @@ public class JettyRunForkedMojo extends JettyRunMojo //leave everything unpacked for the forked process to use webApp.setPersistTempDirectory(true); - webApp.start(); //just enough to generate the quickstart + webApp.start(); //just enough to generate the quickstart //save config of the webapp BEFORE we stop File props = prepareConfiguration(); @@ -424,7 +424,6 @@ public class JettyRunForkedMojo extends JettyRunMojo { if (forkedProcess != null && waitForChild) forkedProcess.destroy(); - throw new MojoExecutionException("Failed to create Jetty process", ex); } } @@ -458,7 +457,7 @@ public class JettyRunForkedMojo extends JettyRunMojo public File prepareConfiguration() throws MojoExecutionException { try - { + { //work out the configuration based on what is configured in the pom File propsFile = new File (target, "fork.props"); if (propsFile.exists()) @@ -468,8 +467,6 @@ public class JettyRunForkedMojo extends JettyRunMojo //propsFile.deleteOnExit(); Properties props = new Properties(); - - //web.xml if (webApp.getDescriptor() != null) { @@ -484,7 +481,7 @@ public class JettyRunForkedMojo extends JettyRunMojo //sort out the context path if (webApp.getContextPath() != null) { - props.put("context.path", webApp.getContextPath()); + props.put("context.path", webApp.getContextPath()); } //tmp dir @@ -504,7 +501,6 @@ public class JettyRunForkedMojo extends JettyRunMojo props.put("base.dirs", toCSV(((ResourceCollection)postOverlayResources).getResources())); else props.put("base.dirs", postOverlayResources.toString()); - //web-inf classes if (webApp.getClasses() != null) diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java index 922ac79f5a5..719caada0a4 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyRunMojo.java @@ -21,6 +21,7 @@ package org.eclipse.jetty.maven.plugin; import java.io.File; import java.io.IOException; import java.net.URL; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; @@ -281,14 +282,13 @@ public class JettyRunMojo extends AbstractJettyMojo if (useTestScope && (testClassesDirectory != null)) webApp.setTestClasses (testClassesDirectory); - webApp.getClassPathFiles().addAll( getDependencyProjects() ); - webApp.setWebInfLib (getDependencyFiles()); + webApp.setWebInfLib(getDependencyFiles()); //get copy of a list of war artifacts Set matchedWarArtifacts = new HashSet(); //process any overlays and the war type artifacts - List overlays = new ArrayList(); + List overlays = new ArrayList<>(); for (OverlayConfig config:warPluginInfo.getMavenWarOverlayConfigs()) { //overlays can be individually skipped @@ -584,8 +584,12 @@ public class JettyRunMojo extends AbstractJettyMojo { continue; } - if (getProjectReferences( artifact, project )!=null) + MavenProject mavenProject = getProjectReferences( artifact, project ); + if (mavenProject != null) { + File projectPath = Paths.get(mavenProject.getBuild().getOutputDirectory()).toFile(); + getLog().debug( "Adding project directory " + projectPath.toString() ); + dependencyFiles.add( projectPath ); continue; } @@ -602,38 +606,6 @@ public class JettyRunMojo extends AbstractJettyMojo return dependencyFiles; } - private List getDependencyProjects() - { - List dependencyFiles = new ArrayList<>(); - for ( Iterator iter = projectArtifacts.iterator(); iter.hasNext(); ) - { - Artifact artifact = iter.next(); - - // Include runtime and compile time libraries, and possibly test libs too - if(artifact.getType().equals("war")) - { - continue; - } - - if (Artifact.SCOPE_PROVIDED.equals(artifact.getScope())) - continue; //never add dependencies of scope=provided to the webapp's classpath (see also param) - - if (Artifact.SCOPE_TEST.equals(artifact.getScope()) && !useTestScope) - continue; //only add dependencies of scope=test if explicitly required - - MavenProject mavenProject = getProjectReferences( artifact, project ); - if (mavenProject != null) - { - dependencyFiles.add( Paths.get(mavenProject.getBuild().getOutputDirectory()).toFile() ); - getLog().debug( "Adding project reference " + mavenProject.getBuild().getOutputDirectory() - + " for WEB-INF/classes " ); - } - } - - return dependencyFiles; - } - - protected MavenProject getProjectReferences( Artifact artifact, MavenProject project ) { if ( project.getProjectReferences() == null || project.getProjectReferences().isEmpty() ) 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 c26cca9922f..b4317c503cf 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 @@ -266,8 +266,15 @@ public class JettyWebAppContext extends WebAppContext /* ------------------------------------------------------------ */ public Resource getQuickStartWebDescriptor () + throws Exception { - return (Resource)getAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML); + Object o = getAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML); + if (o == null) + return null; + else if (o instanceof Resource) + return (Resource)o; + else + return Resource.newResource((String)o); } /* ------------------------------------------------------------ */ @@ -295,6 +302,12 @@ public class JettyWebAppContext extends WebAppContext return _webInfJars; } + /* ------------------------------------------------------------ */ + public List getWebInfClasses() + { + return _webInfClasses; + } + /* ------------------------------------------------------------ */ public void setGenerateQuickStart (boolean quickStart) { @@ -306,7 +319,7 @@ public class JettyWebAppContext extends WebAppContext { return _isGenerateQuickStart; } - + /* ------------------------------------------------------------ */ @@ -385,6 +398,8 @@ public class JettyWebAppContext extends WebAppContext { if (c instanceof EnvConfiguration && getJettyEnvXml() != null) ((EnvConfiguration)c).setJettyEnvXml(Resource.toURL(new File(getJettyEnvXml()))); + else if (c instanceof MavenQuickStartConfiguration && getQuickStartWebDescriptor() != null) + ((MavenQuickStartConfiguration)c).setQuickStartWebXml(getQuickStartWebDescriptor()); } } catch(Exception e) diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenMetaInfConfiguration.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenMetaInfConfiguration.java index 82b4119d896..236ab09e1a9 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenMetaInfConfiguration.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenMetaInfConfiguration.java @@ -61,62 +61,64 @@ public class MavenMetaInfConfiguration extends MetaInfConfiguration protected List findJars (WebAppContext context) throws Exception { - List list = new ArrayList(); + List list = new ArrayList<>(); JettyWebAppContext jwac = (JettyWebAppContext)context; - if (jwac.getClassPathFiles() != null) + List files = jwac.getWebInfLib(); + if (files != null) { - for (File f: jwac.getClassPathFiles()) - { - if (f.getName().toLowerCase(Locale.ENGLISH).endsWith(".jar")) + files.forEach( file -> { + if (file.getName().toLowerCase(Locale.ENGLISH).endsWith(".jar") + || file.isDirectory()) { try { - list.add(Resource.newResource(f.toURI())); + LOG.debug( " add resource to resources to examine {}", file ); + list.add(Resource.newResource(file.toURI())); } catch (Exception e) { LOG.warn("Bad url ", e); } } - } + } ); } List superList = super.findJars(context); if (superList != null) list.addAll(superList); - return list; + return list; } - - + /** * Add in the classes dirs from test/classes and target/classes * @see org.eclipse.jetty.webapp.MetaInfConfiguration#findClassDirs(org.eclipse.jetty.webapp.WebAppContext) */ @Override protected List findClassDirs(WebAppContext context) throws Exception - { - List list = new ArrayList(); + { + List list = new ArrayList<>(); JettyWebAppContext jwac = (JettyWebAppContext)context; - if (jwac.getClassPathFiles() != null) + List files = jwac.getWebInfClasses(); + if (files != null) { - for (File f: jwac.getClassPathFiles()) - { - if (f.exists() && f.isDirectory()) + files.forEach( file -> { + if (file.exists() && file.isDirectory()) { try { - list.add(Resource.newResource(f.toURI())); + list.add(Resource.newResource(file.toURI())); } catch (Exception e) { LOG.warn("Bad url ", e); } } - } + } ); + } List classesDirs = super.findClassDirs(context); diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenQuickStartConfiguration.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenQuickStartConfiguration.java index 5313c0bebe9..637dfea1836 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenQuickStartConfiguration.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenQuickStartConfiguration.java @@ -39,6 +39,23 @@ import org.eclipse.jetty.webapp.WebAppContext; public class MavenQuickStartConfiguration extends QuickStartConfiguration { private static final Logger LOG = Log.getLogger(QuickStartConfiguration.class); + + private Resource _quickStartWebXml; //the descriptor to use for starting/generating quickstart + + public void setQuickStartWebXml(Resource quickStartWebXml) + { + _quickStartWebXml = quickStartWebXml; + } + + + @Override + public Resource getQuickStartWebXml(WebAppContext context) throws Exception + { + if (_quickStartWebXml == null) + return super.getQuickStartWebXml(context); + + return _quickStartWebXml; + } @Override public void preConfigure(WebAppContext context) throws Exception diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java index 24d993130a9..356f4af2b6e 100644 --- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java +++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/MavenWebInfConfiguration.java @@ -84,10 +84,6 @@ public class MavenWebInfConfiguration extends WebInfConfiguration - - - - @@ -165,6 +161,7 @@ public class MavenWebInfConfiguration extends WebInfConfiguration } + protected Resource unpackOverlay (WebAppContext context, Overlay overlay) throws IOException { diff --git a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java index afaac89d4e9..3f2395c9c02 100644 --- a/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java +++ b/jetty-rewrite/src/main/java/org/eclipse/jetty/rewrite/handler/RuleContainer.java @@ -163,7 +163,7 @@ public class RuleContainer extends Rule if (_rules==null) return target; - + for (Rule rule : _rules) { String applied=rule.matchAndApply(target,request, response); @@ -179,26 +179,29 @@ public class RuleContainer extends Rule String query = request.getQueryString(); if (query != null) request.setAttribute(_originalQueryStringAttribute,query); - } + } + + // Ugly hack, we should just pass baseRequest into the API from RewriteHandler itself. + Request baseRequest = Request.getBaseRequest(request); if (_rewriteRequestURI) { String encoded=URIUtil.encodePath(applied); if (rule instanceof Rule.ApplyURI) - ((Rule.ApplyURI)rule).applyURI((Request)request,((Request)request).getRequestURI(), encoded); + ((Rule.ApplyURI)rule).applyURI(baseRequest, baseRequest.getRequestURI(), encoded); else - ((Request)request).setURIPathQuery(encoded); + baseRequest.setURIPathQuery(encoded); } if (_rewritePathInfo) - ((Request)request).setPathInfo(applied); + baseRequest.setPathInfo(applied); target=applied; if (rule.isHandling()) { LOG.debug("handling {}",rule); - Request.getBaseRequest(request).setHandled(true); + baseRequest.setHandled(true); } if (rule.isTerminating())