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 2f3a2930b9e673ca0f1f9495ce0e7f89b04ff5ea Author: Andy Seaborne <[email protected]> AuthorDate: Fri Apr 5 21:16:27 2024 +0100 GH-2392: Fuseki/webapp: settable context path --- .../apache/jena/fuseki/main/cmds/FusekiMain.java | 2 +- .../java/org/apache/jena/fuseki/cmd/FusekiCmd.java | 17 +++--- .../apache/jena/fuseki/cmd/JettyFusekiWebapp.java | 68 ++++++++-------------- 3 files changed, 33 insertions(+), 54 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java index 3010eb7b16..fbbda7ab6b 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java @@ -98,7 +98,7 @@ public class FusekiMain extends CmdARQ { // Static files. URLs are affected by argPathBase private static ArgDecl argBase = new ArgDecl(ArgDecl.HasValue, "base", "files"); - private static ArgDecl argCORS = new ArgDecl(ArgDecl.HasValue, "withCORS", "cors", "CORS", "cors-config"); + private static ArgDecl argCORS = new ArgDecl(ArgDecl.HasValue, "withCORS", "cors", "CORS", "cors-config"); private static ArgDecl argNoCORS = new ArgDecl(ArgDecl.NoValue, "noCORS", "no-cors"); private static ArgDecl argWithPing = new ArgDecl(ArgDecl.NoValue, "withPing", "ping"); private static ArgDecl argWithStats = new ArgDecl(ArgDecl.NoValue, "withStats", "stats"); diff --git a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java index a0599b07cc..d80d5b6fc9 100644 --- a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java +++ b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/FusekiCmd.java @@ -76,7 +76,6 @@ public class FusekiCmd { private static ArgDecl argMemTDB = new ArgDecl(ArgDecl.NoValue, "memtdb", "memTDB", "tdbmem"); // And not ModLocation. private static ArgDecl argTDB = new ArgDecl(ArgDecl.HasValue, "loc", "location", "tdb"); - private static ArgDecl argAssemblerDecl = new ArgDecl(ArgDecl.HasValue, "desc", "dataset"); // RDFS vocabulary applied to command line defined dataset. private static ArgDecl argRDFS = new ArgDecl(ArgDecl.HasValue, "rdfs"); @@ -87,6 +86,7 @@ public class FusekiCmd { private static ArgDecl argFusekiConfig = new ArgDecl(ArgDecl.HasValue, "config", "conf"); private static ArgDecl argJettyConfig = new ArgDecl(ArgDecl.HasValue, "jetty-config", "jetty"); private static ArgDecl argGZip = new ArgDecl(ArgDecl.HasValue, "gzip"); + private static ArgDecl argContextPath = new ArgDecl(ArgDecl.HasValue, "pathBase", "contextPath"); // Deprecated. Use shiro. private static ArgDecl argBasicAuth = new ArgDecl(ArgDecl.HasValue, "basic-auth"); @@ -130,10 +130,6 @@ public class FusekiCmd { add(argMemTDB, "--memTDB", "Create an in-memory, non-persistent dataset using TDB (testing only)"); - // This has proven confusing because it is like --conf. -// add(argAssemblerDecl, "--desc", -// "Assembler description of a single database"); - add(argRDFS, "--rdfs=FILE", "Apply RDFS on top of the dataset"); add(argPort, "--port", @@ -145,10 +141,13 @@ public class FusekiCmd { "Global timeout applied to queries (value in ms) -- format is X[,Y] "); add(argUpdate, "--update", "Allow updates (via SPARQL Update and SPARQL HTTP Update)"); + add(argContextPath, "--contextPath=PATH", + "Set up the server context (root) path"); add(argFusekiConfig, "--config=", "Use a configuration file to determine the services"); add(argJettyConfig, "--jetty-config=FILE", - "Set up the server (not services) with a Jetty XML file"); + "Set up the server (not services) with a Jetty XML file"); + add(argBasicAuth); add(argGZip, "--gzip=on|off", "Enable GZip compression (HTTP Accept-Encoding) if request header set"); @@ -194,8 +193,6 @@ public class FusekiCmd { x++; if ( contains(argFile) ) x++; - if ( contains(argAssemblerDecl) ) - x++; if ( contains(argTDB) ) x++; if ( contains(argMemTDB) ) @@ -353,6 +350,10 @@ public class FusekiCmd { } } + if ( contains(argContextPath) ) { + jettyServerConfig.contextPath = getValue(argContextPath); + } + if ( contains(argJettyConfig) ) { jettyServerConfig.jettyConfigFile = getValue(argJettyConfig); if ( !FileOps.exists(jettyServerConfig.jettyConfigFile) ) diff --git a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/JettyFusekiWebapp.java b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/JettyFusekiWebapp.java index 7361725d2f..825359e1d0 100644 --- a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/JettyFusekiWebapp.java +++ b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/cmd/JettyFusekiWebapp.java @@ -44,7 +44,6 @@ import org.eclipse.jetty.util.resource.ResourceFactory; import org.eclipse.jetty.xml.XmlConfiguration; /** Standalone full server, not run as a WAR file. - * Used in testing and development. * * SPARQLServer is the Jena server instance which wraps/utilizes * {@link org.eclipse.jetty.server.Server}. This class provides @@ -73,11 +72,10 @@ public class JettyFusekiWebapp { private Server server = null; private ServletContext servletContext = null; - // webapp setup - standard maven layout - public static String contextpath = "/"; - // Standalone jar + // Location of webapp static resources. + // -- Standalone jar public static final String baseResource1 = "webapp"; - // Development + // -- Development public static final String baseResource2 = "target/webapp"; /** @@ -86,7 +84,6 @@ public class JettyFusekiWebapp { * name etc. * @param config */ - public static void initializeServer(JettyServerConfig config) { instance = new JettyFusekiWebapp(config); } @@ -171,6 +168,7 @@ public class JettyFusekiWebapp { baseResource4 = HOME+"/"+baseResource2; } + // The location in the webapp, not the URL names. String baseResource = tryBaseResource(baseResource1, null); baseResource = tryBaseResource(baseResource2, baseResource); baseResource = tryBaseResource(baseResource3, baseResource); @@ -186,8 +184,8 @@ public class JettyFusekiWebapp { } webapp.setDescriptor(baseResource+"/WEB-INF/web.xml"); - webapp.getContext().getServletContextHandler().setBaseResourceAsString(baseResource); webapp.setContextPath(contextPath); + webapp.getContext().getServletContextHandler().setBaseResourceAsString(baseResource); //-- Jetty setup for the ServletContext logger. // The name of the Jetty-allocated slf4j/log4j logger is @@ -275,30 +273,7 @@ public class JettyFusekiWebapp { securityHandler.addConstraintMapping(mapping); context.setSecurityHandler(securityHandler); - -// Constraint constraint = new Constraint(); -// constraint.setName(Constraint.__BASIC_AUTH); -// constraint.setRoles(new String[]{"fuseki"}); -// constraint.setAuthenticate(true); -// -// ConstraintMapping mapping = new ConstraintMapping(); -// mapping.setConstraint(constraint); -// mapping.setPathSpec("/*"); -// -// IdentityService identService = new DefaultIdentityService(); -// -// securityHandler.addConstraintMapping(mapping); -// securityHandler.setIdentityService(identService); -// -// HashLoginService loginService = new HashLoginService("Fuseki Authentication", authfile); -// loginService.setIdentityService(identService); -// -// securityHandler.setLoginService(loginService); -// securityHandler.setAuthenticator(new BasicAuthenticator()); -// -// context.setSecurityHandler(securityHandler); -// -// serverLog.debug("Basic Auth Configuration = " + authfile); + serverLog.debug("Basic Auth Configuration = " + authfile); } /** @@ -322,21 +297,10 @@ public class JettyFusekiWebapp { return ResourceFactory.root().newResource(filename); } - private void configServer(String jettyConfig) { - try { - serverLog.info("Jetty server config file = " + jettyConfig); - server = new Server(); - Resource configXml = ResourceFactory.root().newResource(jettyConfig); - XmlConfiguration configuration = new XmlConfiguration(configXml); - configuration.configure(server); - serverConnector = (ServerConnector)server.getConnectors()[0]; - } catch (Exception ex) { - serverLog.error("SPARQLServer: Failed to configure server: " + ex.getMessage(), ex); - throw new FusekiException("Failed to configure a server using configuration file '" + jettyConfig + "'"); - } - } - private void defaultServerConfig(int port, boolean loopback) { + // At least 3. +// ThreadPool threadPool = new QueuedThreadPool(4); +// server = new Server(threadPool); server = new Server(); HttpConnectionFactory f1 = new HttpConnectionFactory(); // Some people do try very large operations ... really, should use POST. @@ -357,4 +321,18 @@ public class JettyFusekiWebapp { connector.setHost("localhost"); serverConnector = connector; } + + private void configServer(String jettyConfig) { + try { + serverLog.info("Jetty server config file = " + jettyConfig); + server = new Server(); + Resource configXml = ResourceFactory.root().newResource(jettyConfig); + XmlConfiguration configuration = new XmlConfiguration(configXml); + configuration.configure(server); + serverConnector = (ServerConnector)server.getConnectors()[0]; + } catch (Exception ex) { + serverLog.error("SPARQLServer: Failed to configure server: " + ex.getMessage(), ex); + throw new FusekiException("Failed to configure a server using configuration file '" + jettyConfig + "'"); + } + } }
