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(); } }
