Merge branch 'jetty-9.1' of ssh://git.eclipse.org/gitroot/jetty/org.eclipse.jetty.project into jetty-9.1

Conflicts:
	jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
	jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
index 55c5025..e8d7806 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Main.java
@@ -35,6 +35,7 @@
 import java.net.Socket;
 import java.net.SocketTimeoutException;
 import java.net.URL;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -504,6 +505,16 @@
             }
         }
 
+        // Enables/Disable
+        for (String module : args.getDisable())
+        {
+            disable(args,module,true);
+        }
+        for (String module : args.getEnable())
+        {
+            enable(args,module,true);
+        }
+        
         // Informational command line, don't run jetty
         if (!args.isRun())
         {
@@ -624,6 +635,102 @@
         }
     }
 
+    private void enable(StartArgs args, String name, boolean verbose) throws IOException
+    {
+        File start_d=baseHome.getFile("start.d");
+        File ini=new File(start_d,name+".ini");
+        
+        // Is it already enabled
+        if (ini.exists())
+        {
+            if (verbose)
+                StartLog.warn("Module %s already enabled by: %s",name,baseHome.toShortForm(ini));
+            return;
+        }
+        
+        // Is there a disabled ini?
+        File disabled=new File(start_d,name+".ini.disabled");
+        boolean copy=false;
+        if (!disabled.exists() && baseHome.isBaseDifferent())
+        {
+            copy=true;
+            disabled=new File(new File(baseHome.getHomeDir(),"start.d"),name+".ini.disabled");
+            if (!disabled.exists())
+                disabled=new File(new File(baseHome.getHomeDir(),"start.d"),name+".ini");
+        }
+            
+        if (disabled.exists())
+        {
+            // enable module by renaming/copying ini template
+            System.err.printf("Enabling %s in %s from %s%n",name,baseHome.toShortForm(ini),baseHome.toShortForm(disabled));
+            if (copy)
+                Files.copy(disabled.toPath(),ini.toPath());
+            else
+                disabled.renameTo(ini);
+            args.parse(baseHome, new StartIni(ini));
+        }
+        else if (args.getAllModules().resolveEnabled().contains(args.getAllModules().get(name)))
+        {
+            // No ini template and module is already enabled
+            List<String> sources=args.getSources(name);
+            if (sources!=null && sources.size()>0)
+                for (String s: args.getSources(name))
+                    StartLog.warn("Module %s is enabled in %s",name,s);
+            else
+                StartLog.warn("Module %s is already enabled (see --list-modules)",name);
+                
+        }
+        else if (ini.createNewFile())
+        {
+            System.err.printf("Enabling %s in %s%n",name,baseHome.toShortForm(ini));
+            // Create an ini
+            try(FileOutputStream out = new FileOutputStream(ini);)
+            {
+                out.write(("--module="+name+"\n").getBytes("ISO-8859-1"));
+            }
+            args.parse(baseHome, new StartIni(ini));
+        }
+        else
+        {
+            StartLog.warn("ERROR: Module %s cannot be enabled! ",name);
+            return;
+        }
+    
+        // Process dependencies
+        Modules modules = args.getAllModules();
+        Module module=modules.get(name);
+        if (module!=null)
+            for (String parent:module.getParentNames())
+                enable(args,parent,false);
+    }
+
+    private void disable(StartArgs args, String name, boolean verbose) throws IOException
+    {
+        File start_d=baseHome.getFile("start.d");
+        File ini=new File(start_d,name+".ini");
+        
+        // Is it enabled?
+        if (ini.exists())
+        {
+            File disabled=new File(start_d,name+".ini.disabled");
+            
+            if (disabled.exists())
+            {
+                StartLog.warn("ERROR: Disabled ini already exists: %s",baseHome.toShortForm(disabled));
+                return;
+            }
+
+            StartLog.warn("Disabling %s from %s",name,baseHome.toShortForm(ini));
+            ini.renameTo(disabled);
+            
+            return;
+        }
+
+        if (verbose)
+            StartLog.warn("Module %s, ini file already disabled: %s",name,baseHome.toShortForm(ini));
+        
+    }
+    
     public void usage(boolean exit)
     {
         String usageResource = "org/eclipse/jetty/start/usage.txt";
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
index 7f0ae9c..70a2861 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Modules.java
@@ -103,7 +103,12 @@
             for (String parentName : module.getParentNames())
             {
                 Module parent = get(parentName);
-                if (parent != null)
+
+                if (parent == null)
+                {
+                    System.err.printf("WARNING: module not found [%s]%n",parentName);
+                }
+                else
                 {
                     module.addParentEdge(parent);
                     parent.addChildEdge(module);
@@ -113,8 +118,11 @@
             for (String optionalParentName : module.getOptionalParentNames())
             {
                 Module optional = get(optionalParentName);
-
-                if ((optional != null) && optional.isEnabled())
+                if (optional==null)
+                {
+                    System.err.printf("WARNING: module not found [%s]%n",optionalParentName);
+                }
+                else if (optional.isEnabled())
                 {
                     module.addParentEdge(optional);
                     optional.addChildEdge(module);
@@ -301,12 +309,7 @@
 
     public Module get(String name)
     {
-        Module module = modules.get(name);
-        if (module == null)
-        {
-            System.err.printf("WARNING: module not found [%s]%n",name);
-        }
-        return module;
+        return modules.get(name);
     }
 
     @Override
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
index e47326d..1020ca7 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/StartArgs.java
@@ -146,6 +146,8 @@
     private Properties properties = new Properties();
     private Set<String> systemPropertyKeys = new HashSet<>();
     private List<String> jvmArgs = new ArrayList<>();
+    private List<String> enable = new ArrayList<>();
+    private List<String> disable = new ArrayList<>();
     private List<String> modulePersistEnable = new ArrayList<>();
     private List<String> modulePersistDisable = new ArrayList<>();
     private Modules allModules;
@@ -251,7 +253,6 @@
         dumpSystemProperty("jetty.home");
         dumpSystemProperty("jetty.base");
         dumpSystemProperty("jetty.version");
-
     }
 
     public void dumpJvmArgs()
@@ -454,7 +455,18 @@
         return this.commandLine;
     }
 
+    public List<String> getEnable()
+    {
+        return enable;
+    }
+
+    public List<String> getDisable()
+    {
+        return disable;
+    }
+
     public List<DownloadArg> getDownloads()
+
     {
         return downloads;
     }
@@ -753,6 +765,24 @@
             return;
         }
 
+        if (arg.startsWith("--enable="))
+        {
+            if (!CMD_LINE_SOURCE.equals(source))
+                throw new UsageException(ERR_BAD_ARG,"%s not allowed in %s",arg,source);
+            enable.addAll(getValues(arg));
+            run = false;
+            return;
+        }
+
+        if (arg.startsWith("--disable="))
+        {
+            if (!CMD_LINE_SOURCE.equals(source))
+                throw new UsageException(ERR_BAD_ARG,"%s not allowed in %s",arg,source);
+            disable.addAll(getValues(arg));
+            run = false;
+            return;
+        }
+
         if (arg.startsWith("--module="))
         {
             for (String moduleName : getValues(arg))