Author: taher
Date: Mon May 16 18:40:49 2016 New Revision: 1744107 URL: http://svn.apache.org/viewvc?rev=1744107&view=rev Log: major change in the start component related to OFBIZ-6783 this is a big commit that achieves the following new features in ofbiz: - add the commons-cli library - fix build.xml in start menu to include the commons-cli. It is done in a way to ensure that the classpath continues to work when ofbiz.jar is copied to the root folder - set a default portoffset value of 0 when not selected in build.xml - fully redefine the commands passed in java -jar ofbiz.jar using the commons-cli api. The commands are now much more consistent and clean - remove ofbiz dependency on String[] args across the different components and isolate them in a new entity class called StartupCommand. This decouples ofbiz from both String[] args and commons-cli at the same time - fix all the calls in the master build.xml to comply with the new commands - fix the Config.java to remove dependecies on the args array - create a utility class StartupCommandUtil that takes care of all commons-cli operations and abstracts away the implementation in private methods - substantially reduce the size of main and init in Start.java by refactoring them in different places - create an intermediate function called populateLoaderArgs. This is the first step in removing the dependecies on args by "adapting" them using this method - unify the exception model everywhere to StartupException. This makes exception propagation cleaner and easier - lots of cleanup of the code related in all these areas Big thanks to Jacques for the substantial help in testing. Added: ofbiz/trunk/framework/start/lib/ ofbiz/trunk/framework/start/lib/commons-cli-1.3.1.jar (with props) ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java (with props) ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java (with props) Modified: ofbiz/trunk/.classpath ofbiz/trunk/build.xml ofbiz/trunk/framework/start/build.xml ofbiz/trunk/framework/start/src/org/ofbiz/base/start/CommonsDaemonStart.java ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java Modified: ofbiz/trunk/.classpath URL: http://svn.apache.org/viewvc/ofbiz/trunk/.classpath?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/.classpath (original) +++ ofbiz/trunk/.classpath Mon May 16 18:40:49 2016 @@ -104,6 +104,7 @@ <classpathentry kind="lib" path="framework/service/lib/woden-core-1.0M10.jar"/> <classpathentry kind="lib" path="framework/service/lib/wsdl4j-1.6.2.jar"/> <classpathentry kind="lib" path="framework/service/lib/xmlschema-core-2.2.1.jar"/> + <classpathentry kind="lib" path="framework/start/lib/commons-cli-1.3.1.jar"/> <classpathentry kind="lib" path="framework/testtools/lib/spring-core-4.2.3.jar"/> <classpathentry kind="lib" path="framework/testtools/lib/spring-test-4.2.3.jar"/> <classpathentry kind="lib" path="framework/webapp/lib/ezmorph-0.9.1.jar"/> Modified: ofbiz/trunk/build.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/build.xml?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/build.xml (original) +++ ofbiz/trunk/build.xml Mon May 16 18:40:49 2016 @@ -32,6 +32,7 @@ under the License. <property name="site.dir" value="../site"/> <property name="memory.initial.param" value="-Xms128M"/> <property name="memory.max.param" value="-Xmx512M"/> + <property name="portoffset" value="0"/> <import file="framework/build.xml" optional="false"/> <available file="applications/build.xml" property="applications.present"/> @@ -588,8 +589,8 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="start"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--start"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-secure" @@ -601,8 +602,8 @@ under the License. <jvmarg value="-Dnotsoserial.whitelist=${ofbiz.home.dir}/tools/security/notsoserial/empty.txt"/> <jvmarg value="-Dnotsoserial.dryrun=${ofbiz.home.dir}/tools/security/notsoserial/is-deserialized.txt"/> <jvmarg value="-Dnotsoserial.trace=${ofbiz.home.dir}/tools/security/notsoserial/deserialize-trace.txt"/> - <arg value="start"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--start"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-batch" @@ -610,8 +611,8 @@ under the License. <java jar="ofbiz.jar" fork="true" spawn="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="start-batch"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--start"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-batch-secure" @@ -623,8 +624,8 @@ under the License. <jvmarg value="-Dnotsoserial.whitelist=${ofbiz.home.dir}/tools/security/notsoserial/empty.txt"/> <jvmarg value="-Dnotsoserial.dryrun=${ofbiz.home.dir}/tools/security/notsoserial/is-deserialized.txt"/> <jvmarg value="-Dnotsoserial.trace=${ofbiz.home.dir}/tools/security/notsoserial/deserialize-trace.txt"/> - <arg value="start-batch"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--start"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-debug" @@ -636,8 +637,8 @@ under the License. <jvmarg value="-Djava.compiler=NONE"/> <jvmarg value="-Xdebug"/> <jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8091"/> - <arg value="start-debug"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--start"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-pos" @@ -645,8 +646,8 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="pos"/> - <arg value="-portoffset=${portoffset}"/><!-- Not sure this makes sense and is useful at all --> + <arg value="--pos"/> + <arg value="--portoffset=${portoffset}"/><!-- Not sure this makes sense and is useful at all --> </java> </target> <target name="start-pos-secure" @@ -658,8 +659,8 @@ under the License. <jvmarg value="-Dnotsoserial.whitelist=${ofbiz.home.dir}/tools/security/notsoserial/empty.txt"/> <jvmarg value="-Dnotsoserial.dryrun=${ofbiz.home.dir}/tools/security/notsoserial/is-deserialized.txt"/> <jvmarg value="-Dnotsoserial.trace=${ofbiz.home.dir}/tools/security/notsoserial/deserialize-trace.txt"/> - <arg value="pos"/> - <arg value="-portoffset=${portoffset}"/><!-- Not sure this makes sense and is useful at all --> + <arg value="--pos"/> + <arg value="--portoffset=${portoffset}"/><!-- Not sure this makes sense and is useful at all --> </java> </target> <target name="start-both" @@ -667,8 +668,8 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="both"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--both"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="start-both-secure" @@ -680,22 +681,22 @@ under the License. <jvmarg value="-Dnotsoserial.whitelist=${ofbiz.home.dir}/tools/security/notsoserial/empty.txt"/> <jvmarg value="-Dnotsoserial.dryrun=${ofbiz.home.dir}/tools/security/notsoserial/is-deserialized.txt"/> <jvmarg value="-Dnotsoserial.trace=${ofbiz.home.dir}/tools/security/notsoserial/deserialize-trace.txt"/> - <arg value="both"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--both"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="stop" description="Stop OFBiz. Use -Dportoffset=portNumber to shift all ports with the portNumber value."> <java jar="ofbiz.jar" fork="true"> - <arg value="-shutdown"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--shutdown"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> <target name="status" description="Display status of OFBiz. Use -Dportoffset=portNumber to shift all ports with the portNumber value."> <java jar="ofbiz.jar" fork="true"> - <arg value="-status"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--status"/> + <arg value="--portoffset=${portoffset}"/> </java> </target> @@ -708,7 +709,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> </java> </target> <target name="load-demo-multitenant" depends="build" @@ -716,18 +717,18 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> </java> <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#DEMO1"/> </java> <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#DEMO2"/> </java> </target> @@ -736,7 +737,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=seed"/> </java> </target> @@ -745,7 +746,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=seed,seed-initial,ext"/> </java> </target> @@ -754,7 +755,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=seed,seed-initial,ext,ext-test"/> </java> </target> @@ -763,7 +764,7 @@ under the License. <java jar="ofbiz.jar" fork="true" > <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=${data-readers}"/> </java> </target> @@ -773,8 +774,9 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=${delegator}"/> + <arg value="--load-data"/> <arg value="file=${data-file}"/> </java> </target> @@ -788,7 +790,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=tenant"/> </java> <condition property="hasTenant"> @@ -828,7 +830,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#${tenantId}"/> </java> </target> @@ -836,8 +838,9 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#${tenantId}"/> + <arg value="--load-data"/> <arg value="readers=${data-readers}"/> </java> </target> @@ -860,8 +863,9 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#${tenantId}"/> + <arg value="--load-data"/> <arg value="component=${component}"/> </java> </target> @@ -869,9 +873,11 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=default#${tenantId}"/> + <arg value="--load-data"/> <arg value="readers=${data-readers}"/> + <arg value="--load-data"/> <arg value="component=${component}"/> </java> </target> @@ -886,7 +892,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=tenant"/> </java> <condition property="hasReader"> @@ -906,7 +912,7 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="delegator=${delegator}"/> </java> </target> @@ -914,8 +920,9 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=${data-readers}"/> + <arg value="--load-data"/> <arg value="delegator=${delegator}"/> </java> </target> @@ -1149,8 +1156,9 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="load-data"/> + <arg value="--load-data"/> <arg value="readers=${data-readers}"/> + <arg value="--load-data"/> <arg value="delegator=default#${tenantId}"/> </java> </target> @@ -1182,8 +1190,8 @@ under the License. <java jar="ofbiz.jar" fork="true" resultproperty="test.result"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="test"/> - <arg value="-portoffset=${portoffset}"/> + <arg value="--test"/> + <arg value="--portoffset=${portoffset}"/> <env key="LC_ALL" value="C"/> </java> <mkdir dir="runtime/logs/test-results/html"/> @@ -1212,9 +1220,10 @@ under the License. <java jar="ofbiz.jar" fork="true"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="testlist"/> - <arg file="runtime/test-list-build.xml"/> - <arg value="-ant"/> + <arg value="--testlist"/> + <arg value="file=runtime/test-list-build.xml"/> + <arg value="--testlist"/> + <arg value="mode=ant"/> <env key="LC_ALL" value="C"/> </java> </target> @@ -1225,9 +1234,10 @@ under the License. <java jar="ofbiz.jar" fork="true" resultproperty="test.result"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="test"/> - <arg value="-component=${test.component}"/> - <arg value="-case=${test.case}"/> + <arg value="--test"/> + <arg value="component=${test.component}"/> + <arg value="--test"/> + <arg value="case=${test.case}"/> <env key="LC_ALL" value="C"/> </java> <delete dir="runtime/logs/test-results/${test.component}-${test.case}"/> @@ -1254,9 +1264,10 @@ under the License. <jvmarg value="-Djava.compiler=NONE"/> <jvmarg value="-Xdebug"/> <jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8091"/> - <arg value="test"/> - <arg value="-component=${test.component}"/> - <arg value="-case=${test.case}"/> + <arg value="--test"/> + <arg value="component=${test.component}"/> + <arg value="--test"/> + <arg value="case=${test.case}"/> <env key="LC_ALL" value="C"/> </java> <delete dir="runtime/logs/test-results/${test.component}-${test.case}"/> @@ -1279,9 +1290,10 @@ under the License. <java jar="ofbiz.jar" fork="true" resultproperty="test.result"> <jvmarg value="${memory.initial.param}"/> <jvmarg value="${memory.max.param}"/> - <arg value="test"/> - <arg value="-component=${test.component}"/> - <arg value="-suitename=${test.suiteName}"/> + <arg value="--test"/> + <arg value="component=${test.component}"/> + <arg value="--test"/> + <arg value="suitename=${test.suiteName}"/> <env key="LC_ALL" value="C"/> </java> <fail message="Test run was unsuccessful"> Modified: ofbiz/trunk/framework/start/build.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/build.xml?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/framework/start/build.xml (original) +++ ofbiz/trunk/framework/start/build.xml Mon May 16 18:40:49 2016 @@ -29,12 +29,28 @@ under the License. <property name="name" value="ofbiz"/> <!-- ================================================================== --> + <!-- classpath setup to allow start component to access external libs --> + <!-- the setup ensures correct path when ofbiz.jar is copied to root --> + <!-- ================================================================== --> + + <path id="startlibs.absolute"> + <fileset dir="lib" includes="**/commons-cli*.jar"/> + </path> + <property name="ofbiz.absolute" location="../.."/> + <pathconvert property="startlibs.relative" refid="startlibs.absolute"> + <map from="${ofbiz.absolute}" to="."/> + </pathconvert> + <manifestclasspath property="ofbiz.jar.cp" jarfile="ofbiz.jar"> + <classpath path="${startlibs.relative}"/> + </manifestclasspath> + + <!-- ================================================================== --> <!-- Compilation of the source files --> <!-- ================================================================== --> <target name="classes" depends="prepare"> <!-- compile start --> - <javac18 destdir="${build.dir}/classes" srcdir="${src.dir}"/> + <javac18 destdir="${build.dir}/classes" srcdir="${src.dir}" classpathref="startlibs.absolute"/> </target> <target name="jar" depends="classes"> @@ -45,6 +61,7 @@ under the License. <attribute name="Implementation-Title" value="Apache OFBiz Startup"/> <attribute name="Implementation-Vendor" value="The Apache Apache OFBiz Project"/> <attribute name="Main-Class" value="org.ofbiz.base.start.Start"/> + <attribute name="Class-Path" value="${ofbiz.jar.cp}"/> </manifest> </main-elements> </main-jar> Added: ofbiz/trunk/framework/start/lib/commons-cli-1.3.1.jar URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/lib/commons-cli-1.3.1.jar?rev=1744107&view=auto ============================================================================== Binary file - no diff available. Propchange: ofbiz/trunk/framework/start/lib/commons-cli-1.3.1.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/CommonsDaemonStart.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/CommonsDaemonStart.java?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/CommonsDaemonStart.java (original) +++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/CommonsDaemonStart.java Mon May 16 18:40:49 2016 @@ -30,7 +30,7 @@ public final class CommonsDaemonStart { } public void init(String[] args) throws StartupException { - Start.getInstance().init(args, true); + Start.getInstance().init(StartupCommandUtil.parseOfbizCommands(args)); } public void destroy() { Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java (original) +++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java Mon May 16 18:40:49 2016 @@ -24,12 +24,14 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Properties; import java.util.TimeZone; @@ -52,24 +54,30 @@ public class Config { public final String classpathAddComponent; public final String classpathAddFilesFromPath; - Config(String[] args) throws IOException { - String firstArg = args.length > 0 ? args[0] : ""; - // Needed when portoffset is used with these commands, start.properties fits for all of them - if ("start-batch".equalsIgnoreCase(firstArg) - || "start-debug".equalsIgnoreCase(firstArg) - || "stop".equalsIgnoreCase(firstArg) - || "-shutdown".equalsIgnoreCase(firstArg) // shutdown & status hack (was pre-existing to portoffset introduction, also useful with it) - || "-status".equalsIgnoreCase(firstArg)) { - firstArg = "start"; - } - // default command is "start" - if (firstArg == null || firstArg.trim().length() == 0) { - firstArg = "start"; + Config(List<StartupCommand> ofbizCommands) throws StartupException { + String fileName = determineOfbizPropertiesFileName(ofbizCommands); + String config = "org/ofbiz/base/start/" + fileName + ".properties"; + Properties props; + try { + props = this.getPropertiesFile(config); + } catch (IOException e) { + throw new StartupException(e); } - String config = "org/ofbiz/base/start/" + firstArg + ".properties"; - - Properties props = this.getPropertiesFile(config); System.out.println("Start.java using configuration file " + config); + + // set portOffsetValue + int portOffsetValue = 0; + Optional<StartupCommand> portOffsetCommand = ofbizCommands.stream() + .filter(command -> command.getName().equals(StartupCommandUtil.StartupOption.PORTOFFSET.getName())) + .findFirst(); + if(portOffsetCommand.isPresent()) { + Map<String,String> commandArgs = portOffsetCommand.get().getProperties(); + try { + portOffsetValue = Integer.parseInt(commandArgs.keySet().iterator().next()); + } catch(NumberFormatException e) { + throw new StartupException("invalid portoffset number", e); + } + } // set the ofbiz.home String ofbizHomeTmp = props.getProperty("ofbiz.home", "."); @@ -98,20 +106,18 @@ public class Config { adminKey = getProp(props, "ofbiz.admin.key", "NA"); // create the host InetAddress - adminAddress = InetAddress.getByName(serverHost); + try { + adminAddress = InetAddress.getByName(serverHost); + } catch (UnknownHostException e) { + throw new StartupException(e); + } // parse the port number int adminPortTmp; try { adminPortTmp = Integer.parseInt(adminPortStr); - if (args.length > 0) { - for (String arg : args) { - if (arg.toLowerCase().contains("portoffset=") && !arg.toLowerCase().contains("${portoffset}")) { - adminPortTmp = adminPortTmp != 0 ? adminPortTmp : 10523; // This is necessary because the ASF machines don't allow ports 1 to 3, see INFRA-6790 - adminPortTmp += Integer.parseInt(arg.split("=")[1]); - } - } - } + adminPortTmp = adminPortTmp != 0 ? adminPortTmp : 10523; // This is necessary because the ASF machines don't allow ports 1 to 3, see INFRA-6790 + adminPortTmp += portOffsetValue; } catch (Exception e) { System.out.println("Error while parsing admin port number (so default to 10523) = " + e); adminPortTmp = 10523; @@ -195,33 +201,37 @@ public class Config { loaders = Collections.unmodifiableList(loadersTmp); // set the port offset - Integer portOffset = 0; - if (args != null) { - for (String argument : args) { - // arguments can prefix w/ a '-'. Just strip them off - if (argument.startsWith("-")) { - int subIdx = 1; - if (argument.startsWith("--")) { - subIdx = 2; - } - argument = argument.substring(subIdx); - } - // parse the arguments - if (argument.indexOf("=") != -1) { - String argumentName = argument.substring(0, argument.indexOf("=")); - String argumentVal = argument.substring(argument.indexOf("=") + 1); - if ("portoffset".equalsIgnoreCase(argumentName) && !"${portoffset}".equals(argumentVal)) { - try { - portOffset = Integer.valueOf(argumentVal); - } catch (NumberFormatException e) { - System.out.println("Error while parsing portoffset (the default value 0 will be used) = " + e); - } - } - } - } - } - this.portOffset = portOffset; + this.portOffset = portOffsetValue; + } + private String determineOfbizPropertiesFileName(List<StartupCommand> ofbizCommands) { + String fileName = null; + if (ofbizCommands.stream().anyMatch(command -> + command.getName() == StartupCommandUtil.StartupOption.START.getName() + || command.getName() == StartupCommandUtil.StartupOption.SHUTDOWN.getName() + || command.getName() == StartupCommandUtil.StartupOption.STATUS.getName() ) + || ofbizCommands.isEmpty() + || ofbizCommands.stream().allMatch(command -> + command.getName() == StartupCommandUtil.StartupOption.PORTOFFSET.getName()) + ){ + fileName = "start"; + } else if(ofbizCommands.stream().anyMatch( + option -> option.getName() == StartupCommandUtil.StartupOption.BOTH.getName())) { + fileName = "both"; + } else if(ofbizCommands.stream().anyMatch( + option -> option.getName() == StartupCommandUtil.StartupOption.LOAD_DATA.getName())) { + fileName = "load-data"; + } else if(ofbizCommands.stream().anyMatch( + option -> option.getName() == StartupCommandUtil.StartupOption.POS.getName())) { + fileName = "pos"; + } else if(ofbizCommands.stream().anyMatch( + option -> option.getName() == StartupCommandUtil.StartupOption.TEST.getName())) { + fileName = "test"; + } else if(ofbizCommands.stream().anyMatch( + option -> option.getName() == StartupCommandUtil.StartupOption.TEST_LIST.getName())) { + fileName = "testlist"; + } + return fileName; } private String getOfbizHomeProp(Properties props, String key, String def) { Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java?rev=1744107&r1=1744106&r2=1744107&view=diff ============================================================================== --- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java (original) +++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Start.java Mon May 16 18:40:49 2016 @@ -23,30 +23,32 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.io.PrintStream; import java.io.PrintWriter; import java.net.ConnectException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; /** * OFBiz startup class. * + * <p> * This class implements a thread-safe state machine. The design is critical * for reliable starting and stopping of the server. - * + * </p> + * <p> * The machine's current state and state changes must be encapsulated in this * class. Client code may query the current state, but it may not change it. - * + * </p> + * <p> * This class uses a singleton pattern to guarantee that only one server instance - * is running in the VM. Client code retrieves the instance by using the getInstance() - * static method. - * + * is running in the VM. Client code retrieves the instance by using the + * <tt>getInstance()</tt> static method. + * </p> */ public final class Start { @@ -66,29 +68,37 @@ public final class Start { * such as starting, stopping or checking the status of the server. * * @param args: The commands for ofbiz - * @throws StartupException: propagates to the servlet container + * @throws StartupException: terminates ofbiz or propagates to caller */ public static void main(String[] args) throws StartupException { - Command command = evaluateOfbizCommand(args); - if (command == Command.HELP) { - help(System.out); - return; - } else if (command == Command.HELP_ERROR) { - help(System.err); + List<StartupCommand> ofbizCommands = null; + try { + ofbizCommands = StartupCommandUtil.parseOfbizCommands(args); + } catch (StartupException e) { + // incorrect arguments passed to the command line + System.err.println("Error: " + e.getMessage() + System.lineSeparator()); + StartupCommandUtil.printOfbizStartupHelp(System.err); System.exit(1); } - instance.init(args, command == Command.COMMAND); - try { - if (command == Command.STATUS) { + + CommandType commandType = evaluateOfbizCommands(ofbizCommands); + if(commandType != CommandType.HELP) { + instance.init(ofbizCommands); + } + switch (commandType) { + case HELP: + StartupCommandUtil.printOfbizStartupHelp(System.out); + break; + case STATUS: System.out.println("Current Status : " + instance.status()); - } else if (command == Command.SHUTDOWN) { + break; + case SHUTDOWN: System.out.println("Shutting down server : " + instance.shutdown()); - } else { - // general start + break; + case START: + populateLoaderArgs(ofbizCommands); instance.start(); - } - } catch (Exception e) { - throw new StartupException(e); + break; } } @@ -125,48 +135,16 @@ public final class Start { } } - void init(String[] args, boolean fullInit) throws StartupException { - String globalSystemPropsFileName = System.getProperty("ofbiz.system.props"); - if (globalSystemPropsFileName != null) { - FileInputStream stream = null; - try { - stream = new FileInputStream(globalSystemPropsFileName); - System.getProperties().load(stream); - } catch (IOException e) { - throw new StartupException("Couldn't load global system props", e); - } finally { - if (stream != null) { - try { - stream.close(); - } catch (IOException e) { - throw new StartupException("Couldn't close stream", e); - } - } - } - } + void init(List<StartupCommand> ofbizCommands) throws StartupException { + loadGlobalOfbizSystemProperties("ofbiz.system.props"); try { - this.config = new Config(args); - } catch (IOException e) { - throw new StartupException("Couldn't not fetch config instance", e); - } - // parse the startup arguments - if (args.length > 1) { - this.loaderArgs.addAll(Arrays.asList(args).subList(1, args.length)); - // Needed when portoffset is used with these commands - try { - if ("status".equals(args[0])) { - System.out.println("Current Status : " + instance.status()); - } else if ("stop".equals(args[0])) { - System.out.println("Shutting down server : " + instance.shutdown()); - } - } catch (Exception e) { - e.printStackTrace(); - System.exit(99); - } - } - if (!fullInit) { - return; + this.config = new Config(ofbizCommands); + } catch (StartupException e) { + throw new StartupException("Could not fetch config instance", e); } + } + + void start() throws StartupException { // create the log directory createLogDirectory(); // create the listener thread @@ -185,14 +163,11 @@ public final class Start { // initialize the startup loaders initStartLoaders(); - } - - void start() throws Exception { if (!startStartLoaders()) { if (this.serverState.get() == ServerState.STOPPING) { return; } else { - throw new Exception("Error during start."); + throw new StartupException("Error during start."); } } if (config.shutdownAfterLoad) { @@ -231,58 +206,81 @@ public final class Start { System.exit(0); } - private static Command evaluateOfbizCommand(String[] args) { - Command command = null; - for (String arg : args) { - if (arg.equals("-help") || arg.equals("-?")) { - command = checkCommand(command, Command.HELP); - } else if (arg.equals("-status")) { - command = checkCommand(command, Command.STATUS); - } else if (arg.equals("-shutdown")) { - command = checkCommand(command, Command.SHUTDOWN); - } else if (arg.startsWith("-")) { - if (!arg.contains("portoffset")) { - command = checkCommand(command, Command.COMMAND); - } - } else { - command = checkCommand(command, Command.COMMAND); - if (command == Command.COMMAND) { - } else { - command = Command.HELP_ERROR; + private static CommandType evaluateOfbizCommands(List<StartupCommand> ofbizCommands) { + if (ofbizCommands.stream().anyMatch( + command -> command.getName().equals(StartupCommandUtil.StartupOption.HELP.getName()))) { + return CommandType.HELP; + } else if (ofbizCommands.stream().anyMatch( + command -> command.getName().equals(StartupCommandUtil.StartupOption.STATUS.getName()))) { + return CommandType.STATUS; + } else if (ofbizCommands.stream().anyMatch( + command -> command.getName().equals(StartupCommandUtil.StartupOption.SHUTDOWN.getName()))) { + return CommandType.SHUTDOWN; + } else { + return CommandType.START; + } + } + + private enum CommandType { + HELP, STATUS, SHUTDOWN, START + } + + private void loadGlobalOfbizSystemProperties(String globalOfbizPropertiesFileName) throws StartupException { + String globalSystemPropsFileName = System.getProperty(globalOfbizPropertiesFileName); + if (globalSystemPropsFileName != null) { + FileInputStream stream = null; + try { + stream = new FileInputStream(globalSystemPropsFileName); + System.getProperties().load(stream); + } catch (IOException e) { + throw new StartupException("Couldn't load global system props", e); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + throw new StartupException("Couldn't close stream", e); + } } } } - if (command == null) { - command = Command.COMMAND; - } - return command; } - private static Command checkCommand(Command command, Command wanted) { - if (wanted == Command.HELP || wanted.equals(command)) { - return wanted; - } else if (command == null) { - return wanted; - } else { - System.err.println("Duplicate command detected(was " + command + ", wanted " + wanted); - return Command.HELP_ERROR; + /** + * populates the loaderArgs with arguments as expected by the + * containers that will receive them. + * + * TODO A better solution is to change the signature of all + * containers to receive a <tt>List</tt> of <tt>StartupCommand</tt>s + * instead and delete the methods populateLoaderArgs, commandExistsInList + * and retrieveCommandArgumentEntries along with the loaderArgs list. + */ + private static void populateLoaderArgs(List<StartupCommand> ofbizCommands) { + final String LOAD_DATA = StartupCommandUtil.StartupOption.LOAD_DATA.getName(); + final String TEST = StartupCommandUtil.StartupOption.TEST.getName(); + final String TEST_LIST = StartupCommandUtil.StartupOption.TEST_LIST.getName(); + + if(commandExistsInList(ofbizCommands, LOAD_DATA)) { + retrieveCommandArguments(ofbizCommands, LOAD_DATA).entrySet().stream().forEach(entry -> + instance.loaderArgs.add("-" + entry.getKey() + "=" + entry.getValue())); + } else if(commandExistsInList(ofbizCommands, TEST)) { + retrieveCommandArguments(ofbizCommands, TEST).entrySet().stream().forEach(entry -> + instance.loaderArgs.add("-" + entry.getKey() + "=" + entry.getValue())); + } else if(commandExistsInList(ofbizCommands, TEST_LIST)) { + Map<String,String> testListArgs = retrieveCommandArguments(ofbizCommands, TEST_LIST); + instance.loaderArgs.add(testListArgs.get("file")); + instance.loaderArgs.add("-" + testListArgs.get("mode")); } } - private static void help(PrintStream out) { - // Currently some commands have no dash, see OFBIZ-5872 - out.println(""); - out.println("Usage: java -jar ofbiz.jar [command] [arguments]"); - out.println("both -----> Runs simultaneously the POS (Point of Sales) application and OFBiz standard"); - out.println("-help, -? ----> This screen"); - out.println("load-data -----> Creates tables/load data, eg: load-data -readers=seed,demo,ext -timeout=7200 -delegator=default -group=org.ofbiz. Or: load-data -file=/tmp/dataload.xml"); - out.println("pos -----> Runs the POS (Point of Sales) application"); - out.println("start -------> Starts the server"); - out.println("-status ------> Gives the status of the server"); - out.println("-shutdown ----> Shutdowns the server"); - out.println("test --------> Runs the JUnit test script"); - out.println("[no config] --> Uses default config"); - out.println("[no command] -> Starts the server with default config"); + private static boolean commandExistsInList(List<StartupCommand> ofbizCommands, String commandName) { + return ofbizCommands.stream().anyMatch(command -> command.getName().equals(commandName)); + } + + private static Map<String,String> retrieveCommandArguments(List<StartupCommand> ofbizCommands, String commandName) { + return ofbizCommands.stream() + .filter(option-> option.getName().equals(commandName)) + .collect(Collectors.toList()).get(0).getProperties(); } private void createListenerThread() throws StartupException { @@ -303,12 +301,6 @@ public final class Start { } } - /** - * Creates a new <code>NativeLibClassLoader</code> instance. - * - * @return A new <code>NativeLibClassLoader</code> instance - * @throws IOException - */ private NativeLibClassLoader createClassLoader() throws IOException { ClassLoader parent = Thread.currentThread().getContextClassLoader(); if (parent instanceof NativeLibClassLoader) { @@ -426,13 +418,15 @@ public final class Start { return response; } - private String shutdown() throws IOException { - return sendSocketCommand(Control.SHUTDOWN); + private String shutdown() throws StartupException { + try { + return sendSocketCommand(Control.SHUTDOWN); + } catch (Exception e) { + throw new StartupException(e); + } } /** - * Returns <code>true</code> if all loaders were started. - * * @return <code>true</code> if all loaders were started. */ private boolean startStartLoaders() { @@ -453,13 +447,13 @@ public final class Start { return this.serverState.compareAndSet(ServerState.STARTING, ServerState.RUNNING); } - private String status() throws IOException { + private String status() throws StartupException { try { return sendSocketCommand(Control.STATUS); } catch (ConnectException e) { return "Not Running"; } catch (IOException e) { - throw e; + throw new StartupException(e); } } @@ -527,10 +521,6 @@ public final class Start { } } - private enum Command { - HELP, HELP_ERROR, STATUS, SHUTDOWN, COMMAND - } - private enum Control { SHUTDOWN { @Override Added: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java?rev=1744107&view=auto ============================================================================== --- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java (added) +++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java Mon May 16 18:40:49 2016 @@ -0,0 +1,49 @@ +package org.ofbiz.base.start; + +import java.util.Map; + +/** + * A command line argument passed to ofbiz + * + * <p> + * A <tt>StartupCommand</tt> represents a processed command line argument passed + * to ofbiz such that it is no longer a raw string but an instance of this class. + * For example: <code>java -jar ofbiz.jar --status</code> where status is a command. + * </p> + */ +public class StartupCommand { + private String name; + private Map<String,String> properties; + + public String getName() { + return name; + } + public Map<String,String> getProperties() { + return properties; + } + + private StartupCommand(Builder builder) { + this.name = builder.name; + this.properties = builder.properties; + } + + public static class Builder { + //required parameters + private final String name; + + //optional parameters + private Map<String,String> properties; + + public Builder(String name) { + this.name = name; + } + public Builder properties(Map<String,String> properties) { + this.properties = properties; + return this; + } + + public StartupCommand build() { + return new StartupCommand(this); + } + } +} Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommand.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java?rev=1744107&view=auto ============================================================================== --- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java (added) +++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java Mon May 16 18:40:49 2016 @@ -0,0 +1,237 @@ +package org.ofbiz.base.start; + +import java.io.PrintStream; +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.OptionGroup; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +/** + * A utility class for processing OFBiz command line arguments + * + * <p> + * Defines OFBiz startup options called through main e.g. --load-data or --help + * in addition to utility methods for parsing and handling these options + * </p> + */ +public final class StartupCommandUtil { + + /* + * Make sure of defining the same set of values in: + * + * - The StartupOptions in the StartupOption enum + * - The commons-cli options (e.g. BOTH, HELP, etc ...) + * - The getOfbizStartupOptions method + * + * Keeping these items in sync means that OFBiz behaves correctly + * while being decoupled from the commons-cli library and the only + * place where commons-cli is used is in this class + */ + + public enum StartupOption { + BOTH("both"), + HELP("help"), + LOAD_DATA("load-data"), + PORTOFFSET("portoffset"), + POS("pos"), + SHUTDOWN("shutdown"), + START("start"), + STATUS("status"), + TEST("test"), + TEST_LIST("testlist"); + + private String name; + private StartupOption(String name) { + this.name = name; + } + public String getName() { + return name; + } + } + + private static final Option BOTH = Option.builder("b") + .longOpt(StartupOption.BOTH.getName()) + .desc("Runs simultaneously both the POS (Point of Sales) application and OFBiz server") + .hasArg(false) + .build(); + private static final Option HELP = Option.builder("?") + .longOpt(StartupOption.HELP.getName()) + .desc("Prints this help screen to the user") + .hasArg(false) + .build(); + private static final Option LOAD_DATA = Option.builder("l") + .longOpt(StartupOption.LOAD_DATA.getName()) + .desc("Creates tables/load data e.g:" + + System.lineSeparator() + + "-l readers=seed,demo,ext" + + System.lineSeparator() + + "-l timeout=7200" + + System.lineSeparator() + + "-l delegator=default" + + System.lineSeparator() + + "-l group=org.ofbiz" + + System.lineSeparator() + + "-l dir=directory/of/files" + + System.lineSeparator() + + "-l file=/tmp/dataload.xml") + .numberOfArgs(2) + .valueSeparator('=') + .optionalArg(true) + .argName("key=value") + .build(); + private static final Option PORTOFFSET = Option.builder("o") + .longOpt(StartupOption.PORTOFFSET.getName()) + .desc("Offsets the default network port for OFBiz") + .hasArg() + .argName("offset") + .optionalArg(false) + .build(); + private static final Option POS = Option.builder("p") + .longOpt(StartupOption.POS.getName()) + .desc("Runs the POS (Point of Sales) application") + .hasArg(false) + .build(); + private static final Option SHUTDOWN = Option.builder("d") + .longOpt(StartupOption.SHUTDOWN.getName()) + .desc("Shutdown OFBiz") + .hasArg(false) + .build(); + private static final Option START = Option.builder("u") + .longOpt(StartupOption.START.getName()) + .desc("Start OFBiz") + .hasArg(false) + .build(); + private static final Option STATUS = Option.builder("s") + .longOpt(StartupOption.STATUS.getName()) + .desc("Gives the status of OFBiz") + .hasArg(false) + .build(); + private static final Option TEST = Option.builder("t") + .longOpt(StartupOption.TEST.getName()) + .desc("Runs the selected test or all if none selected e.g.: " + + System.lineSeparator() + + "--test component=base --test case=somecase" + + System.lineSeparator() + + "--test component=base --test suitename=somesuite") + .numberOfArgs(2) + .valueSeparator('=') + .optionalArg(true) + .argName("key=value") + .build(); + private static final Option TEST_LIST = Option.builder("x") + .longOpt(StartupOption.TEST_LIST.getName()) + .desc("Generates an ant build script or a text file of all tests in ofbiz." + + System.lineSeparator() + + "The ant build script can run all test suites in isolation." + + System.lineSeparator() + + "The text file contains all tests in the format <component>:<suite-name>." + + System.lineSeparator() + + "The file arg determines the output file, and mode determines ant or text e.g:" + + System.lineSeparator() + + "--testlist file=runtime/test-list-build.xml" + + System.lineSeparator() + + "--testlist mode=ant or --testlist mode=text") + .numberOfArgs(2) + .valueSeparator('=') + .argName("key=value") + .build(); + + static final List<StartupCommand> parseOfbizCommands(final String[] args) throws StartupException { + CommandLine commandLine = null; + CommandLineParser parser = new DefaultParser(); + try { + commandLine = parser.parse(StartupCommandUtil.getOfbizStartupOptions(), args); + } catch (ParseException e) { + throw new StartupException(e.getMessage()); + } + if(!commandLine.getArgList().isEmpty()) { + throw new StartupException("unrecognized options / properties: " + commandLine.getArgList()); + } + validateAllCommandArguments(commandLine); + return mapCommonsCliOptionsToStartupCommands(commandLine); + } + + static final void printOfbizStartupHelp(final PrintStream printStream) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( + new PrintWriter(printStream, true), + HelpFormatter.DEFAULT_WIDTH, + "java -jar ofbiz.jar", + System.lineSeparator() + "Executes OFBiz command e.g. start, shutdown, check status, etc", + getOfbizStartupOptions(), + HelpFormatter.DEFAULT_LEFT_PAD, + HelpFormatter.DEFAULT_DESC_PAD, + "note: Only one command can execute at a time. Portoffset may be appended", + true); + } + + private static final List<StartupCommand> mapCommonsCliOptionsToStartupCommands(final CommandLine commandLine) { + List<Option> optionList = Arrays.asList(commandLine.getOptions()); + return optionList.stream() + .map(option -> new StartupCommand.Builder(option.getLongOpt()) + .properties(populateMapFromProperties(commandLine.getOptionProperties(option.getLongOpt()))) + .build()) + .collect(Collectors.toList()); + } + + private static final Map<String,String> populateMapFromProperties(final Properties properties) { + return properties.entrySet().stream().collect(Collectors.toMap( + entry -> String.valueOf(entry.getKey()), + entry -> String.valueOf(entry.getValue()))); + } + + private static final void validateAllCommandArguments(CommandLine commandLine) throws StartupException { + // TEST_LIST validation + if(commandLine.hasOption(StartupOption.TEST_LIST.getName())) { + Properties optionProperties = commandLine.getOptionProperties(StartupOption.TEST_LIST.getName()); + if(!optionProperties.containsKey("file") + || !optionProperties.containsKey("mode") ) { + throw new StartupException("You must pass both file and mode arguments to --" + StartupOption.TEST_LIST.getName()); + } else if (!optionProperties.get("mode").toString().equals("text") + && !optionProperties.get("mode").toString().equals("ant")) { + throw new StartupException("mode only accepts text or ant in the option --" + StartupOption.TEST_LIST.getName()); + } + // PORTOFFSET validation + } else if(commandLine.hasOption(StartupOption.PORTOFFSET.getName())) { + Properties optionProperties = commandLine.getOptionProperties(StartupOption.PORTOFFSET.getName()); + try { + int portOffset = Integer.parseInt(optionProperties.keySet().iterator().next().toString()); + if(portOffset < 0) { + throw new StartupException("you can only pass positive integers to the option --" + StartupOption.PORTOFFSET.getName()); + } + } catch (NumberFormatException e) { + throw new StartupException("you can only pass positive integers to the option --" + StartupOption.PORTOFFSET.getName(), e); + } + } + //TODO add more validations + } + + private static final Options getOfbizStartupOptions() { + OptionGroup ofbizCommandOptions = new OptionGroup(); + ofbizCommandOptions.addOption(BOTH); + ofbizCommandOptions.addOption(HELP); + ofbizCommandOptions.addOption(LOAD_DATA); + ofbizCommandOptions.addOption(POS); + ofbizCommandOptions.addOption(SHUTDOWN); + ofbizCommandOptions.addOption(START); + ofbizCommandOptions.addOption(STATUS); + ofbizCommandOptions.addOption(TEST); + ofbizCommandOptions.addOption(TEST_LIST); + + Options options = new Options(); + options.addOptionGroup(ofbizCommandOptions); + options.addOption(PORTOFFSET); + return options; + } +} Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/StartupCommandUtil.java ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |