From 4e31256028792090168a81684747a2bef2069295 Mon Sep 17 00:00:00 2001 From: Andy Seaborne Date: Mon, 22 Dec 2025 18:53:46 +0000 Subject: [PATCH 1/3] GH-3670: Switch cmd class hierarchy: allow for command line, no exec --- .../src/main/java/arq/cmdline/CmdARQ.java | 4 +- .../src/main/java/arq/cmdline/CmdARQ_SSE.java | 12 +++--- .../org/apache/jena/cmd/CmdArgModule.java | 9 +++-- .../java/org/apache/jena/cmd/CmdGeneral.java | 22 ++++++----- .../java/org/apache/jena/cmd/CmdLineArgs.java | 8 ++++ .../java/org/apache/jena/cmd/CmdMain.java | 37 +++++++++---------- .../src/main/java/rdfpatch/CmdRDFPatch.java | 4 +- .../src/main/java/riotcmd/CmdLangParse.java | 4 +- jena-cmds/src/main/java/riotcmd/infer.java | 4 +- .../src/main/java/shacl/shacl_parse.java | 4 +- .../src/main/java/shacl/shacl_validate.java | 4 +- jena-cmds/src/main/java/shex/shex_parse.java | 4 +- .../src/main/java/shex/shex_validate.java | 4 +- .../java/tdb/xloader/CmdNodeTableBuilder.java | 4 +- .../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 fd6362c10b3..b3135dd3fda 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 @@ 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 7834a12f836..4c7969fc912 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 @@ /** 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 | string]" ; } + protected String getSummary() { + return getCommandName() + " [--file | string]"; + } @Override final protected void exec() @@ -40,6 +42,6 @@ final protected void exec() 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 545e601beee..2f5554cef9f 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 @@ import java.util.ArrayList; import java.util.List; -public abstract class CmdArgModule extends CmdMain +public abstract class CmdArgModule extends CmdLineArgs { private List modules = new ArrayList<>(); @@ -34,9 +34,9 @@ protected void addModule(ArgModuleGeneral argModule) { } @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 @@ private void forEach(Action action) { } } + @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 6054b7c63c2..a18800ab628 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 @@ 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 void addModule(ArgModuleGeneral argModule) { 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 @@ protected void processModulesAndArgs() { 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 void usage(PrintStream pStr) { 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 73192f5310d..452d5040d49 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 CmdLineArgs(String[] args) { 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 8425b8578da..a6056ab2700 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. + *

+ * Use this class for commands that follow the common pattern of processing arguments + * and then executing with no additional intermediate steps. + *

* 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 */ + *

