You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by js...@apache.org on 2002/10/04 13:28:20 UTC

cvs commit: jakarta-commons-sandbox/jelly maven.xml project.xml

jstrachan    2002/10/04 04:28:20

  Modified:    jelly/src/java/org/apache/commons/jelly Jelly.java
               jelly    maven.xml project.xml
  Added:       jelly/src/test/org/apache/commons/jelly
                        testCmdLineOptions.jelly
  Log:
  Committed patches submitted by Jason Horman to provide a decent command line interface using commons-cli to Jelly.
  
  So usage is like this...
  Usage: jelly [scriptFile] [-script scriptFile -o outputFile  -Dsysprop=syspropval]
  
  Additional command line options are available in jelly scripts by using the
  commandLine.getOptionValue(optionName) method. Args is also still available.
  
  context.setVariable("args", args);
  context.setVariable("commandLine", cmdLine);
  
  
  Also there's a sample target to demonstrate this in action. Type
  
  	maven demo:cmdline
  
  and you'll see Jason's test script run, using beanshell in a Jelly script to display the options and system properties etc.
  
  Revision  Changes    Path
  1.1                  jakarta-commons-sandbox/jelly/src/test/org/apache/commons/jelly/testCmdLineOptions.jelly
  
  Index: testCmdLineOptions.jelly
  ===================================================================
  <jelly xmlns="jelly:core" xmlns:bsh="jelly:beanshell">
  -a option = ${commandLine.getOptionValue("a")}
  -b option = ${commandLine.getOptionValue("b")}
  -c option = ${commandLine.getOptionValue("c")}
  <bsh:script>
  Properties sysprops = System.getProperties();
  System.out.println("-testsysprop = " + sysprops.get("testsysprop"));
  </bsh:script>
  </jelly>
  
  
  1.17      +100 -22   jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/Jelly.java
  
  Index: Jelly.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/src/java/org/apache/commons/jelly/Jelly.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Jelly.java	2 Oct 2002 13:56:23 -0000	1.16
  +++ Jelly.java	4 Oct 2002 11:28:20 -0000	1.17
  @@ -61,26 +61,30 @@
    */
   
   package org.apache.commons.jelly;
  -import java.io.BufferedWriter;
   import java.io.File;
   import java.io.FileWriter;
   import java.io.InputStream;
   import java.io.FileInputStream;
  -import java.io.OutputStreamWriter;
  -import java.io.Writer;
   import java.net.MalformedURLException;
   import java.net.URL;
   import java.util.Enumeration;
   import java.util.Properties;
  +import java.util.StringTokenizer;
  +import java.util.ArrayList;
   
   import org.apache.commons.jelly.parser.XMLParser;
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  +import org.apache.commons.cli.*;
   
   /** 
    * <p><code>Jelly</code> is a helper class which is capable of
    * running a Jelly script. This class can be used from the command line
  - * or can be used as the basis of an Ant task.</p>
  + * or can be used as the basis of an Ant task.</p> Command line usage is as follows:
  + *
  + * <pre>
  + * jelly [scriptFile] [-script scriptFile -o outputFile -Dsysprop=syspropval]
  + * </pre>
    *
    * @author <a href="mailto:jstrachan@apache.org">James Strachan</a>
    * @version $Revision$
  @@ -104,31 +108,49 @@
           
       public Jelly() {
       }
  -    
  +
  +    /**
  +     * Usage: jelly [scriptFile] [-script scriptFile -o outputFile -Dsysprop=syspropval]
  +     */
       public static void main(String[] args) throws Exception {
   
           try {
               if (args.length <= 0) {
  -                System.out.println("Usage: Jelly scriptFile [outputFile]");
  +                System.out.println("Usage: jelly [scriptFile] [-script scriptFile -o outputFile -Dsysprop=syspropval]");
                   return;
               }
   
  -            Jelly jelly = new Jelly();
  -            jelly.setScript(args[0]);
  +            // parse the command line options using CLI
  +            CommandLine cmdLine = parseCommandLineOptions(args);
  +
  +            // get the -script option. If there isn't one then use args[0]
  +            String scriptFile = null;
  +            if (cmdLine.hasOption("script")) {
  +                scriptFile = cmdLine.getOptionValue("script");
  +            } else {
  +                scriptFile = args[0];
  +            }
   
  -            // later we might wanna add some command line arguments 
  -            // checking stuff using commons-cli to specify the output file
  -            // and input file via command line arguments
  -            final XMLOutput output =
  -                (args.length > 1)
  -                    ? XMLOutput.createXMLOutput(new FileWriter(args[1]))
  -                    : XMLOutput.createXMLOutput(System.out);
  +            // check if the script file exists
  +            if (!(new File(scriptFile)).exists()) {
  +                System.out.println("Script file " + scriptFile + " not found");
  +                return;
  +            }
  +
  +            // extract the -o option for the output file to use
  +            final XMLOutput output = cmdLine.hasOption("o") ?
  +                    XMLOutput.createXMLOutput(new FileWriter(cmdLine.getOptionValue("o"))) :
  +                    XMLOutput.createXMLOutput(System.out);
  +
  +            Jelly jelly = new Jelly();
  +            jelly.setScript(scriptFile);
   
               Script script = jelly.compileScript();
   
               // add the system properties and the command line arguments
               JellyContext context = jelly.getJellyContext();
               context.setVariable("args", args);
  +            context.setVariable("commandLine", cmdLine);
               script.run(context, output);
   
               // now lets wait for all threads to close
  @@ -154,8 +176,64 @@
                   e.printStackTrace();
               }
           }
  -    }   
  -    
  +    }
  +
  +    /**
  +     * Parse the command line using CLI. -o and -script are reserved for Jelly.
  +     * -Dsysprop=sysval is support on the command line as well.
  +     */
  +    private static CommandLine parseCommandLineOptions(String[] args) throws ParseException {
  +        // create the expected options
  +        Options cmdLineOptions = new Options();
  +        cmdLineOptions.addOption("o", true, "Output file");
  +        cmdLineOptions.addOption("script", true, "Jelly script to run");
  +
  +        // -D options will be added to the system properties
  +        Properties sysProps = System.getProperties();
  +
  +        // filter the system property setting from the arg list
  +        // before passing it to the CLI parser
  +        ArrayList filteredArgList = new ArrayList();
  +
  +        for (int i=0;i<args.length;i++) {
  +            String arg = args[i];
  +
  +            // if this is a -D property parse it and add it to the system properties.
  +            // -D args will not be copied into the filteredArgList.
  +            if (arg.startsWith("-D") && (arg.length() > 2)) {
  +                arg = arg.substring(2);
  +                StringTokenizer toks = new StringTokenizer(arg, "=");
  +
  +                if (toks.countTokens() == 2) {
  +                    // add the tokens to the system properties
  +                    sysProps.setProperty(toks.nextToken(), toks.nextToken());
  +                } else {
  +                    System.err.println("Invalid system property: " + arg);
  +                }
  +
  +            } else {
  +                // add this to the filtered list of arguments
  +                filteredArgList.add(arg);
  +
  +                // add additional "-?" options to the options object. if this is not done
  +                // the only options allowed would be "-o" and "-script".
  +                if (arg.startsWith("-") && arg.length() > 1) {
  +                    if (!(arg.equals("-o") && arg.equals("-script"))) {
  +                        cmdLineOptions.addOption(arg.substring(1, arg.length()), true, "dynamic option");
  +                    }
  +                }
  +            }
  +        }
  +
  +        // make the filteredArgList into an array
  +        String[] filterArgs = new String[filteredArgList.size()];
  +        filteredArgList.toArray(filterArgs);
  +
  +        // parse the command line
  +        Parser parser = new GnuParser();
  +        return parser.parse(cmdLineOptions, filterArgs);
  +    }
  +
       /**
        * Compiles the script
        */
  
  
  
  1.37      +25 -8     jakarta-commons-sandbox/jelly/maven.xml
  
  Index: maven.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/maven.xml,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- maven.xml	30 Sep 2002 17:52:28 -0000	1.36
  +++ maven.xml	4 Oct 2002 11:28:20 -0000	1.37
  @@ -65,17 +65,18 @@
   	
     <!-- creates the XML webpage from the tag XML information -->		
     <goal name="doc:tags" prereqs="doclet:tag, jelly-task" 
  -	description="Generates the tag documentation">
  +		description="Generates the tag documentation">
   	
  -	<mkdir dir="target/generated-xdocs"/>
  +		<mkdir dir="target/generated-xdocs"/>
   
   <!--      
  -	<jelly file="src/script/makeTagDoc.jelly" 
  -		   output="target/generated-xdocs/tags.xml"/> 
  +		<jelly file="src/script/makeTagDoc.jelly" 
  +			   output="target/generated-xdocs/tags.xml"/> 
   -->	
       <java classname="org.apache.commons.jelly.Jelly" fork="yes">
         <classpath refid="test.classpath"/>
         <arg value="src/script/makeTagDoc.jelly"/> 
  +      <arg value="-o"/>
         <arg value="target/generated-xdocs/tags.xml"/> 
       </java>
     </goal>
  @@ -206,7 +207,7 @@
     </goal>
   
     <goal name="demo:jellybean" prereqs="jelly-task" 
  -	description="Runs the example of binding jelly beans to tags">
  +		description="Runs the example of binding jelly beans to tags">
   	
   <!--	
   	<jelly file="src/test/org/apache/commons/jelly/define/jellyBeanSample.jelly"/> 
  @@ -218,13 +219,13 @@
     </goal>
   
     <goal name="demo:static" prereqs="jelly-task" 
  -	description="Outputs some static XML">
  +		description="Outputs some static XML">
   	
   	<jelly file="src/test/org/apache/commons/jelly/testStatic.jelly"/> 
     </goal>
   
     <goal name="demo:html" prereqs="jelly-task" 
  -	description="Runs the example of parsing HTML with jelly">
  +		description="Runs the example of parsing HTML with jelly">
   	
   <!--	
   	<jelly file="src/test/org/apache/commons/jelly/html/example.jelly"/> 
  @@ -236,7 +237,7 @@
     </goal>
   
     <goal name="demo:text" prereqs="jelly-task" 
  -	description="Runs the example of parsing text with tags via jelly">
  +		description="Runs the example of parsing text with tags via jelly">
   	
   <!--	
   	<jelly file="src/test/org/apache/commons/jelly/html/example2.jelly"/> 
  @@ -479,6 +480,22 @@
         <sysproperty key="http.proxyHost" value="${maven.proxy.host}"/>
         <sysproperty key="http.proxyPort" value="${maven.proxy.port}"/>
         <arg value="src/test/org/apache/commons/jelly/swing/showVariables.jelly"/> 
  +    </java>
  +  </goal>
  +  
  +	<!-- a sample of using the command line interface to invoke Jelly -->	
  +  <goal name="demo:cmdline" prereqs="jelly-task"
  +    description="Demonstrates how to use the command line interface to Jelly">
  +    <java classname="org.apache.commons.jelly.Jelly" fork="yes">
  +      <classpath refid="test.classpath"/>
  +      <arg value="src/test/org/apache/commons/jelly/testCmdLineOptions.jelly"/> 
  +      <arg value="-a"/> 
  +      <arg value="valueOfA"/> 
  +      <arg value="-b"/> 
  +      <arg value="valueOfB"/> 
  +      <arg value="-c"/> 
  +      <arg value="valueOfC"/> 
  +      <arg value="-Dtestsysprop=valueOfTestSystemProp"/> 
       </java>
     </goal>
   </project>
  
  
  
  1.77      +11 -0     jakarta-commons-sandbox/jelly/project.xml
  
  Index: project.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/jelly/project.xml,v
  retrieving revision 1.76
  retrieving revision 1.77
  diff -u -r1.76 -r1.77
  --- project.xml	2 Oct 2002 11:03:38 -0000	1.76
  +++ project.xml	4 Oct 2002 11:28:20 -0000	1.77
  @@ -187,6 +187,17 @@
       </dependency>
   
       <dependency>
  +      <id>commons-cli</id>
  +      <version>SNAPSHOT</version>
  +    </dependency>
  +
  +		<!-- this is brought in by the commons-cli dependency -->
  +    <dependency>
  +      <id>commons-lang</id>
  +      <version>SNAPSHOT</version>
  +    </dependency>
  +
  +    <dependency>
         <id>commons-discovery</id>
         <version>SNAPSHOT</version>
       </dependency>
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>