From 995e0b6c59ce30014333d8aa0a72dcacb61c529f Mon Sep 17 00:00:00 2001
From: Jan Bartel <janb@webtide.com>
Date: Wed, 18 Sep 2019 08:12:45 +1000
Subject: [PATCH] Issue #1743 WIP

Signed-off-by: Jan Bartel <janb@webtide.com>
---
 .../maven/plugin/AbstractWebAppMojo.java      |  2 +-
 .../jetty/maven/plugin/JettyForker.java       | 87 +++----------------
 .../maven/plugin/NewJettyDeployMojo.java      |  8 +-
 .../maven/plugin/NewJettyEffectiveWebXml.java | 42 ++++++++-
 .../maven/plugin/QuickStartGenerator.java     | 76 +++++++++-------
 5 files changed, 98 insertions(+), 117 deletions(-)

diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractWebAppMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractWebAppMojo.java
index 16a24b22f50..84c640ec865 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractWebAppMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/AbstractWebAppMojo.java
@@ -814,7 +814,7 @@ public abstract class AbstractWebAppMojo extends AbstractMojo
         //only unpack if the overlay is newer
         if (!unpackDir.exists() || (overlay.getResource().lastModified() > unpackDir.lastModified()))
         {
-            boolean made=unpackDir.mkdirs();
+            boolean made = unpackDir.mkdirs();
             overlay.getResource().copyTo(unpackDir);
         }
 
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyForker.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyForker.java
index ba499c0154e..212abb02b7e 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyForker.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/JettyForker.java
@@ -24,14 +24,9 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.eclipse.jetty.annotations.AnnotationConfiguration;
-import org.eclipse.jetty.quickstart.QuickStartConfiguration;
-import org.eclipse.jetty.quickstart.QuickStartConfiguration.Mode;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.util.log.Log;
 import org.eclipse.jetty.util.log.Logger;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
 
 /**
  * JettyForker
@@ -55,7 +50,8 @@ public class JettyForker extends AbstractForker
     protected String contextXml;
     
     protected boolean scan;
-
+    
+    QuickStartGenerator generator;
 
     /**
      * @return the scan
@@ -139,88 +135,25 @@ public class JettyForker extends AbstractForker
 
     @Override
     public void doStart ()
-    throws Exception
+        throws Exception
     {
         //Run the webapp to create the quickstart file and properties file
-        prepareWebApp();
+        generator = new QuickStartGenerator(forkWebXml, webApp);
+        generator.setContextXml(contextXml);
+        generator.setWebAppPropsFile(webAppPropsFile);
+        generator.setServer(server);
+        generator.generate();
         super.doStart();
     }
     
-    
-    private void prepareWebApp()
-    throws Exception
-    {
-        if (server == null)
-            server = new Server();
-
-        //ensure handler structure enabled
-        ServerSupport.configureHandlers(server, null, null);
-        
-        ServerSupport.configureDefaultConfigurationClasses(server);
-               
-        if (webApp == null)
-            webApp = new JettyWebAppContext();
-        
-        //set the webapp up to do very little other than generate the quickstart-web.xml
-        webApp.addConfiguration(new MavenQuickStartConfiguration());
-        webApp.setAttribute(QuickStartConfiguration.MODE, Mode.GENERATE);
-        webApp.setAttribute(QuickStartConfiguration.QUICKSTART_WEB_XML, Resource.newResource(forkWebXml));
-        webApp.setCopyWebDir(false);
-        webApp.setCopyWebInf(false);
-
-        
-        //add webapp to our fake server instance
-        ServerSupport.addWebApplication(server, webApp);
-        
-        //leave everything unpacked for the forked process to use
-        webApp.setPersistTempDirectory(true);
-        
-        generateQuickStart();
-    }
-    
     protected void redeployWebApp ()
     throws Exception 
     {
         //regenerating the quickstart will be noticed by the JettyForkedChild process
         //which will redeploy the webapp
-        generateQuickStart();
+        generator.generate();
     }
-    
-    private void generateQuickStart()
-    throws Exception
-    {
-        if (forkWebXml == null)
-            throw new IllegalStateException ("No forkWebXml");
-        
-        if (webAppPropsFile == null)
-            throw new IllegalStateException ("no webAppsPropsFile");
-                   
-        //if our server has a thread pool associated we can do annotation scanning multithreaded,
-        //otherwise scanning will be single threaded
-        QueuedThreadPool tpool = server.getBean(QueuedThreadPool.class);
-
-        try
-        {
-            if (tpool != null)
-                tpool.start();
-            else
-                webApp.setAttribute(AnnotationConfiguration.MULTI_THREADED, Boolean.FALSE.toString());
-
-            webApp.start(); //just enough to generate the quickstart
-
-            //save config of the webapp BEFORE we stop
-            WebAppPropertyConverter.toProperties(webApp, webAppPropsFile, contextXml);
-        }
-        finally
-        {
-            webApp.stop();        
-            if (tpool != null)
-                tpool.stop();
-        }
-    }
-    
-    
-    
+ 
     public ProcessBuilder createCommand ()
     {
         List<String> cmd = new ArrayList<String>();
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyDeployMojo.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyDeployMojo.java
index 5e37158865c..f52430d2448 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyDeployMojo.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyDeployMojo.java
@@ -18,9 +18,6 @@
 
 package org.eclipse.jetty.maven.plugin;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.ResolutionScope;
@@ -53,7 +50,7 @@ public class NewJettyDeployMojo extends AbstractWebAppMojo
     protected JettyEmbedder embedder;
     protected JettyForker forker;
     protected JettyDistroForker distroForker;
-    protected Path war;
+
     
     @Override
     public void configureWebApp() throws Exception
@@ -62,8 +59,7 @@ public class NewJettyDeployMojo extends AbstractWebAppMojo
             throw new MojoExecutionException("No war specified");
 
         super.configureWebApp();
-        war = Paths.get(webApp.getWar());
-        getLog().info("War = "+war);
+        getLog().info("War = "+webApp.getWar());
     }
     
     /**
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyEffectiveWebXml.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyEffectiveWebXml.java
index 5b58b838c42..b9f6f3c88ae 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyEffectiveWebXml.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/NewJettyEffectiveWebXml.java
@@ -19,20 +19,44 @@
 
 package org.eclipse.jetty.maven.plugin;
 
+import java.io.File;
+
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.eclipse.jetty.util.StringUtil;
 
 /**
+ * Generate the effective web.xml for a pre-built webapp. This goal will NOT
+ * first build the webapp, it must already exist.
  * 
  *
  */
+@Mojo(name = "neweffective-web-xml", requiresDependencyResolution = ResolutionScope.RUNTIME)
 public class NewJettyEffectiveWebXml extends AbstractWebAppMojo
 {
+    /**
+     * The name of the file to generate into
+     */
+    @Parameter (defaultValue="${project.build.directory}/effective-web.xml")
+    protected File effectiveWebXml;
+    
+    @Override
+    public void configureWebApp() throws Exception
+    {
+        //TODO consider if we want to be able to generate for the unassembled webapp: so that we could
+        //bind this into a build phase, and have it generate the quickstart
+        if (StringUtil.isBlank(webApp.getWar()))
+            throw new MojoExecutionException("No war specified");
 
+        super.configureWebApp();
+    }
 
     @Override
     protected void startJettyEmbedded() throws MojoExecutionException
     {
-       return; //not starting a full jetty
+       generate();
     }
 
     /**
@@ -41,7 +65,7 @@ public class NewJettyEffectiveWebXml extends AbstractWebAppMojo
     @Override
     protected void startJettyForked() throws MojoExecutionException
     {
-       return; //not starting jetty this way
+       generate();
     }
 
     /**
@@ -50,7 +74,19 @@ public class NewJettyEffectiveWebXml extends AbstractWebAppMojo
     @Override
     protected void startJettyDistro() throws MojoExecutionException
     {
-      return; //not starting jetty 
+        generate();
     }
 
+    private void generate() throws MojoExecutionException
+    {
+        try
+        {
+            QuickStartGenerator generator = new QuickStartGenerator(effectiveWebXml, webApp);
+            generator.generate();
+        }
+        catch (Exception e)
+        {
+            throw new MojoExecutionException("Error generating effective web xml", e);
+        }
+    }
 }
diff --git a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/QuickStartGenerator.java b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/QuickStartGenerator.java
index 84fa52290d9..d1d35137904 100644
--- a/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/QuickStartGenerator.java
+++ b/jetty-maven-plugin/src/main/java/org/eclipse/jetty/maven/plugin/QuickStartGenerator.java
@@ -41,7 +41,20 @@ public class QuickStartGenerator
     private File webAppPropsFile;
     private String contextXml;
     private boolean prepared = false;
-    
+    private Server server;
+    private QueuedThreadPool tpool;
+   
+
+    /**
+     * @param quickstartXml the file to generate quickstart into
+     * @param webApp the webapp for which to generate quickstart
+     */
+    public QuickStartGenerator(File quickstartXml, JettyWebAppContext webApp)
+    {
+        this.quickstartXml = quickstartXml;
+        this.webApp = webApp;
+    }
+
     /**
      * @return the webApp
      */
@@ -50,14 +63,6 @@ public class QuickStartGenerator
         return webApp;
     }
 
-    /**
-     * @param webApp the webApp to set
-     */
-    public void setWebApp(JettyWebAppContext webApp)
-    {
-        this.webApp = webApp;
-    }
-
     /**
      * @return the quickstartXml
      */
@@ -65,13 +70,21 @@ public class QuickStartGenerator
     {
         return quickstartXml;
     }
+    
+    /**
+     * @return the server
+     */
+    public Server getServer()
+    {
+        return server;
+    }
 
     /**
-     * @param quickstartXml the quickstartXml to set
+     * @param server the server to set
      */
-    public void setQuickstartXml(File quickstartXml)
+    public void setServer(Server server)
     {
-        this.quickstartXml = quickstartXml;
+        this.server = server;
     }
 
     public File getWebAppPropsFile()
@@ -120,27 +133,30 @@ public class QuickStartGenerator
 
         if (!prepared)
         {
-            prepareWebApp();
             prepared = true;
+            
+            prepareWebApp();
+
+            if (server == null)
+                server = new Server();
+
+            //ensure handler structure enabled
+            ServerSupport.configureHandlers(server, null, null);
+
+            ServerSupport.configureDefaultConfigurationClasses(server);
+
+            //if our server has a thread pool associated we can do annotation scanning multithreaded,
+            //otherwise scanning will be single threaded
+            if (tpool == null)
+                tpool = server.getBean(QueuedThreadPool.class);
+
+            //add webapp to our fake server instance
+            ServerSupport.addWebApplication(server, webApp);
+
+            //leave everything unpacked for the forked process to use
+            webApp.setPersistTempDirectory(true);
         }
-        
-        Server server = new Server();
 
-        //ensure handler structure enabled
-        ServerSupport.configureHandlers(server, null, null);
-
-        ServerSupport.configureDefaultConfigurationClasses(server);
-
-        //if our server has a thread pool associated we can do annotation scanning multithreaded,
-        //otherwise scanning will be single threaded
-        QueuedThreadPool tpool = server.getBean(QueuedThreadPool.class);
-
-        //add webapp to our fake server instance
-        ServerSupport.addWebApplication(server, webApp);
-
-        //leave everything unpacked for the forked process to use
-        webApp.setPersistTempDirectory(true);
-        
         try
         {
             if (tpool != null)