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 bb7a2a48abf74a9f30250f5da35eccf7bc7d4ab3 Author: Andy Seaborne <[email protected]> AuthorDate: Mon Dec 22 18:53:46 2025 +0000 GH-3670: Switch cmd class hierarchy: allow for command line, no exec --- jena-cmds/src/main/java/arq/cmdline/CmdARQ.java | 4 +-- .../src/main/java/arq/cmdline/CmdARQ_SSE.java | 12 ++++--- .../java/org/apache/jena/cmd/CmdArgModule.java | 9 +++--- .../main/java/org/apache/jena/cmd/CmdGeneral.java | 22 +++++++------ .../main/java/org/apache/jena/cmd/CmdLineArgs.java | 8 +++++ .../src/main/java/org/apache/jena/cmd/CmdMain.java | 37 +++++++++++----------- jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java | 4 +-- jena-cmds/src/main/java/riotcmd/CmdLangParse.java | 4 +-- jena-cmds/src/main/java/riotcmd/infer.java | 4 +-- jena-cmds/src/main/java/shacl/shacl_parse.java | 4 +-- jena-cmds/src/main/java/shacl/shacl_validate.java | 4 +-- jena-cmds/src/main/java/shex/shex_parse.java | 4 +-- jena-cmds/src/main/java/shex/shex_validate.java | 4 +-- .../main/java/tdb/xloader/CmdNodeTableBuilder.java | 4 +-- .../main/java/tdb2/xloader/AbstractCmdxLoad.java | 7 ++-- jena-cmds/src/test/java/arq/rdftests.java | 5 ++- jena-cmds/src/test/java/shacl/shacl_test.java | 4 +-- .../src/test/java/dboe/BaseSoakTest.java | 26 +++++++-------- 18 files changed, 87 insertions(+), 79 deletions(-) diff --git a/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java b/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java index fd6362c10b..b3135dd3fd 100644 --- a/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java +++ b/jena-cmds/src/main/java/arq/cmdline/CmdARQ.java @@ -20,11 +20,11 @@ package arq.cmdline; import org.apache.jena.atlas.lib.Lib; import org.apache.jena.cmd.ArgDecl; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.query.ARQ; import org.apache.jena.sys.JenaSystem; -public abstract class CmdARQ extends CmdGeneral { +public abstract class CmdARQ extends CmdMain { static { JenaSystem.init(); } diff --git a/jena-cmds/src/main/java/arq/cmdline/CmdARQ_SSE.java b/jena-cmds/src/main/java/arq/cmdline/CmdARQ_SSE.java index 7834a12f83..4c7969fc91 100644 --- a/jena-cmds/src/main/java/arq/cmdline/CmdARQ_SSE.java +++ b/jena-cmds/src/main/java/arq/cmdline/CmdARQ_SSE.java @@ -23,16 +23,18 @@ import org.apache.jena.sparql.sse.Item ; /** Root of read an SSE file and do something */ public abstract class CmdARQ_SSE extends CmdARQ { - protected ModItem modItem = new ModItem() ; - + protected ModItem modItem = new ModItem() ; + public CmdARQ_SSE(String[] argv) { super(argv) ; super.addModule(modItem) ; } - + @Override - protected String getSummary() { return getCommandName()+" [--file<file> | string]" ; } + protected String getSummary() { + return getCommandName() + " [--file<file> | string]"; + } @Override final protected void exec() @@ -40,6 +42,6 @@ public abstract class CmdARQ_SSE extends CmdARQ Item item = modItem.getItem() ; exec(item) ; } - + protected abstract void exec(Item item) ; } 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 545e601bee..2f5554cef9 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 @@ -21,7 +21,7 @@ package org.apache.jena.cmd; import java.util.ArrayList; import java.util.List; -public abstract class CmdArgModule extends CmdMain +public abstract class CmdArgModule extends CmdLineArgs { private List<ArgModuleGeneral> modules = new ArrayList<>(); @@ -34,9 +34,9 @@ public abstract class CmdArgModule extends CmdMain } @Override - final public void process() { + public void process() { super.process(); - forEach((controller, module) -> module.processArgs(controller)); + forEach((cmdArgModule, module) -> module.processArgs(cmdArgModule)); processModulesAndArgs(); } @@ -48,7 +48,8 @@ public abstract class CmdArgModule extends CmdMain } } + @FunctionalInterface interface Action { - public void action(CmdArgModule controller, ArgModuleGeneral module); + public void action(CmdArgModule cmdArgModule, ArgModuleGeneral module); } } diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdGeneral.java b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdGeneral.java index 6054b7c63c..a18800ab62 100644 --- a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdGeneral.java +++ b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdGeneral.java @@ -21,7 +21,7 @@ package org.apache.jena.cmd; import java.io.PrintStream; import org.apache.jena.atlas.io.IndentedWriter; // Added usage + some common flags -// This is the usual starting point for any sub +// This is the starting point for argument processing. public abstract class CmdGeneral extends CmdArgModule { @@ -40,9 +40,9 @@ public abstract class CmdGeneral extends CmdArgModule argModule.registerWith(this); } - protected boolean isVerbose() { return modGeneral.verbose; } - protected boolean isQuiet() { return modGeneral.quiet; } - protected boolean isDebug() { return modGeneral.debug; } + public boolean isVerbose() { return modGeneral.verbose; } + public boolean isQuiet() { return modGeneral.quiet; } + public boolean isDebug() { return modGeneral.debug; } protected boolean help() { return modGeneral.help; } final public void printHelp() { @@ -56,9 +56,16 @@ public abstract class CmdGeneral extends CmdArgModule modVersion.printVersionAndExit(); } + public void add(ArgDecl argDecl, String argName, String msg) { + add(argDecl); + getUsage().addUsage(argName, msg); + } + private Usage usage = new Usage(); - protected String cmdName = null; + + protected String getCommandName() { return null; } protected abstract String getSummary(); + public void usage() { usage(System.err); } public void usage(PrintStream pStr) { @@ -67,10 +74,5 @@ public abstract class CmdGeneral extends CmdArgModule usage.output(out); } - public void add(ArgDecl argDecl, String argName, String msg) { - add(argDecl); - getUsage().addUsage(argName, msg); - } - public Usage getUsage() { return usage; } } 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 73192f5310..452d5040d4 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 @@ -31,6 +31,14 @@ public class CmdLineArgs extends CommandLineBase { super(args); } + public void cmdError(String msg) { cmdError(msg, true);} + + public void cmdError(String msg, boolean exit) { + System.err.println(msg); + if ( exit ) + throw new TerminationException(5); + } + private boolean processedArgs = false; // Setup: diff --git a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdMain.java b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdMain.java index 8425b8578d..a6056ab270 100644 --- a/jena-cmds/src/main/java/org/apache/jena/cmd/CmdMain.java +++ b/jena-cmds/src/main/java/org/apache/jena/cmd/CmdMain.java @@ -19,22 +19,28 @@ package org.apache.jena.cmd; import org.apache.jena.atlas.logging.LogCtl; -/** Adds main()-like methods - * + +/** + * Adds main()-like methods to argument processing. + * <p> + * Use this class for commands that follow the common pattern of processing arguments + * and then executing with no additional intermediate steps. + * <p> * Usage: - * new YourCommand(args).mainAndExit() - * which never returns and routes thing to System.exit. - * or call - * new YourCommand(args).mainMethod() - * which should not call System.exit anywhere */ + * <pre>new YourCommand(args).mainAndExit()</pre> + * which never returns and routes to System.exit. or call + * <pre>new YourCommand(args).mainMethod()</pre> + * + * which should not call {@code System.exit} anywhere. + */ -public abstract class CmdMain extends CmdLineArgs +public abstract class CmdMain extends CmdGeneral { // Do this very early so it happens before anything else // gets a chance to create a logger. static { LogCtl.setLogging(); } - public CmdMain(String[] args) { + protected CmdMain(String[] args) { super(args); } @@ -81,18 +87,11 @@ public abstract class CmdMain extends CmdLineArgs return 0; } - protected final void mainMethod() { - process(); - exec(); - } protected abstract void exec(); - protected abstract String getCommandName(); - public void cmdError(String msg) { cmdError(msg, true);} - public void cmdError(String msg, boolean exit) { - System.err.println(msg); - if ( exit ) - throw new TerminationException(5); + protected final void mainMethod() { + process(); + exec(); } } diff --git a/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java b/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java index c0de8d9051..23f895a619 100644 --- a/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java +++ b/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java @@ -26,11 +26,11 @@ import arq.cmdline.ModTime; import org.apache.jena.atlas.io.IO; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.sys.JenaSystem; /** Abstract base class to work on patch files given on the command line */ -public abstract class CmdRDFPatch extends CmdGeneral { +public abstract class CmdRDFPatch extends CmdMain { static { LogCtl.setLogging(); JenaSystem.init(); diff --git a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java index c1b66dea74..0920c0634e 100644 --- a/jena-cmds/src/main/java/riotcmd/CmdLangParse.java +++ b/jena-cmds/src/main/java/riotcmd/CmdLangParse.java @@ -36,7 +36,7 @@ import org.apache.jena.atlas.lib.Pair; import org.apache.jena.atlas.logging.Log; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.irix.IRIException; import org.apache.jena.irix.IRIs; import org.apache.jena.irix.IRIxResolver; @@ -54,7 +54,7 @@ import org.apache.jena.sparql.core.Quad; import org.apache.jena.sys.JenaSystem; /** Common framework for running RIOT parsers */ -public abstract class CmdLangParse extends CmdGeneral { +public abstract class CmdLangParse extends CmdMain { static { JenaSystem.init(); } diff --git a/jena-cmds/src/main/java/riotcmd/infer.java b/jena-cmds/src/main/java/riotcmd/infer.java index a64f891db8..4d9fe663fd 100644 --- a/jena-cmds/src/main/java/riotcmd/infer.java +++ b/jena-cmds/src/main/java/riotcmd/infer.java @@ -23,7 +23,7 @@ import java.util.List ; import org.apache.jena.atlas.io.IO ; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.graph.Graph; import org.apache.jena.rdfs.RDFSFactory; import org.apache.jena.riot.Lang ; @@ -78,7 +78,7 @@ AllegroGraph RDFS++ * owl:inverseOf * owl:TransitiveProperty */ -public class infer extends CmdGeneral +public class infer extends CmdMain { static final ArgDecl argRDFS = new ArgDecl(ArgDecl.HasValue, "rdfs") ; private Graph vocab ; diff --git a/jena-cmds/src/main/java/shacl/shacl_parse.java b/jena-cmds/src/main/java/shacl/shacl_parse.java index d0ed0f0682..0792fdc4b6 100644 --- a/jena-cmds/src/main/java/shacl/shacl_parse.java +++ b/jena-cmds/src/main/java/shacl/shacl_parse.java @@ -30,7 +30,7 @@ import org.apache.jena.atlas.io.IndentedWriter; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.graph.Graph; import org.apache.jena.irix.IRIException; import org.apache.jena.irix.IRIs; @@ -49,7 +49,7 @@ import org.apache.jena.sys.JenaSystem; * <p> * Usage: <code>shacl parse FILE</code> */ -public class shacl_parse extends CmdGeneral { +public class shacl_parse extends CmdMain { static { LogCtl.setLogging(); JenaSystem.init(); diff --git a/jena-cmds/src/main/java/shacl/shacl_validate.java b/jena-cmds/src/main/java/shacl/shacl_validate.java index e850f737ac..722244c331 100644 --- a/jena-cmds/src/main/java/shacl/shacl_validate.java +++ b/jena-cmds/src/main/java/shacl/shacl_validate.java @@ -21,7 +21,7 @@ package shacl; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; @@ -39,7 +39,7 @@ import org.apache.jena.sys.JenaSystem; * <p> * Usage: <code>shacl validate [--text] --shapes SHAPES --data DATA</code> */ -public class shacl_validate extends CmdGeneral { +public class shacl_validate extends CmdMain { static { LogCtl.setLogging(); diff --git a/jena-cmds/src/main/java/shex/shex_parse.java b/jena-cmds/src/main/java/shex/shex_parse.java index c694861a27..a069d2ada4 100644 --- a/jena-cmds/src/main/java/shex/shex_parse.java +++ b/jena-cmds/src/main/java/shex/shex_parse.java @@ -30,7 +30,7 @@ import org.apache.jena.atlas.lib.FileOps; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.riot.RiotException; import org.apache.jena.shex.Shex; import org.apache.jena.shex.ShexSchema; @@ -42,7 +42,7 @@ import org.apache.jena.sys.JenaSystem; * <p> * Usage: <code>shex parse FILE</code> */ -public class shex_parse extends CmdGeneral { +public class shex_parse extends CmdMain { static { LogCtl.setLogging(); JenaSystem.init(); diff --git a/jena-cmds/src/main/java/shex/shex_validate.java b/jena-cmds/src/main/java/shex/shex_validate.java index 300751b81b..db3c170926 100644 --- a/jena-cmds/src/main/java/shex/shex_validate.java +++ b/jena-cmds/src/main/java/shex/shex_validate.java @@ -23,7 +23,7 @@ import java.io.OutputStream; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.NodeFactory; @@ -37,7 +37,7 @@ import org.apache.jena.sys.JenaSystem; * <p> * Usage: <code>shex validate [--text] --shapes SHAPES --data DATA</code> */ -public class shex_validate extends CmdGeneral { +public class shex_validate extends CmdMain { static { LogCtl.setLogging(); diff --git a/jena-cmds/src/main/java/tdb/xloader/CmdNodeTableBuilder.java b/jena-cmds/src/main/java/tdb/xloader/CmdNodeTableBuilder.java index 2f502c00a2..d2d0a0a623 100644 --- a/jena-cmds/src/main/java/tdb/xloader/CmdNodeTableBuilder.java +++ b/jena-cmds/src/main/java/tdb/xloader/CmdNodeTableBuilder.java @@ -26,7 +26,7 @@ import org.apache.jena.atlas.lib.FileOps; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.riot.Lang; import org.apache.jena.riot.RDFLanguages; import org.apache.jena.sys.JenaSystem; @@ -36,7 +36,7 @@ import org.apache.jena.tdb1.store.xloader.ProcNodeTableDataBuilder; import tdb.cmdline.CmdTDB; /** Build node table - write triples/quads as text file */ -public class CmdNodeTableBuilder extends CmdGeneral +public class CmdNodeTableBuilder extends CmdMain { static { LogCtl.setLogging(); diff --git a/jena-cmds/src/main/java/tdb2/xloader/AbstractCmdxLoad.java b/jena-cmds/src/main/java/tdb2/xloader/AbstractCmdxLoad.java index 8cde22aa68..1ee545846b 100644 --- a/jena-cmds/src/main/java/tdb2/xloader/AbstractCmdxLoad.java +++ b/jena-cmds/src/main/java/tdb2/xloader/AbstractCmdxLoad.java @@ -28,7 +28,7 @@ import java.util.List; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.sys.JenaSystem; import org.apache.jena.tdb2.xloader.XLoaderFiles; @@ -36,7 +36,7 @@ import org.apache.jena.tdb2.xloader.XLoaderFiles; * Base class for TDB xloaders commands for java steps in the load process. * All steps accept all the same arguments, even if they are not applicable to the stage. */ -abstract class AbstractCmdxLoad extends CmdGeneral { +abstract class AbstractCmdxLoad extends CmdMain { static { JenaSystem.init(); LogCtl.setLog4j2(); @@ -79,9 +79,6 @@ abstract class AbstractCmdxLoad extends CmdGeneral { protected abstract void setCmdArgs(); - @Override - protected abstract String getSummary(); - protected String getArgsSummary() { return "--loc=DIR --tmpdir=DIR"; } diff --git a/jena-cmds/src/test/java/arq/rdftests.java b/jena-cmds/src/test/java/arq/rdftests.java index 406c556e09..cb6919b743 100644 --- a/jena-cmds/src/test/java/arq/rdftests.java +++ b/jena-cmds/src/test/java/arq/rdftests.java @@ -40,7 +40,7 @@ import org.apache.jena.atlas.lib.Lib; import org.apache.jena.atlas.logging.LogCtl; import org.apache.jena.cmd.ArgDecl; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.cmd.TerminationException; import org.apache.jena.graph.Node; import org.apache.jena.query.ARQ; @@ -76,8 +76,7 @@ import org.apache.jena.vocabulary.XSD; * </pre> */ -public class rdftests extends CmdGeneral -{ +public class rdftests extends CmdMain { static { JenaSystem.init(); LogCtl.setLog4j2(); diff --git a/jena-cmds/src/test/java/shacl/shacl_test.java b/jena-cmds/src/test/java/shacl/shacl_test.java index 9381d87b14..d9b704112b 100644 --- a/jena-cmds/src/test/java/shacl/shacl_test.java +++ b/jena-cmds/src/test/java/shacl/shacl_test.java @@ -20,12 +20,12 @@ package shacl; import org.apache.jena.atlas.logging.Log; import org.apache.jena.atlas.logging.LogCtl; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; import org.apache.jena.shacl.engine.ValidationContext; import org.apache.jena.shacl.testing.RunManifest; import org.apache.jena.sys.JenaSystem; -public class shacl_test extends CmdGeneral { +public class shacl_test extends CmdMain { static { LogCtl.setLogging(); diff --git a/jena-integration-tests/src/test/java/dboe/BaseSoakTest.java b/jena-integration-tests/src/test/java/dboe/BaseSoakTest.java index d3c1a440d1..afa2f3ccde 100644 --- a/jena-integration-tests/src/test/java/dboe/BaseSoakTest.java +++ b/jena-integration-tests/src/test/java/dboe/BaseSoakTest.java @@ -23,16 +23,16 @@ import java.util.List; import org.apache.jena.atlas.lib.Lib; import org.apache.jena.atlas.lib.RandomLib; import org.apache.jena.cmd.CmdException; -import org.apache.jena.cmd.CmdGeneral; +import org.apache.jena.cmd.CmdMain; -public abstract class BaseSoakTest extends CmdGeneral { +public abstract class BaseSoakTest extends CmdMain { protected final int MinOrder = 2; protected final int MinSize = 1; protected int MaxOrder = -1; protected int MaxSize = -1; protected int NumTest = -1; - + protected BaseSoakTest(String[] argv) { super(argv); } @@ -50,7 +50,7 @@ public abstract class BaseSoakTest extends CmdGeneral { List<String> args = super.getPositional(); if ( args.size() != 3 ) throw new CmdException("Usage: maxOrder maxSize NumTests"); - + try { MaxOrder = Integer.parseInt(args.get(0)); } catch (NumberFormatException ex) { throw new CmdException("Bad number for MaxOrder"); } @@ -76,10 +76,10 @@ public abstract class BaseSoakTest extends CmdGeneral { testsPerTick = 5; else if ( NumTest < 200 ) testsPerTick = 50; - else + else testsPerTick = 500; - - + + // ---- Format for line counter. int numLines = (int)Math.ceil( ((double)NumTest) / (testsPerTick * numOnLine) ); // Start of last line. @@ -90,11 +90,11 @@ public abstract class BaseSoakTest extends CmdGeneral { String format = "[%"+digits+"d] "; System.out.printf("TEST : %,d tests : Max Order=%d Max Items=%,d [tests per tick=%d]\n", NumTest, MaxOrder, MaxSize, testsPerTick); - + before(); - + int testCount = 1; - + for ( testCount = 1; testCount <= NumTest; testCount++ ) { if ( testCount % testsPerTick == 0 ) System.out.print("."); @@ -117,11 +117,11 @@ public abstract class BaseSoakTest extends CmdGeneral { failures++; } } - + // Did the last loop print a new line? if ( (testCount-1) % (testsPerTick*numOnLine) != 0 ) System.out.println(); - + after(); System.err.flush(); System.out.flush(); @@ -133,6 +133,6 @@ public abstract class BaseSoakTest extends CmdGeneral { protected abstract void runOneTest(int testCount, int order, int size); @Override - protected String getCommandName() { return Lib.className(this); } + protected String getCommandName() { return Lib.className(this); } }
