Author: roxspring
Date: Fri Jun  3 18:09:22 2005
New Revision: 179921

URL: http://svn.apache.org/viewcvs?rev=179921&view=rev
Log:
Added CLI2 Overview documentation

Modified:
    
jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/DocumentationTest.java
    jakarta/commons/proper/cli/trunk/xdocs/manual/index.xml

Modified: 
jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/DocumentationTest.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/DocumentationTest.java?rev=179921&r1=179920&r2=179921&view=diff
==============================================================================
--- 
jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/DocumentationTest.java
 (original)
+++ 
jakarta/commons/proper/cli/trunk/src/test/org/apache/commons/cli2/DocumentationTest.java
 Fri Jun  3 18:09:22 2005
@@ -27,6 +27,7 @@
 import org.apache.commons.cli2.builder.DefaultOptionBuilder;
 import org.apache.commons.cli2.builder.GroupBuilder;
 import org.apache.commons.cli2.commandline.Parser;
+import org.apache.commons.cli2.option.DefaultOption;
 import org.apache.commons.cli2.option.PropertyOption;
 import org.apache.commons.cli2.util.HelpFormatter;
 
@@ -147,6 +148,81 @@
                 "Unexpected --bad-option while processing options",
                 uoe.getMessage());
         }
+    }
+    
+    public void testManualIntroduction() {
+        
+        DefaultOptionBuilder oBuilder = new DefaultOptionBuilder();
+        ArgumentBuilder aBuilder = new ArgumentBuilder();
+        GroupBuilder gBuilder = new GroupBuilder();
+        
+        DefaultOption xmlOption = 
+            oBuilder
+                .withLongName("xml")
+                .withDescription("Output using xml format")
+                .create();
+        
+        Argument pathArgument = 
+            aBuilder
+                .withName("path")
+                .withMinimum(1)
+                .withMaximum(1)
+                .create();
+        
+        Group outputChildren = 
+            gBuilder
+                .withOption(xmlOption)
+                .create();
+        
+        Option outputOption = 
+            oBuilder
+                .withLongName("output")
+                .withDescription("Outputs to a file")
+                .withArgument(pathArgument)
+                .withChildren(outputChildren)
+                .create();
+        
+        ///////////////////////////////////////////////////
+        
+        try {
+            Group options = null;
+            HelpFormatter hf = new HelpFormatter();
+            
+            Parser p = new Parser();
+            p.setGroup(options);
+            p.setHelpFormatter(hf);
+            p.setHelpTrigger("--help");
+            CommandLine cl = p.parseAndHelp(new String[]{});
+            if(cl==null) {
+                System.exit(-1);
+            }
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        //////////////////////////////////////////////////
+        
+        CommandLine cl = null;
+        
+        // if we have --output option
+        if(cl.hasOption("--output")) {
+            // grab the path
+            String path = (String)cl.getValue("--output");
+            // grab the format
+            boolean xml = cl.hasOption("--xml");
+            // configure the application's output
+            configureOutput(path,xml);
+        }
+        
+        
+                
+        
+    }
+
+    private void configureOutput(String path, boolean xml) {
+        // TODO Auto-generated method stub
+        
     }
 
     public void testExampleAnt() throws IOException, OptionException {

Modified: jakarta/commons/proper/cli/trunk/xdocs/manual/index.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/cli/trunk/xdocs/manual/index.xml?rev=179921&r1=179920&r2=179921&view=diff
==============================================================================
--- jakarta/commons/proper/cli/trunk/xdocs/manual/index.xml (original)
+++ jakarta/commons/proper/cli/trunk/xdocs/manual/index.xml Fri Jun  3 18:09:22 
2005
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!--
- Copyright 2004 The Apache Software Foundation
+ Copyright 2004-2005 The Apache Software Foundation
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
@@ -15,29 +15,178 @@
  limitations under the License.
 -->
 <document>
+    
+    <properties>
+        <author email="commons-dev@jakarta.apache.org">commons-dev</author>
+        <title>CLI2 - Overview</title>
+    </properties>
+    
+    <body>
+        <section name="Overview">
+            <p> 
+                CLI Breaks down command line processing into three distinct 
phases, the
+                first of which is to create a model of the command line you 
wish to process. The
+                second phase is arguably the most important as it involves 
processing the
+                command line arguments of the application according to the 
model created.
+                Finally the parsed command line is available to be queried by 
the
+                application proper.  The phases are discussed in more detail 
below.
+            </p>
+            <subsection name="Modelling the interface">
+                <p> 
+                    In CLI2 a command line is modelled as a Group composed of 
many Options.
+                    There are a number different Option implementations 
available to be
+                    used including DefaultOption, Switch and Command which may 
all have an
+                    Argument and/or a Group of child options associated with 
them. An
+                    example of where this parental relationship could be used 
is where you
+                    need to allow for the following scenario where one option
+                    only makes sense within the context of another:
+                </p>
+                <p><code>myapp --output path/to/file --xml</code></p>
+                <p>
+                    Typically this command line would be modelled as a 
DefaultOption
+                    (<code>--output</code>) with an Argument (to capture
+                    <code>path/to/file</code>) and a Group of children 
consisting of a
+                    DefaultOption (<code>--xml</code>) since the format only 
applies if the 
+                    output is specified
+                </p>
+                <p>
+                    The various Option implementations provided need careful 
configuration 
+                    and constructors take a complex set of arguments.  To ease 
the construction 
+                    of these options *Builder classes (e.g. 
DefaultOptionBuilder, GroupBuilder 
+                    and ArgumentBuilder) have been supplied following the 
+                    <a href="http://c2.com/cgi/wiki?BuilderPattern";>Builder 
Pattern</a> 
+                    which essentially involves using the DefaultOptionBuilder 
class to create 
+                    instances of DefaultOption using descriptive method calls 
instead of 
+                    anonymous arguments to a constructor.  The following 
example demonstrates how 
+                    the command line shown above could be modelled in code:
+                </p>
+                <source>
+DefaultOptionBuilder oBuilder = new DefaultOptionBuilder();
+ArgumentBuilder aBuilder = new ArgumentBuilder();
+GroupBuilder gBuilder = new GroupBuilder();
 
-  <properties>
-    <author email="commons-dev@jakarta.apache.org">commons-dev</author>
-    <title>CLI2 - Overview</title>
-  </properties>
-
-  <body>
-    <section name="Overview">
-      <p>TODO quick overview to the overview</p>
-      <subsection name="Modelling the interface">
-        <p>TODO terminology</p>
-        <p>TODO basic options</p>
-        <p>TODO option builders</p>
-      </subsection>
-      <subsection name="Parsing the command line">
-        <p>TODO Parser</p>
-        <p>TODO OptionException</p>
-        <p>TODO HelpFormatter</p>
-      </subsection>
-      <subsection name="Querying the result">
-        <p>TODO CommandLine</p>
-        <p>TODO DefaultingCommandLine</p>
-      </subsection>
-    </section>
-  </body>
+DefaultOption xmlOption = 
+    oBuilder
+        .withLongName("xml")
+        .withDescription("Output using xml format")
+        .create();
+
+Argument pathArgument = 
+    aBuilder
+        .withName("path")
+        .withMinimum(1)
+        .withMaximum(1)
+        .create();
+
+Group outputChildren = 
+    gBuilder
+        .withOption(xmlOption)
+        .create();
+
+Option outputOption = 
+    oBuilder
+        .withLongName("output")
+        .withDescription("Outputs to a file")
+        .withArgument(pathArgument)
+        .withChildren(outputChildren)
+        .create();
+                </source>
+                <p>
+                    The <a href="options.html">Options</a> and 
+                    <a href="builders.html">Builders</a> sections of the 
manual discuss these 
+                    features in greater detail.
+                </p>
+                <p>
+                    Once all the options have been composed into a Group 
modelling the complete 
+                    option model then we are ready to parse a command line.
+                </p>
+            </subsection>
+            <subsection name="Parsing the command line">
+                <p>
+                    The Parser class can be used to parse an array of 
arguments against the 
+                    option model into a CommandLine.  The parsing is driven by 
the 
+                    <code>parse(String[])</code> method which delegates to the 
option model to do 
+                    the actual parsing, with each Option implementation 
providing its own parsing 
+                    logic.  The <code>parseAndHelp(String[])</code> method 
attempts to simplify 
+                    the use of the former method by automatically handling any 
<code>--help</code> 
+                    options and displaying error messages where appropriate.
+                </p>
+                <p>
+                    The HelpFormatter class is designed to allow the option 
model to be described 
+                    to the user in a manner typical of command line 
applications.  The 
+                    HelpFormatter is designed with flexibility in mind so it 
should be possible to 
+                    control exactly which structures are described to the user 
and what level of 
+                    detail to use.  The HelpFormatter is discussed in detail 
in the 
+                    <a href="utilities.html#HelpFormatter">Utilities</a> 
section of the manual.
+                </p>
+                <p>
+                    Any errors that occur while parsing result in an 
OptionException being thrown 
+                    which attempt to provide a meaningful message describing 
the problem to the 
+                    user.  Parser's <code>parseAndHelp(String[])</code> method 
catches any 
+                    OptionException and uses the HelpFormatter to display to 
the user:
+                </p>
+                <source>
+// configure the options
+Group options = ...;
+                    
+// configure a HelpFormatter
+HelpFormatter hf = new HelpFormatter();
+
+// configure a parser
+Parser p = new Parser();
+p.setGroup(options);
+p.setHelpFormatter(hf);
+p.setHelpTrigger("--help");
+CommandLine cl = p.parseAndHelp(new String[]{});
+                    
+// abort application if no CommandLine was parsed
+if(cl==null) {
+    System.exit(-1);
+}
+                </source>
+                
+                <p>
+                    Assuming that OptionExceptions have been averted then the 
next step is to have 
+                    the application query the resulting CommandLine instance.
+                </p>
+            </subsection>
+            <subsection name="Querying the result">
+                <p>
+                    The CommandLine interface provides lots of ways to look up 
information either 
+                    by Option instance or by a String representing any of the 
forms valid on the 
+                    command line.  For example if an option is configured with 
multiple names 
+                    (e.g. <code>-?</code>, <code>-h</code>, 
<code>--help</code>) then any of the 
+                    those strings can be used to look up the value 
irrespective of which form 
+                    appeared on the command line.
+                </p>
+                <p>
+                    The <code>hasOption()</code> family of methods can be used 
to simply test for 
+                    the presence of options, while the 
<code>getValues()</code> family of methods 
+                    can be used to retrieve the values associated with 
Arguments.  The status of 
+                    any Switch options can be detected through the use of 
<code>getSwitch()</code> 
+                    methods which will return a Boolean if set or null 
otherwise:
+                </p>
+                <source>
+// if we have --output option
+if(cl.hasOption("--output")) {
+    // grab the path
+    String path = (String)cl.getValue("--output");
+    // grab the format
+    boolean xml = cl.hasOption("--xml");
+    // configure the application's output
+    configureOutput(path,xml);
+}
+                </source>
+                <p>
+                    To enable complex CommandLine configurations alternative 
implementations are 
+                    provided that can wrap a Properties or Preferences 
instance as a CommandLine.
+                    These can then be combined with the DefaultingCommandLine 
and the parsed 
+                    CommandLine to provide a variety of different defaulting 
and overriding 
+                    scenarios.  The CommandLine interface and implementations 
are discussed 
+                    further in the <a 
href="commandlines.html">CommandLines</a> section of the 
+                    manual.
+                </p>
+            </subsection>
+        </section>
+    </body>
 </document>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to