You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ch...@apache.org on 2013/11/13 12:51:03 UTC

svn commit: r1541482 - in /sling/trunk/launchpad/base/src: main/java/org/apache/sling/launchpad/app/Main.java test/java/org/apache/sling/launchpad/app/MainTest.java

Author: chetanm
Date: Wed Nov 13 11:51:02 2013
New Revision: 1541482

URL: http://svn.apache.org/r1541482
Log:
SLING-3231 - Not able to set multiple framework property via command line args

Fixed support for passing multiple options like -Dkey=value

Modified:
    sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/app/Main.java
    sling/trunk/launchpad/base/src/test/java/org/apache/sling/launchpad/app/MainTest.java

Modified: sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/app/Main.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/app/Main.java?rev=1541482&r1=1541481&r2=1541482&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/app/Main.java (original)
+++ sling/trunk/launchpad/base/src/main/java/org/apache/sling/launchpad/app/Main.java Wed Nov 13 11:51:02 2013
@@ -488,7 +488,7 @@ public class Main {
      * <li>Default value <code>sling</code></li>
      * </ol>
      *
-     * @param args The command line arguments
+     * @param commandLine The command line arguments
      * @return The value to use for sling.home
      */
     private static String getSlingHome(Map<String, String> commandLine) {
@@ -643,12 +643,32 @@ public class Main {
                 } else {
                     String key = String.valueOf(arg.charAt(1));
                     if (arg.length() > 2) {
-                        commandLine.put(key, arg.substring(2));
+                        final String val;
+                        final int indexOfEq = arg.indexOf('=');
+                        if (indexOfEq != -1) {
+                            //Handle case -Da=b
+                            key = arg.substring(1, indexOfEq);
+                            val = arg.substring(indexOfEq + 1);
+                        } else {
+                            val = arg.substring(2);
+                        }
+                        commandLine.put(key, val);
                     } else {
                         argc++;
                         if (argc < args.length
                             && (args[argc].equals("-") || !args[argc].startsWith("-"))) {
-                            commandLine.put(key, args[argc]);
+                            String val = args[argc];
+
+                            //Special handling for -D a=b
+                            if(key.equals("D")){
+                                final int indexOfEq = val.indexOf('=');
+                                if (indexOfEq != -1) {
+                                    //Handle case -D a=b. Add key as Da
+                                    key = "D" + val.substring(0, indexOfEq);
+                                    val = val.substring(indexOfEq + 1);
+                                }
+                            }
+                            commandLine.put(key, val);
                         } else {
                             commandLine.put(key, key);
                             argc--;
@@ -667,7 +687,7 @@ public class Main {
         if (args.remove("h") != null) {
             System.out.println("usage: "
                 + Main.class.getName()
-                + " [ start | stop | status ] [ -j adr ] [ -l loglevel ] [ -f logfile ] [ -c slinghome ] [ -i launchpadhome ] [ -a address ] [ -p port ] { -D n=v } [ -h ]");
+                + " [ start | stop | status ] [ -j adr ] [ -l loglevel ] [ -f logfile ] [ -c slinghome ] [ -i launchpadhome ] [ -a address ] [ -p port ] { -Dn=v } [ -h ]");
 
             System.out.println("    start         listen for control connection (uses -j)");
             System.out.println("    stop          terminate running Apache Sling (uses -j)");
@@ -681,7 +701,9 @@ public class Main {
             System.out.println("    -p port       the port to listen to (default 8080)");
             System.out.println("    -r path       the root servlet context path for the http service (default is /)");
             System.out.println("    -n            don't install the shutdown hook");
-            System.out.println("    -D n=v        sets property n to value v");
+            System.out.println("    -Dn=v         sets property n to value v. Make sure to use this option *after* " +
+                                                  "the jar filename. The JVM also has a -D option which has a " +
+                                                  "different meaning");
             System.out.println("    -h            prints this usage message");
 
             return true;
@@ -704,7 +726,7 @@ public class Main {
         final HashMap<String, String> props = new HashMap<String, String>();
         boolean errorArg = false;
         for (Entry<String, String> arg : rawArgs.entrySet()) {
-            if (arg.getKey().length() == 1) {
+            if (arg.getKey().length() == 1 || arg.getKey().startsWith("D")) {
                 String value = arg.getValue();
                 switch (arg.getKey().charAt(0)) {
                     case 'j':
@@ -798,9 +820,15 @@ public class Main {
                             errorArg = true;
                             continue;
                         }
-                        String[] parts = value.split("=");
-                        int valueIdx = (parts.length > 1) ? 1 : 0;
-                        props.put(parts[0], parts[valueIdx]);
+                        if (arg.getKey().length() > 1) {
+                            //Dfoo=bar arg.key=Dfoo and arg.value=bar
+                            props.put(arg.getKey().substring(1), arg.getValue());
+                        } else {
+                            //D foo=bar arg.key=D and arg.value=foo=bar
+                            String[] parts = value.split("=");
+                            int valueIdx = (parts.length > 1) ? 1 : 0;
+                            props.put(parts[0], parts[valueIdx]);
+                        }
                         break;
 
                     default:

Modified: sling/trunk/launchpad/base/src/test/java/org/apache/sling/launchpad/app/MainTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/test/java/org/apache/sling/launchpad/app/MainTest.java?rev=1541482&r1=1541481&r2=1541482&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/test/java/org/apache/sling/launchpad/app/MainTest.java (original)
+++ sling/trunk/launchpad/base/src/test/java/org/apache/sling/launchpad/app/MainTest.java Wed Nov 13 11:51:02 2013
@@ -24,7 +24,6 @@ import java.util.HashMap;
 import java.util.Map;
 
 import junit.framework.TestCase;
-
 import org.apache.sling.launchpad.base.shared.SharedConstants;
 
 public class MainTest extends TestCase {
@@ -63,11 +62,11 @@ public class MainTest extends TestCase {
         assertEquals("commandline map must have one entry", 1,
             commandline.size());
         assertEquals("single argument must be " + args[0].charAt(1),
-            String.valueOf(args[0].charAt(1)),
-            commandline.keySet().iterator().next());
+                String.valueOf(args[0].charAt(1)),
+                commandline.keySet().iterator().next());
         assertEquals("single argument value must be " + args[0].charAt(1),
-            String.valueOf(args[0].charAt(1)),
-            commandline.values().iterator().next());
+                String.valueOf(args[0].charAt(1)),
+                commandline.values().iterator().next());
     }
 
     public void test_parseCommandLine_single_arg_with_par() {
@@ -128,7 +127,7 @@ public class MainTest extends TestCase {
         Map<String, String> commandline = Main.parseCommandLine(args);
         assertNotNull("commandline map must not be null", commandline);
         assertEquals("commandline map must have three entries", 3,
-            commandline.size());
+                commandline.size());
         assertEquals("argument a must apar", "apar", commandline.get("a"));
         assertEquals("argument -b must -b", "-b", commandline.get("-b"));
         assertEquals("argument bpar must bpar", "bpar", commandline.get("bpar"));
@@ -360,6 +359,24 @@ public class MainTest extends TestCase {
         assertEquals(Boolean.TRUE.toString(), props1.get("sling.shutdown.hook"));
     }
 
+    public void test_converCommandLineArgs_multi_D() {
+        String[] args = {"-Da1=b1", "-Da2=b2"};
+        Map<String, String> commandline = Main.parseCommandLine(args);
+        Map<String, String> props = Main.convertCommandLineArgs(commandline);
+        assertEquals(2, props.size());
+        assertEquals("b1", props.get("a1"));
+        assertEquals("b2", props.get("a2"));
+    }
+
+    public void test_converCommandLineArgs_multi_D_with_space() {
+        String[] args = {"-D", "a1=b1", "-D", "a2=b2"};
+        Map<String, String> commandline = Main.parseCommandLine(args);
+        Map<String, String> props = Main.convertCommandLineArgs(commandline);
+        assertEquals(2, props.size());
+        assertEquals("b1", props.get("a1"));
+        assertEquals("b2", props.get("a2"));
+    }
+
     public void test_converCommandLineArgs_D() {
         Map<String, String> props = Main.convertCommandLineArgs(new HashMap<String, String>() {
             {