new YourCommand(args).mainAndExit()
+ * which never returns and routes to System.exit. or call + *
new YourCommand(args).mainMethod()
+ * + * 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 int mainRun(boolean exitOnSuccess, boolean exitOnFailure) { 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 c0de8d9051a..23f895a6193 100644 --- a/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java +++ b/jena-cmds/src/main/java/rdfpatch/CmdRDFPatch.java @@ -26,11 +26,11 @@ 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 c1b66dea74a..0920c0634e6 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.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.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 a64f891db89..4d9fe663fd9 100644 --- a/jena-cmds/src/main/java/riotcmd/infer.java +++ b/jena-cmds/src/main/java/riotcmd/infer.java @@ -23,7 +23,7 @@ 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 @@ * 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 d0ed0f06825..0792fdc4b6d 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.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 @@ *

* Usage: shacl parse FILE */ -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 e850f737ac2..722244c331a 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 @@ 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 @@ *

* Usage: shacl validate [--text] --shapes SHAPES --data DATA */ -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 c694861a278..a069d2ada4e 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.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 @@ *

* Usage: shex parse FILE */ -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 300751b81bf..db3c1709263 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 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 @@ *

* Usage: shex validate [--text] --shapes SHAPES --data DATA */ -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 2f502c00a2b..d2d0a0a623c 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.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 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 8cde22aa68e..1ee545846b2 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 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 @@ * 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 @@ protected AbstractCmdxLoad(String stageName, String[] argv) { 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 406c556e092..cb6919b7436 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.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 @@ * */ -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 9381d87b141..d9b704112b9 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 @@ 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 d3c1a440d14..afa2f3ccde9 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 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 @@ protected void processModulesAndArgs() { List 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 @@ protected void exec() { 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 @@ else if ( NumTest < 200 ) 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 @@ else if ( NumTest < 200 ) 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 @@ else if ( NumTest < 200 ) 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); } } From 846fe0c5a356cb24c8265feb0d826fa6efb31a6c Mon Sep 17 00:00:00 2001 From: Andy Seaborne Date: Tue, 23 Dec 2025 10:04:27 +0000 Subject: [PATCH 2/3] Correct qparse name in help message --- jena-cmds/src/main/java/arq/qparse.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jena-cmds/src/main/java/arq/qparse.java b/jena-cmds/src/main/java/arq/qparse.java index 318632c1edc..af8fd9d9f65 100644 --- a/jena-cmds/src/main/java/arq/qparse.java +++ b/jena-cmds/src/main/java/arq/qparse.java @@ -110,11 +110,11 @@ protected void processModulesAndArgs() { printQuery = true; } - static String usage = qparse.class.getName() + " [--in syntax] [--out syntax] [--print=FORM] [\"query\"] | --query "; + static String usageArgs = "[--in syntax] [--out syntax] [--print=FORM] [\"query\"] | --query "; @Override protected String getSummary() { - return usage; + return getCommandName()+" "+usageArgs; } static final String divider = "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"; From 732f018e364b43f4e7dfc7d07b0e34add462d009 Mon Sep 17 00:00:00 2001 From: Andy Seaborne Date: Tue, 23 Dec 2025 10:11:51 +0000 Subject: [PATCH 3/3] Extract Servlet404 --- .../apache/jena/fuseki/main/FusekiServer.java | 34 ++-------- .../jena/fuseki/main/cmds/Servlet404.java | 64 +++++++++++++++++++ .../main/sys/FusekiServerArgsCustomiser.java | 7 +- 3 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java index 3672084eae8..5da4332c2bd 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java @@ -20,7 +20,6 @@ import static java.util.Objects.requireNonNull; import static org.apache.jena.atlas.lib.PropertyUtils.loadFromFile; -import static org.apache.jena.fuseki.Fuseki.serverLog; import java.io.IOException; import java.nio.file.Path; @@ -30,8 +29,6 @@ import jakarta.servlet.Filter; import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import org.apache.jena.atlas.json.JSON; import org.apache.jena.atlas.json.JsonObject; import org.apache.jena.atlas.lib.FileOps; @@ -50,6 +47,7 @@ import org.apache.jena.fuseki.build.FusekiConfig; import org.apache.jena.fuseki.ctl.*; import org.apache.jena.fuseki.main.cmds.FusekiMain; +import org.apache.jena.fuseki.main.cmds.Servlet404; import org.apache.jena.fuseki.main.sys.*; import org.apache.jena.fuseki.metrics.MetricsProvider; import org.apache.jena.fuseki.mod.prometheus.PrometheusMetricsProvider; @@ -67,7 +65,6 @@ import org.apache.jena.sys.JenaSystem; import org.apache.jena.system.G; import org.apache.jena.system.RDFDataException; -import org.apache.jena.web.HttpSC; import org.eclipse.jetty.ee11.servlet.DefaultServlet; import org.eclipse.jetty.ee11.servlet.FilterHolder; import org.eclipse.jetty.ee11.servlet.ServletContextHandler; @@ -359,7 +356,7 @@ public FusekiServer start() { // Post-start completion. Find the ports. Connector[] connectors = server.getServer().getConnectors(); if ( connectors.length == 0 ) - serverLog.warn("Start Fuseki: No connectors"); + Fuseki.serverLog.warn("Start Fuseki: No connectors"); // Extract the ports from the Connectors. Arrays.stream(connectors).forEach(c->{ @@ -1750,36 +1747,13 @@ private void servletsAndFilters(ServletContextHandler context) { context.addServlet(staticContent, "/"); } else { // Backstop servlet - // Jetty default is 404 on GET and 405 otherwise + // Jetty default is 404 on GET and 405 (Method not allowed) otherwise HttpServlet staticServlet = new Servlet404(); ServletHolder staticContent = new ServletHolder(staticServlet); context.addServlet(staticContent, "/"); } } - /** 404 for HEAD/GET/POST/PUT */ - static class Servlet404 extends HttpServlet { - - public Servlet404() {} - // service()? - @Override - protected void doHead(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doPut(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - //protected void doDelete(HttpServletRequest req, HttpServletResponse resp) - //protected void doTrace(HttpServletRequest req, HttpServletResponse resp) - //protected void doOptions(HttpServletRequest req, HttpServletResponse resp) - private static void err404(HttpServletRequest req, HttpServletResponse response) { - try { - response.sendError(HttpSC.NOT_FOUND_404, HttpSC.getMessage(HttpSC.NOT_FOUND_404)); - } catch (IOException ex) {} - } - } - private static void addServlet(ServletContextHandler context, String pathspec, HttpServlet httpServlet) { ServletHolder sh = new ServletHolder(httpServlet); context.addServlet(sh, pathspec); @@ -1812,7 +1786,7 @@ private static Server jettyServer(ServletContextHandler handler, int port, int m } private Server jettyServer(ServletContextHandler handler, String jettyServerConfig) { - serverLog.info("Jetty server config file = " + jettyServerConfig); + Fuseki.serverLog.info("Jetty server config file = " + jettyServerConfig); Server server = JettyServer.jettyServer(jettyServerConfig); server.setHandler(handler); return server; diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java new file mode 100644 index 00000000000..cee099a6d78 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.apache.jena.fuseki.main.cmds; + +import java.io.IOException; + +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.jena.web.HttpSC; + +/** 404 for HEAD/GET/POST/PUT */ +public class Servlet404 extends HttpServlet { + public Servlet404() {} + + // service()? + @Override + protected void doHead(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + // protected void doDelete(HttpServletRequest req, HttpServletResponse resp) + // protected void doTrace(HttpServletRequest req, HttpServletResponse resp) + // protected void doOptions(HttpServletRequest req, HttpServletResponse resp) + + private static void err404(HttpServletRequest req, HttpServletResponse response) { + try { + response.sendError(HttpSC.NOT_FOUND_404, HttpSC.getMessage(HttpSC.NOT_FOUND_404)); + } catch (IOException ex) {} + } +} diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java index 275a61877b5..51e39c9001e 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java @@ -44,13 +44,14 @@ * {@link FusekiAutoModule#start()} or from Java application code. * *

  • - * {@link #serverArgsModify} – Register or modify the argument setup to be + * {@link #serverArgsModify} – Called before command line processing. + * This call can register or modify the argument setup to be * used to parse the command line. *
  • *
  • * {@link #serverArgsPrepare} – Called after parsing the command line and - * recoding the command line settings in {@link ServerArgs}. Customisers can record - * argument values and flags. + * recording the command line settings in {@link ServerArgs}. + * Customisers can record argument values and flags. *
  • *
  • * {@link #serverArgsBuilder} – Called after the {@link ServerArgs} have