This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git

commit 69b09a44cf665968a554dbebc5210b2ffdcf9ae6
Author: Andy Seaborne <[email protected]>
AuthorDate: Sat Nov 16 13:36:23 2024 +0000

    GH-2753: Allow modification of CLI setup
---
 .../main/java/org/apache/jena/cmd/ArgModule.java   |   5 +-
 .../java/org/apache/jena/cmd/ArgModuleGeneral.java |   3 +-
 .../java/org/apache/jena/cmd/CmdArgModule.java     |   1 +
 .../main/java/org/apache/jena/cmd/CmdLineArgs.java | 100 ++++++++++--
 .../java/org/apache/jena/cmd/CommandLineBase.java  |   5 +-
 .../java/org/apache/jena/cmds/TestCmdLine.java     | 171 ++++++++++++---------
 6 files changed, 188 insertions(+), 97 deletions(-)

diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModule.java 
b/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModule.java
index adb4594e22..b385b95e97 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModule.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModule.java
@@ -18,9 +18,8 @@
 
 package org.apache.jena.cmd;
 
-public interface ArgModule
-{
+/** A group of related arguments */
+public interface ArgModule {
     // Argument processing phase
     public void processArgs(CmdArgModule cmdLine);
 }
-
diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModuleGeneral.java 
b/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModuleGeneral.java
index 9260eb29a5..20aa017cd5 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModuleGeneral.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/ArgModuleGeneral.java
@@ -18,8 +18,7 @@
 
 package org.apache.jena.cmd;
 
-public interface ArgModuleGeneral extends ArgModule
-{
+public interface ArgModuleGeneral extends ArgModule {
     // Registration phase for usage messages
     public abstract void registerWith(CmdGeneral cmdLine);
 }
diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdArgModule.java 
b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdArgModule.java
index 9d62ba475d..bc13b9dde6 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdArgModule.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdArgModule.java
@@ -20,6 +20,7 @@ package org.apache.jena.cmd;
 
 import java.util.ArrayList;
 import java.util.List;
+
 public abstract class CmdArgModule extends CmdMain
 {
     List<ArgModuleGeneral> modules = new ArrayList<>();
diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdLineArgs.java 
b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdLineArgs.java
index 7e4694428a..1d42c4eff0 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdLineArgs.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdLineArgs.java
@@ -32,12 +32,18 @@ public class CmdLineArgs extends CommandLineBase {
     }
 
     private boolean processedArgs = false;
-    protected Map<String, ArgDecl> argMap = new HashMap<>();   // Map from 
string name to ArgDecl
-    protected Map<String, Arg> args = new HashMap<>();         // Name to Arg
-    protected List<String> positionals = new ArrayList<>();    // Positional 
arguments as strings.
 
-    public void process() throws IllegalArgumentException
-    {
+    // Setup:
+    // Map of declarations of accepted arguments.
+    protected Map<String, ArgDecl> argMap = new HashMap<>();
+
+    // After command line processing:
+    // Map of arguments seen, with values.
+    protected Map<String, Arg> args = new HashMap<>();
+    // Positional arguments as strings.
+    protected List<String> positionals = new ArrayList<>();
+
+    public void process() throws IllegalArgumentException {
         processedArgs = true;
         apply(new ArgProcessor());
     }
@@ -47,9 +53,8 @@ public class CmdLineArgs extends CommandLineBase {
     /** Add an argument to those to be accepted on the command line.
      * @param argName Name
      * @param hasValue True if the command takes a (string) value
-     * @return The CommandLine processor object
+     * @return The command line processor object
      */
-
     public CmdLineArgs add(String argName, boolean hasValue) {
         return add(new ArgDecl(hasValue, argName));
     }
@@ -58,28 +63,90 @@ public class CmdLineArgs extends CommandLineBase {
      *  Argument order reflects ArgDecl.
      * @param hasValue True if the command takes a (string) value
      * @param argName Name
-     * @return The CommandLine processor object
+     * @return The command line processor object
      */
-
     public CmdLineArgs add(boolean hasValue, String argName) {
         return add(new ArgDecl(hasValue, argName));
     }
 
     /** Add an argument object
-     * @param arg Argument to add
-     * @return The CommandLine processor object
+     * @param argDecl Argument to add
+     * @return The command line processor object
      */
-
-    public CmdLineArgs add(ArgDecl arg) {
-        for (Iterator<String> iter = arg.names(); iter.hasNext();) {
-            String name = iter.next();
+    public CmdLineArgs add(ArgDecl argDecl) {
+        for ( String name : argDecl.getNames() ) {
             if ( argMap.containsKey(name) )
                 Log.warn(this, "Argument '" + name + "' already added");
-            argMap.put(name, arg);
+            argMap.put(name, argDecl);
+        }
+        return this;
+    }
+
+    /**
+     * Remove an argument and any values set for this argument.
+     * @param argDecl Argument to remove
+     * @return The command line processor object
+     */
+    public CmdLineArgs removeArg(ArgDecl argDecl) {
+        for ( String name : argDecl.getNames() ) {
+            removeArg(name);
         }
         return this;
     }
 
+    /**
+     * Remove an argument and any values set for this argument.
+     * This only removed the use of the specific name.
+     * See {@link #removeArgAll(String)} for removing this name
+     * and all its synonyms.
+     *
+     * @param argName Argument to remove
+     * @return The command line processor object
+     */
+    public CmdLineArgs removeArg(String argName) {
+        argMap.remove(argName);
+        args.remove(argName);
+        return this;
+    }
+
+    /**
+     * Remove an argument and all its synonyms, together with any
+     * values already set for these arguments. {@link #removeArg(String)}
+     * for removing just this particular name.
+     *
+     * @param argName Argument to remove
+     * @return The command line processor object
+     */
+    public CmdLineArgs removeArgAll(String argName) {
+        ArgDecl argDecl = findArgDecl(argName);
+        if ( argDecl != null )
+            removeArg(argDecl);
+        return this;
+    }
+
+    private ArgDecl findArgDecl(String argName) {
+        return argMap.get(argName);
+    }
+
+    /**
+     * Remove argument declarations and argument values.
+     */
+    public CmdLineArgs clear() {
+        argMap.clear();
+        args.clear();
+        return this;
+    }
+
+    /**
+     * Forget any argument values; retain the  argument declarations.
+     * Call {@link #process()} to re-process the command line.
+     */
+    public CmdLineArgs reset() {
+        processedArgs = false;
+        args.clear();
+        return this;
+    }
+
     /**
      * Add a positional parameter
      * @param value
@@ -122,7 +189,6 @@ public class CmdLineArgs extends CommandLineBase {
             arg.setValue(value);
             arg.addValue(value);
         }
-
         return this;
     }
 
diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/CommandLineBase.java 
b/jena-cmds/src/main/java/org/apache/jena/cmd/CommandLineBase.java
index b065c0242c..26ff161512 100644
--- a/jena-cmds/src/main/java/org/apache/jena/cmd/CommandLineBase.java
+++ b/jena-cmds/src/main/java/org/apache/jena/cmd/CommandLineBase.java
@@ -26,18 +26,17 @@ import java.util.List;
 /**
  * Incoming String[] to a list of argument/values + items.
  */
-
 public class CommandLineBase {
     private List<String> argList = new ArrayList<>();
     boolean splitTerms = true;
 
-    public CommandLineBase(String[] args) {
+    public CommandLineBase(String... args) {
         setArgs(args);
     }
 
     public CommandLineBase() {}
 
-    public void setArgs(String[] argv) {
+    public void setArgs(String... argv) {
         argList = processArgv(argv);
     }
 
diff --git a/jena-cmds/src/test/java/org/apache/jena/cmds/TestCmdLine.java 
b/jena-cmds/src/test/java/org/apache/jena/cmds/TestCmdLine.java
index 579e97c575..7555c552a1 100644
--- a/jena-cmds/src/test/java/org/apache/jena/cmds/TestCmdLine.java
+++ b/jena-cmds/src/test/java/org/apache/jena/cmds/TestCmdLine.java
@@ -17,87 +17,114 @@
  */
 
 package org.apache.jena.cmds;
-import java.util.Iterator ;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+
+import org.junit.Test;
+
+import org.apache.jena.cmd.Arg;
 import org.apache.jena.cmd.ArgDecl;
+import org.apache.jena.cmd.CmdException;
 import org.apache.jena.cmd.CmdLineArgs;
-import org.junit.Test ;
-import static org.junit.Assert.* ;
-
-public class TestCmdLine
-{
-    @Test public void test_Simple1()
-    {
-        String args[] = new String[]{""} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        cl.process() ;
+
+public class TestCmdLine {
+    @Test
+    public void test_Simple1() {
+        String args[] = {""};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        cl.process();
     }
-    
-    @Test public void test_Flag1()
-    {
-        String args[] = new String[]{ ""} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(false, "-a") ;
-        cl.add(argA) ;
-        cl.process() ;
-        assertTrue("-a argument found" , ! cl.contains(argA) ) ; 
+
+    @Test
+    public void test_Flag1() {
+        String args[] = {""};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(false, "-a");
+        cl.add(argA);
+        cl.process();
+        assertTrue("-a argument found", !cl.contains(argA));
     }
-    
-    @Test public void test_Flag2()
-    {
-        String args[] = new String[]{ "-a"} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(false, "-a") ;
-        cl.add(argA) ;
-        cl.process() ;
-        assertTrue("No -a argument found" , cl.contains(argA) ) ; 
+
+    @Test
+    public void test_Flag2() {
+        String args[] = {"-a"};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(false, "-a");
+        cl.add(argA);
+        cl.process();
+        assertTrue("No -a argument found", cl.contains(argA));
     }
 
-    @Test public void test_Flag3()
-    {
-        String args[] = new String[]{ "-a", "filename"} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(false, "-a") ;
-        cl.add(argA) ;
-        cl.process() ;
-        assertTrue("No -a argument found" , cl.contains(argA) ) ; 
+    @Test
+    public void test_Flag3() {
+        String args[] = {"-a", "filename"};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(false, "-a");
+        cl.add(argA);
+        cl.process();
+        assertTrue("No -a argument found", cl.contains(argA));
     }
-    
-    @Test public void test_Arg1()
-    {
-        String args[] = new String[]{ ""} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(true, "-arg") ;
-        cl.add(argA) ;
-        cl.process() ;
-        assertTrue("-arg argument found" , ! cl.contains(argA) ) ; 
+
+    @Test
+    public void test_Arg1() {
+        String args[] = {""};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(true, "-arg");
+        cl.add(argA);
+        cl.process();
+        assertTrue("-arg argument found", !cl.contains(argA));
     }
-    
-    @Test public void test_Arg2()
-    {
-        String args[] = new String[]{ "-arg=ARG", "filename"} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(true, "arg") ;
-        cl.add(argA) ;
-        cl.process() ;
-        assertTrue("No -arg= argument found" , cl.contains(argA) ) ; 
-        assertEquals("", cl.getValue(argA) , "ARG") ;
-        assertEquals("", cl.getArg("arg").getValue() , "ARG") ;
+
+    @Test
+    public void test_Arg2() {
+        String args[] = {"-arg=ARG", "filename"};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(true, "arg");
+        cl.add(argA);
+        cl.process();
+        assertTrue("No -arg= argument found", cl.contains(argA));
+        assertEquals("", cl.getValue(argA), "ARG");
+        assertEquals("", cl.getArg("arg").getValue(), "ARG");
     }
-    
-    @Test public void test_nArg1()
-    {
-        String args[] = new String[]{ "-arg=V1", "--arg=V2", "-v"} ;
-        CmdLineArgs cl = new CmdLineArgs(args) ;
-        ArgDecl argA = new ArgDecl(true, "-arg") ;
-        cl.add(argA) ;
-        ArgDecl argV = new ArgDecl(false, "-v") ;
-        cl.add(argV) ;
-        cl.process() ;
-        assertTrue("No -arg= argument found" , cl.contains(argA) ) ;
-        
-        Iterator<String> iter = cl.getValues("arg").iterator() ;
-        assertEquals("Argument 1", iter.next() , "V1") ;
-        assertEquals("Argument 2", iter.next() , "V2") ;
+
+    @Test
+    public void test_nArg1() {
+        String args[] = {"-arg=V1", "--arg=V2", "-v"};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(true, "-arg");
+        cl.add(argA);
+        ArgDecl argV = new ArgDecl(false, "-v");
+        cl.add(argV);
+        cl.process();
+        assertTrue("No -arg= argument found", cl.contains(argA));
+
+        Iterator<String> iter = cl.getValues("arg").iterator();
+        assertEquals("Argument 1", iter.next(), "V1");
+        assertEquals("Argument 2", iter.next(), "V2");
+    }
+
+    public void test_addSetting() {
+        String args[] = {};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        cl.process();
+        cl.addArg("extra", "value");
+        Arg a = cl.getArg("extra");
+        assertNotNull(a);
+    }
+
+
+    @Test(expected = CmdException.class)
+    public void test_removeArg1() {
+        String args[] = {"--arg=V1", "-v"};
+        CmdLineArgs cl = new CmdLineArgs(args);
+        ArgDecl argA = new ArgDecl(true, "argument", "arg");
+        cl.add(argA);
+        cl.removeArg(argA);
+        // Exception.
+        cl.process();
     }
 }

Reply via email to