Return-Path: X-Original-To: apmail-jena-commits-archive@www.apache.org Delivered-To: apmail-jena-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 76DB310B7B for ; Mon, 23 Dec 2013 19:57:55 +0000 (UTC) Received: (qmail 22797 invoked by uid 500); 23 Dec 2013 19:57:55 -0000 Delivered-To: apmail-jena-commits-archive@jena.apache.org Received: (qmail 22771 invoked by uid 500); 23 Dec 2013 19:57:55 -0000 Mailing-List: contact commits-help@jena.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jena.apache.org Delivered-To: mailing list commits@jena.apache.org Received: (qmail 22764 invoked by uid 99); 23 Dec 2013 19:57:55 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 23 Dec 2013 19:57:55 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_FILL_THIS_FORM_SHORT X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 23 Dec 2013 19:57:51 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id EA645238890B; Mon, 23 Dec 2013 19:57:30 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1553196 [1/2] - in /jena/branches/jena-fuseki-new-ui: ./ bin/ pages/admin/ src-dev/dev/ src/main/java/org/apache/jena/fuseki/ src/main/java/org/apache/jena/fuseki/mgt/ src/main/java/org/apache/jena/fuseki/server/ src/main/java/org/apache/j... Date: Mon, 23 Dec 2013 19:57:30 -0000 To: commits@jena.apache.org From: andy@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131223195730.EA645238890B@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: andy Date: Mon Dec 23 19:57:29 2013 New Revision: 1553196 URL: http://svn.apache.org/r1553196 Log: Move dataset building into webapp context listener. Added: jena/branches/jena-fuseki-new-ui/classpath-jetty-8.1.11 jena/branches/jena-fuseki-new-ui/classpath-jetty-9.1.0 jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java Removed: jena/branches/jena-fuseki-new-ui/bin/ jena/branches/jena-fuseki-new-ui/src-dev/dev/DevFuseki.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/MgtCmdServlet.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/MgtFunctions.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocity.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SimpleVelocityServlet.java Modified: jena/branches/jena-fuseki-new-ui/pages/admin/data-management.html jena/branches/jena-fuseki-new-ui/pom.xml jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/Fuseki.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/FusekiCmd.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDescription.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ManagementServer.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/TestAuth.java jena/branches/jena-fuseki-new-ui/war-web.xml Added: jena/branches/jena-fuseki-new-ui/classpath-jetty-8.1.11 URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/classpath-jetty-8.1.11?rev=1553196&view=auto ============================================================================== --- jena/branches/jena-fuseki-new-ui/classpath-jetty-8.1.11 (added) +++ jena/branches/jena-fuseki-new-ui/classpath-jetty-8.1.11 Mon Dec 23 19:57:29 2013 @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Added: jena/branches/jena-fuseki-new-ui/classpath-jetty-9.1.0 URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/classpath-jetty-9.1.0?rev=1553196&view=auto ============================================================================== --- jena/branches/jena-fuseki-new-ui/classpath-jetty-9.1.0 (added) +++ jena/branches/jena-fuseki-new-ui/classpath-jetty-9.1.0 Mon Dec 23 19:57:29 2013 @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: jena/branches/jena-fuseki-new-ui/pages/admin/data-management.html URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/pages/admin/data-management.html?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/pages/admin/data-management.html (original) +++ jena/branches/jena-fuseki-new-ui/pages/admin/data-management.html Mon Dec 23 19:57:29 2013 @@ -80,7 +80,7 @@ -
+
@@ -106,7 +106,7 @@

Create database (from Assembler Description)

- +
Database assembler description file:
Modified: jena/branches/jena-fuseki-new-ui/pom.xml URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/pom.xml?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/pom.xml (original) +++ jena/branches/jena-fuseki-new-ui/pom.xml Mon Dec 23 19:57:29 2013 @@ -77,7 +77,6 @@ 8.1.11.v20130520 - 1.7 1.2.2 @@ -170,12 +169,6 @@ - org.apache.velocity - velocity - 1.7 - - - org.slf4j slf4j-api ${ver.slf4j} Modified: jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java (original) +++ jena/branches/jena-fuseki-new-ui/src-dev/dev/PROJECT.java Mon Dec 23 19:57:29 2013 @@ -25,31 +25,26 @@ public class PROJECT { // DEFs // Webapp-ization - // Validators + // Shiro - security. + // Initialize in webapp. See FusekiCmd.exec + // Need server wide configuration - ARQ context setting. + // ContextPath + // Fuseki.configure/defaultConfiguration + + // 1/ have command line insert direct into the DatasetRegistry? + // 2/ + // All TODO and XXX // Configuration and startup. // Change to using a real webapp. - // WebContent.ctXYZ for each WebContent.contentTypeXYZ - // txn and nonTxn server set up for tests. // Enables, disable R/RW on SPARQL_UberServlet(renamed) and quads operations. // Need a switch on whether quadding is support and whether it's RW or not. - // Remove all direct naming (put in separate servlet if ever needed) - // last place : SPARQL_UberServlet - // Document (write/update) all protocol modes. - // TESTS - - // JENA-201 - WAR Fuseki. - // WEB.xml - // ContextPath in uber dispatch. - // FusekiServletContextListener - - // SPARQLServer.start kicks FusekiServletContextListener which could then do the main initialization. // The whole X_Config thing // Check compression enabled for UberServlet Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/Fuseki.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/Fuseki.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/Fuseki.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/Fuseki.java Mon Dec 23 19:57:29 2013 @@ -187,44 +187,44 @@ public class Fuseki { private static Server jettyServer ; private static Server mgtJettyServer ; - /** - * set/specify the {@link org.apache.jena.fuseki.server.SPARQLServer} - * instance. - */ - public static void setServer(SPARQLServer _server) { - server = _server ; - } - - /** get the {@link org.apache.jena.fuseki.server.SPARQLServer} instance. */ - public static SPARQLServer getServer() { - return server ; - } - - /** - * set/specify the {@link org.apache.jena.fuseki.server.SPARQLServer} - * instance. - */ - public static void setJettyServer(Server _server) { - jettyServer = _server ; - } - - /** get the {@link org.apache.jena.fuseki.server.SPARQLServer} instance. */ - public static Server getJettyServer() { - return jettyServer ; - } - - /** - * set/specify the {@link org.apache.jena.fuseki.server.SPARQLServer} - * instance. - */ - public static void setJettyMgtServer(Server _server) { - mgtJettyServer = _server ; - } - - /** get the {@link org.apache.jena.fuseki.server.SPARQLServer} instance. */ - public static Server getJettyMgtServer() { - return mgtJettyServer ; - } +// /** +// * set/specify the {@link SPARQLServer} +// * instance. +// */ +// public static void setServer(SPARQLServer _server) { +// server = _server ; +// } +// +// /** get the {@link SPARQLServer} instance. */ +// public static SPARQLServer getServer() { +// return server ; +// } +// +// /** +// * set/specify the {@link org.apache.jena.fuseki.server.SPARQLServer} +// * instance. +// */ +// public static void setJettyServer(Server _server) { +// jettyServer = _server ; +// } +// +// /** get the {@link org.apache.jena.fuseki.server.SPARQLServer} instance. */ +// public static Server getJettyServer() { +// return jettyServer ; +// } +// +// /** +// * set/specify the {@link org.apache.jena.fuseki.server.SPARQLServer} +// * instance. +// */ +// public static void setJettyMgtServer(Server _server) { +// mgtJettyServer = _server ; +// } +// +// /** get the {@link org.apache.jena.fuseki.server.SPARQLServer} instance. */ +// public static Server getJettyMgtServer() { +// return mgtJettyServer ; +// } // Force a call to init. static { Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/FusekiCmd.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/FusekiCmd.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/FusekiCmd.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/FusekiCmd.java Mon Dec 23 19:57:29 2013 @@ -18,28 +18,24 @@ package org.apache.jena.fuseki ; -import static org.apache.jena.fuseki.Fuseki.serverLog ; - import java.io.File ; import java.io.InputStream ; import java.util.List ; import org.apache.jena.atlas.io.IO ; -import org.apache.jena.atlas.lib.DS ; import org.apache.jena.atlas.lib.FileOps ; import org.apache.jena.atlas.lib.Lib ; import org.apache.jena.atlas.lib.StrUtils ; import org.apache.jena.atlas.logging.LogCtl ; import org.apache.jena.fuseki.mgt.ManagementServer ; -import org.apache.jena.fuseki.server.DatasetRef ; -import org.apache.jena.fuseki.server.FusekiConfig ; +import org.apache.jena.fuseki.server.FusekiServletContextListener ; import org.apache.jena.fuseki.server.SPARQLServer ; import org.apache.jena.fuseki.server.ServerConfig ; +import org.apache.jena.fuseki.server.ServerInitialConfig ; import org.apache.jena.riot.Lang ; import org.apache.jena.riot.RDFDataMgr ; import org.apache.jena.riot.RDFLanguages ; import org.apache.jena.riot.SysRIOT ; -import org.eclipse.jetty.server.Server ; import org.eclipse.jetty.servlet.ServletContextHandler ; import org.slf4j.Logger ; import arq.cmd.CmdException ; @@ -49,7 +45,6 @@ import arq.cmdline.ModDatasetAssembler ; import com.hp.hpl.jena.query.ARQ ; import com.hp.hpl.jena.query.Dataset ; -import com.hp.hpl.jena.sparql.core.DatasetGraph ; import com.hp.hpl.jena.sparql.core.DatasetGraphFactory ; import com.hp.hpl.jena.tdb.TDB ; import com.hp.hpl.jena.tdb.TDBFactory ; @@ -59,34 +54,36 @@ import com.hp.hpl.jena.tdb.transaction.T public class FusekiCmd extends CmdARQ { private static String log4Jsetup = StrUtils.strjoinNL ("## Plain output to stdout", - "log4j.appender.jena.plain=org.apache.log4j.ConsoleAppender", - "log4j.appender.jena.plain.target=System.out", - "log4j.appender.jena.plain.layout=org.apache.log4j.PatternLayout", - "log4j.appender.jena.plain.layout.ConversionPattern=%d{HH:mm:ss} %-5p %m%n", + "log4j.appender.jena.plainstdout=org.apache.log4j.ConsoleAppender", + "log4j.appender.jena.plainstdout.target=System.out", + "log4j.appender.jena.plainstdout.layout=org.apache.log4j.PatternLayout", + "log4j.appender.jena.plainstdout.layout.ConversionPattern=%d{HH:mm:ss} %-10c{1} %-5p %m%n", - "## Plain output with level, to stderr", - "log4j.appender.jena.plainlevel=org.apache.log4j.ConsoleAppender", - "log4j.appender.jena.plainlevel.target=System.err", - "log4j.appender.jena.plainlevel.layout=org.apache.log4j.PatternLayout", - "log4j.appender.jena.plainlevel.layout.ConversionPattern=%d{HH:mm:ss} %-5p %m%n", + "## Plain output to stderr", + "log4j.appender.jena.plainstderr=org.apache.log4j.ConsoleAppender", + "log4j.appender.jena.plainstderr.target=System.err", + "log4j.appender.jena.plainstderr.layout=org.apache.log4j.PatternLayout", + "log4j.appender.jena.plainstderr.layout.ConversionPattern=%d{HH:mm:ss} %-10c{1} %-5p %m%n", - "## Everything", "log4j.rootLogger=INFO, jena.plain", + "## Everything", + "log4j.rootLogger=INFO, jena.plainstdout", "log4j.logger.com.hp.hpl.jena=WARN", "log4j.logger.org.openjena=WARN", "log4j.logger.org.apache.jena=WARN", "# System logs.", - "log4j.logger."+Fuseki.serverLogName+"=INFO", - "log4j.logger."+Fuseki.requestLogName+"=INFO", - "log4j.logger."+Fuseki.adminLogName+"=INFO", - "log4j.logger."+Fuseki.validationLogName+"=INFO", + "log4j.logger." + Fuseki.serverLogName + "=INFO", + "log4j.logger." + Fuseki.requestLogName + "=INFO", + "log4j.logger." + Fuseki.adminLogName + "=INFO", + "log4j.logger." + Fuseki.validationLogName + "=INFO", + "log4j.logger." + Fuseki.configLogName + "=INFO", "log4j.logger.org.apache.jena.tdb.loader=INFO", "log4j.logger.org.eclipse.jetty=ERROR" , "## Parser output", "log4j.additivity" + SysRIOT.riotLoggerName + "=false", - "log4j.logger." + SysRIOT.riotLoggerName + "=INFO, jena.plainlevel" + "log4j.logger." + SysRIOT.riotLoggerName + "=INFO, jena.plainstdout" ) ; // Set logging. @@ -170,24 +167,41 @@ public class FusekiCmd extends CmdARQ { new FusekiCmd(argv).mainRun() ; } - static class ServerParams { // == ServerConfig? - public int port = 3030 ; - public int mgtPort = -1 ; - public boolean listenLocal = false ; - - public DatasetGraph dsg = null ; - public String datasetPath = null ; - public boolean allowUpdate = false ; +// /** Port to run the server service on */ +// public int port ; +// /** Port for the management interface : -1 for no management interface */ +// public int mgtPort ; +// /** Port for the pages UI : this can be the same as the services port. */ +// public int pagesPort ; +// /** Jetty config file - if null, use the built-in configuration of Jetty */ +// public String jettyConfigFile = null ; +// /** Listen only on the loopback (localhost) interface */ +// public boolean loopback = false ; +// /** The local directory for serving the static pages */ +// public String pages ; +// /** Enable Accept-Encoding compression. Set to false by default.*/ +// public boolean enableCompression = false ; +// +// /** Enable additional logging */ +// public boolean verboseLogging = false ; +// /** +// * Authentication config file used to setup Jetty Basic auth, if a Jetty config file was set this is ignored since Jetty config allows much more complex auth methods to be implemented +// */ +// public String authConfigFile ; - public String fusekiConfigFile = null ; - public boolean enableCompression = true ; - public String jettyConfigFile = null ; - public String authConfigFile = null ; - public String homeDir = null ; - public String pagesDir = null ; - public String staticContentDir = null ; // After adjusting. + public String homeDir = null ; + private ServerConfig jettyServerConfig = new ServerConfig() ; + { + jettyServerConfig.port = 3030 ; + jettyServerConfig.mgtPort = 3031 ; + jettyServerConfig.pagesPort = jettyServerConfig.port ; + jettyServerConfig.jettyConfigFile = null ; + jettyServerConfig.pages = Fuseki.PagesStatic ; + jettyServerConfig.enableCompression = true ; + jettyServerConfig.verboseLogging = false ; } - private ServerParams cmdLineParams = new ServerParams() ; + + private ServerInitialConfig cmdLineDataset = new ServerInitialConfig() ; public FusekiCmd(String... argv) { super(argv) ; @@ -217,7 +231,7 @@ public class FusekiCmd extends CmdARQ { add(argHome, "--home=DIR", "Root of Fuseki installation (overrides environment variable FUSEKI_HOME)") ; add(argGZip, "--gzip=on|off", "Enable GZip compression (HTTP Accept-Encoding) if request header set") ; - add(argUber) ; + //add(argUber) ; // add(argGSP) ; super.modVersion.addClass(TDB.class) ; @@ -236,12 +250,14 @@ public class FusekiCmd extends CmdARQ { int x = 0 ; Logger log = Fuseki.serverLog ; - ServerParams params = cmdLineParams ; - + if ( contains(argFusekiConfig) ) - params.fusekiConfigFile = getValue(argFusekiConfig) ; + cmdLineDataset.fusekiConfigFile = getValue(argFusekiConfig) ; ArgDecl assemblerDescDecl = new ArgDecl(ArgDecl.HasValue, "desc", "dataset") ; + + // ---- Datasets + if ( contains(argMem) ) x++ ; if ( contains(argFile) ) @@ -253,10 +269,9 @@ public class FusekiCmd extends CmdARQ { if ( contains(argMemTDB) ) x++ ; - if ( params.fusekiConfigFile != null ) { + if ( cmdLineDataset.fusekiConfigFile != null ) { if ( x > 1 ) - throw new CmdException( - "Dataset specificed on the command line and also a configuration file specificed.") ; + throw new CmdException("Dataset specified on the command line and also a configuration file specified.") ; } else { if ( x == 0 ) throw new CmdException("Required: either --config=FILE or one of --mem, --file, --loc or --desc") ; @@ -264,11 +279,12 @@ public class FusekiCmd extends CmdARQ { if ( contains(argMem) ) { log.info("Dataset: in-memory") ; - params.dsg = DatasetGraphFactory.createMem() ; + cmdLineDataset = new ServerInitialConfig() ; + cmdLineDataset.dsg = DatasetGraphFactory.createMem() ; } + if ( contains(argFile) ) { - params.dsg = DatasetGraphFactory.createMem() ; - // replace by RiotLoader after ARQ refresh. + cmdLineDataset.dsg = DatasetGraphFactory.createMem() ; String filename = getValue(argFile) ; log.info("Dataset: in-memory: load file: " + filename) ; if ( !FileOps.exists(filename) ) @@ -280,14 +296,15 @@ public class FusekiCmd extends CmdARQ { InputStream input = IO.openFile(filename) ; if ( RDFLanguages.isQuads(language) ) - RDFDataMgr.read(params.dsg, filename) ; + RDFDataMgr.read(cmdLineDataset.dsg, filename) ; else - RDFDataMgr.read(params.dsg.getDefaultGraph(), filename) ; + RDFDataMgr.read(cmdLineDataset.dsg.getDefaultGraph(), filename) ; } if ( contains(argMemTDB) ) { log.info("TDB dataset: in-memory") ; - params.dsg = TDBFactory.createDatasetGraph() ; + cmdLineDataset = new ServerInitialConfig() ; + cmdLineDataset.dsg = TDBFactory.createDatasetGraph() ; } if ( contains(argTDB) ) { @@ -300,28 +317,34 @@ public class FusekiCmd extends CmdARQ { throw new CmdException("Directory not found: " + dir) ; log.info("TDB dataset: directory=" + dir) ; } - params.dsg = TDBFactory.createDatasetGraph(dir) ; + cmdLineDataset = new ServerInitialConfig() ; + cmdLineDataset.dsg = TDBFactory.createDatasetGraph(dir) ; } // Otherwise if ( contains(assemblerDescDecl) ) { log.info("Dataset from assembler") ; Dataset ds = modDataset.createDataset() ; - if ( ds != null ) - params.dsg = ds.asDatasetGraph() ; + cmdLineDataset.dsg = ds.asDatasetGraph() ; } - if ( contains(argFusekiConfig) ) { - if ( params.dsg != null ) - throw new CmdException( - "Dataset specificed on the command line and also a configuration file specificed.") ; - params.fusekiConfigFile = getValue(argFusekiConfig) ; + if ( cmdLineDataset.dsg != null ) { + if ( getPositional().size() == 0 ) + throw new CmdException("No dataset path name given") ; + if ( getPositional().size() > 1 ) + throw new CmdException("Multiple dataset path names given") ; + cmdLineDataset.datasetPath = getPositionalArg(0) ; + if ( cmdLineDataset.datasetPath.length() > 0 && !cmdLineDataset.datasetPath.startsWith("/") ) + throw new CmdException("Dataset path name must begin with a /: " + cmdLineDataset.datasetPath) ; + + cmdLineDataset.allowUpdate = contains(argAllowUpdate) ; } + // ---- Jetty server if ( contains(argPort) ) { String portStr = getValue(argPort) ; try { - params.port = Integer.parseInt(portStr) ; + jettyServerConfig.port = Integer.parseInt(portStr) ; } catch (NumberFormatException ex) { throw new CmdException(argPort.getKeyName() + " : bad port number: " + portStr) ; } @@ -330,29 +353,14 @@ public class FusekiCmd extends CmdARQ { if ( contains(argMgtPort) ) { String mgtPortStr = getValue(argMgtPort) ; try { - params.mgtPort = Integer.parseInt(mgtPortStr) ; + jettyServerConfig.mgtPort = Integer.parseInt(mgtPortStr) ; } catch (NumberFormatException ex) { throw new CmdException(argMgtPort.getKeyName() + " : bad port number: " + mgtPortStr) ; } } if ( contains(argLocalhost) ) - params.listenLocal = true ; - - if ( params.fusekiConfigFile == null && params.dsg == null ) - throw new CmdException("No dataset defined and no configuration file: " + argUsage) ; - - if ( params.dsg != null ) { - if ( getPositional().size() == 0 ) - throw new CmdException("No dataset path name given") ; - if ( getPositional().size() > 1 ) - throw new CmdException("Multiple dataset path names given") ; - params.datasetPath = getPositionalArg(0) ; - if ( params.datasetPath.length() > 0 && !params.datasetPath.startsWith("/") ) - throw new CmdException("Dataset path name must begin with a /: " + params.datasetPath) ; - - params.allowUpdate = contains(argAllowUpdate) ; - } + jettyServerConfig.loopback = true ; if ( contains(argTimeout) ) { String str = getValue(argTimeout) ; @@ -360,35 +368,32 @@ public class FusekiCmd extends CmdARQ { } if ( contains(argJettyConfig) ) { - params.jettyConfigFile = getValue(argJettyConfig) ; - if ( !FileOps.exists(params.jettyConfigFile) ) - throw new CmdException("No such file: " + params.jettyConfigFile) ; + jettyServerConfig.jettyConfigFile = getValue(argJettyConfig) ; + if ( !FileOps.exists(jettyServerConfig.jettyConfigFile) ) + throw new CmdException("No such file: " + jettyServerConfig.jettyConfigFile) ; } if ( contains(argBasicAuth) ) { - params.authConfigFile = getValue(argBasicAuth) ; - if ( !FileOps.exists(params.authConfigFile) ) - throw new CmdException("No such file: " + params.authConfigFile) ; + jettyServerConfig.authConfigFile = getValue(argBasicAuth) ; + if ( !FileOps.exists(jettyServerConfig.authConfigFile) ) + throw new CmdException("No such file: " + jettyServerConfig.authConfigFile) ; } if ( contains(argHome) ) { List args = super.getValues(argHome) ; - params.homeDir = args.get(args.size() - 1) ; + homeDir = args.get(args.size() - 1) ; } if ( contains(argPages) ) { List args = super.getValues(argPages) ; - params.pagesDir = args.get(args.size() - 1) ; + jettyServerConfig.pages = args.get(args.size() - 1) ; } if ( contains(argGZip) ) { if ( !hasValueOfTrue(argGZip) && !hasValueOfFalse(argGZip) ) throw new CmdException(argGZip.getNames().get(0) + ": Not understood: " + getValue(argGZip)) ; - params.enableCompression = super.hasValueOfTrue(argGZip) ; + jettyServerConfig.enableCompression = super.hasValueOfTrue(argGZip) ; } - - if ( contains(argUber) ) - Fuseki.configLog.info("Dynamic dispatch is now the only mode: --uber is not needed" ); } private static String sort_out_dir(String path) { @@ -401,136 +406,85 @@ public class FusekiCmd extends CmdARQ { @Override protected void exec() { Fuseki.init() ; - ServerParams params = cmdLineParams ; - params = clean(params) ; - initializeServer(params) ; - //initializeSystem(params) ; - + FusekiServletContextListener.initialSetup = cmdLineDataset ; + // For standalone, command line use ... + SPARQLServer server = initializeServer(jettyServerConfig) ; + // Not needed for webapp version. + //initializeManagement(server, params); + server.start() ; + try { server.getServer().join() ; } + catch (Exception ex) {} + System.exit(0) ; } - private ServerParams clean(ServerParams params) { - if ( params.homeDir == null ) { + private String pagesDir(String pages) { + if ( homeDir == null ) { if ( System.getenv(Fuseki.FusekiHomeEnv) != null ) - params.homeDir = System.getenv(Fuseki.FusekiHomeEnv) ; + homeDir = System.getenv(Fuseki.FusekiHomeEnv) ; else - params.homeDir = "." ; + homeDir = "." ; } - params.homeDir = sort_out_dir(params.homeDir) ; - Fuseki.configLog.info("Home Directory: " + FileOps.fullDirectoryPath(params.homeDir)) ; - if ( !FileOps.exists(params.homeDir) ) - Fuseki.configLog.warn("No such directory for Fuseki home: " + params.homeDir) ; + homeDir = sort_out_dir(homeDir) ; + Fuseki.configLog.info("Home Directory: " + FileOps.fullDirectoryPath(homeDir)) ; + if ( !FileOps.exists(homeDir) ) + Fuseki.configLog.warn("No such directory for Fuseki home: " + homeDir) ; - params.staticContentDir = params.pagesDir ; - if ( params.staticContentDir == null ) - params.staticContentDir = params.homeDir + Fuseki.PagesStatic ; + if ( pages == null ) + pages = homeDir + Fuseki.PagesStatic ; - Fuseki.configLog.debug("Static Content Directory: " + FileOps.fullDirectoryPath(params.staticContentDir)) ; + Fuseki.configLog.debug("Static Content Directory: " + FileOps.fullDirectoryPath(pages)) ; - if ( !FileOps.exists(params.staticContentDir) ) { - Fuseki.configLog.warn("No such directory for static content: " - + FileOps.fullDirectoryPath(params.staticContentDir)) ; + if ( !FileOps.exists(pages) ) { + Fuseki.configLog.warn("No such directory for static content: "+ FileOps.fullDirectoryPath(pages)) ; Fuseki.configLog.warn("You may need to set the --pages or --home option to configure static content correctly") ; } - - if ( params.jettyConfigFile != null ) - Fuseki.configLog.info("Jetty configuration: " + params.jettyConfigFile) ; - - return params ; + return pages ; } - - private void initializeServer(ServerParams params) { - List cmdLineDatasets ; - - if ( params.fusekiConfigFile != null ) { - Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ; - cmdLineDatasets = FusekiConfig.configure(params.fusekiConfigFile) ; - } else - cmdLineDatasets = FusekiConfig.defaultConfiguration(params.datasetPath, params.dsg, params.allowUpdate, params.listenLocal) ; - - List additionalDatasets = FusekiConfig.additional() ; - - - ServerConfig serverConfig = new ServerConfig() ; - // Default values - serverConfig.port = 3030 ; - serverConfig.mgtPort = 3031 ; - serverConfig.pagesPort = serverConfig.port ; - serverConfig.jettyConfigFile = null ; - serverConfig.pages = Fuseki.PagesStatic ; - serverConfig.enableCompression = true ; - serverConfig.verboseLogging = false ; - - // - serverConfig.datasets = DS.list() ; - serverConfig.datasets.addAll(cmdLineDatasets) ; - serverConfig.datasets.addAll(additionalDatasets) ; - - serverConfig.port = params.port ; - serverConfig.pages = params.staticContentDir ; - serverConfig.mgtPort = params.mgtPort ; - serverConfig.pagesPort = params.port ; - serverConfig.loopback = params.listenLocal ; - serverConfig.enableCompression = params.enableCompression ; - serverConfig.jettyConfigFile = params.jettyConfigFile ; - serverConfig.authConfigFile = params.authConfigFile ; - serverConfig.verboseLogging = (super.isVerbose() || super.isDebug()) ; + private SPARQLServer initializeServer(ServerConfig serverConfig) { +// ServerConfig serverConfig = new ServerConfig() ; +// // Default values +// serverConfig.port = 3030 ; +// serverConfig.mgtPort = 3031 ; +// serverConfig.pagesPort = serverConfig.port ; +// serverConfig.jettyConfigFile = null ; +// serverConfig.pages = Fuseki.PagesStatic ; +// serverConfig.enableCompression = true ; +// serverConfig.verboseLogging = false ; +// +// serverConfig.port = params.port ; +// serverConfig.pages = params.pages ; +// serverConfig.mgtPort = params.mgtPort ; +// serverConfig.pagesPort = params.port ; +// serverConfig.loopback = params.loopback ; +// serverConfig.enableCompression = params.enableCompression ; +// serverConfig.jettyConfigFile = params.jettyConfigFile ; +// serverConfig.authConfigFile = params.authConfigFile ; +// serverConfig.verboseLogging = (super.isVerbose() || super.isDebug()) ; SPARQLServer server = new SPARQLServer(serverConfig) ; - X_Config.configureDatasets(serverConfig.datasets); - // Temporary? - Fuseki.setServer(server) ; + return server ; + } - Server mgtServer = null ; - // mgtPort = -1 means no management functions. - + private void initializeManagement(SPARQLServer server, ServerConfig params) { if ( params.mgtPort > 0 && params.mgtPort != params.port ) { + ServletContextHandler context = ManagementServer.addManagementServer(server, params.mgtPort) ; + Fuseki.configLog.warn("**** Management services on different port **** Ignored ****") ; Fuseki.configLog.info("Management services on port " + params.mgtPort) ; - mgtServer = ManagementServer.createManagementServer(params.mgtPort) ; - ServletContextHandler context = (ServletContextHandler)mgtServer.getHandler() ; ManagementServer.addServerFunctions(context, "/$/") ; ManagementServer.addAdminFunctions(context, "/$/") ; - - try { - mgtServer.start() ; - } catch (java.net.BindException ex) { - serverLog.error("SPARQLServer: Failed to start management server: " + ex.getMessage()) ; - System.exit(1) ; - } catch (Exception ex) { - serverLog.error("SPARQLServer: Failed to start management server: " + ex.getMessage(), ex) ; - System.exit(1) ; - } + return ; } - + if ( params.mgtPort == 0 || params.mgtPort == params.port ) { - // TODO Temporary! - mgtServer = server.getServer() ; ServletContextHandler context = (ServletContextHandler)server.getServer().getHandler() ; ManagementServer.addServerFunctions(context, "/$/") ; ManagementServer.addAdminFunctions(context, "/$/") ; } - // Temporary? - Fuseki.setJettyMgtServer(mgtServer) ; - Fuseki.setJettyServer(server.getServer()) ; - - server.start() ; - try { - server.getServer().join() ; - } catch (Exception ex) {} - - if ( mgtServer != null ) { - try { - mgtServer.stop() ; - } catch (Exception e) { - serverLog.warn("Failed to cleanly stop the management server", e) ; - } - } - System.exit(0) ; } - @Override protected String getCommandName() { return "fuseki" ; Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDescription.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDescription.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDescription.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDescription.java Mon Dec 23 19:57:29 2013 @@ -32,9 +32,9 @@ import org.apache.jena.atlas.json.JsonBu import org.apache.jena.atlas.json.JsonValue ; import org.apache.jena.fuseki.Fuseki ; import org.apache.jena.fuseki.server.DatasetRegistry ; +import org.apache.jena.fuseki.server.SPARQLServer ; import org.apache.jena.fuseki.servlets.HttpAction ; import org.apache.jena.fuseki.servlets.ServletOps ; -import org.eclipse.jetty.server.Server ; /** Description of datasets for a server */ public class ActionDescription extends ActionCtl @@ -79,22 +79,18 @@ public class ActionDescription extends A .key("server") .startObject() //.key("hostname").value(req.getLocalName()) - .key("port").value(port(Fuseki.getJettyServer())) + .key("port").value(SPARQLServer.instance.getServerPort()) .finishObject() ; builder .key("admin") .startObject() //.key("hostname").value(req.getLocalName()) - .key("port").value(port(Fuseki.getJettyMgtServer())) + .key("port").value(SPARQLServer.instance.getMgtPort()) .finishObject() ; builder .key("version").value(Fuseki.VERSION) ; } - private int port(Server jettyServer) { - return jettyServer.getConnectors()[0].getPort() ; - } - private void describeDataset(JsonBuilder builder) { builder.key("datasets") ; JsonDescription.arrayDatasets(builder, DatasetRegistry.get()); Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ManagementServer.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ManagementServer.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ManagementServer.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ManagementServer.java Mon Dec 23 19:57:29 2013 @@ -20,54 +20,51 @@ package org.apache.jena.fuseki.mgt; import static org.apache.jena.fuseki.Fuseki.serverLog ; -import java.util.List ; - import javax.servlet.http.HttpServlet ; import org.apache.jena.fuseki.Fuseki ; import org.apache.jena.fuseki.FusekiException ; -import org.apache.jena.fuseki.server.FusekiErrorHandler ; +import org.apache.jena.fuseki.server.SPARQLServer ; import org.eclipse.jetty.server.Connector ; import org.eclipse.jetty.server.Server ; -import org.eclipse.jetty.server.nio.SelectChannelConnector ; +import org.eclipse.jetty.server.nio.BlockingChannelConnector ; import org.eclipse.jetty.servlet.ServletContextHandler ; import org.eclipse.jetty.servlet.ServletHolder ; public class ManagementServer { - /** Create but do not initialize */ - public static Server createManagementServer(int mgtPort) - { - // Separate Jetty server - Server server = new Server() ; - -// BlockingChannelConnector bcConnector = new BlockingChannelConnector() ; -// bcConnector.setUseDirectBuffers(false) ; -// Connector connector = bcConnector ; - - Connector connector = new SelectChannelConnector() ; - // Ignore idle time. - // If set, then if this goes off, it keeps going off and you get a lot of log messages. + public static ServletContextHandler addManagementServer(SPARQLServer server, int port) { + Server jettyServer = server.getServer() ; + BlockingChannelConnector bcConnector = new BlockingChannelConnector() ; + // bcConnector.setUseDirectBuffers(false) ; + + Connector connector = bcConnector ; connector.setMaxIdleTime(0) ; // Jetty outputs a lot of messages if this goes off. - connector.setPort(mgtPort); - server.addConnector(connector) ; - - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setErrorHandler(new FusekiErrorHandler()) ; - server.setHandler(context); - return server ; - } + //if ( loopback ) + if ( true ) + connector.setHost("localhost"); + connector.setPort(port) ; + // Some people do try very large operations ... + connector.setRequestHeaderSize(64 * 1024) ; + connector.setRequestBufferSize(5 * 1024 * 1024) ; + connector.setResponseBufferSize(5 * 1024 * 1024) ; + jettyServer.addConnector(connector); + ServletContextHandler context = new ServletContextHandler() ; + jettyServer.setHandler(context) ; + return context ; + } + public static void addServerFunctions(ServletContextHandler context, String base) { Fuseki.serverLog.info("Adding server information functions") ; if ( !base.endsWith("/" ) ) base = base + "/" ; if ( !base.startsWith("/")) throw new FusekiException("Base URI does not start with a '/'") ; - // Dump request - addServlet(context, new DumpServlet(), base+"dump") ; // XXX Remove.? - addServlet(context, new ActionDescription(), base+"status") ; - addServlet(context, new ActionPing(), base+"ping") ; + + addServlet(context, new DumpServlet(), base+MgtConst.opDump) ; // XXX Remove.? + addServlet(context, new ActionDescription(), base+MgtConst.opStatus) ; + addServlet(context, new ActionPing(), base+MgtConst.opPing) ; } public static void addAdminFunctions(ServletContextHandler context, String base) { @@ -75,36 +72,17 @@ public class ManagementServer if ( !base.endsWith("/" ) ) base = base + "/" ; if ( !base.startsWith("/")) - throw new FusekiException("Base URI does nto start with a '/'") ; - addServlet(context, new MgtCmdServlet(), base+"mgt") ; // XXX Old - remove. - addServlet(context, new ActionStats(), base+"stats/*") ; // "/abc/*" covers ".../abc" as well. - addServlet(context, new ActionDatasets(), base+"datasets/*") ; - } - - // SHARE - private static void addServlet(ServletContextHandler context, String datasetPath, HttpServlet servlet, List pathSpecs) - { - for ( String pathSpec : pathSpecs ) - { - if ( pathSpec.endsWith("/") ) - pathSpec = pathSpec.substring(0, pathSpec.length()-1) ; - if ( pathSpec.startsWith("/") ) - pathSpec = pathSpec.substring(1, pathSpec.length()) ; - addServlet(context, servlet, datasetPath+"/"+pathSpec) ; - } - } - - private static void addServlet(ServletContextHandler context, HttpServlet servlet, String pathSpec) - { - ServletHolder holder = new ServletHolder(servlet) ; - addServlet(context, holder, pathSpec) ; + throw new FusekiException("Base URI does not start with a '/'") ; + + addServlet(context, new ActionStats(), base+MgtConst.opStats+"/*") ; // "/abc/*" covers ".../abc" as well. + addServlet(context, new ActionDatasets(), base+MgtConst.opDatasets+"/*") ; } - private static void addServlet(ServletContextHandler context, ServletHolder holder, String pathSpec) + public static void addServlet(ServletContextHandler context, HttpServlet servlet, String pathSpec) { + ServletHolder holder = new ServletHolder(servlet) ; serverLog.debug("Add servlet @ "+pathSpec) ; context.addServlet(holder, pathSpec) ; } - } Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java Mon Dec 23 19:57:29 2013 @@ -53,26 +53,16 @@ public class FusekiConfig { Fuseki.init() ; } - // MASSIVE AMOUNT OF CODE TIDYING NEEDED - // The datastructure that captures a servers configuration. - - // Server port - int port ; - // Management command port - -1 for none. - int mgtPort ; - List datasets = null ; - private static Logger log = Fuseki.configLog ; - public static List defaultConfiguration(String datasetPath, DatasetGraph dsg, - boolean allowUpdate, boolean listenLocal) { + public static List defaultConfiguration(ServerInitialConfig params) { DatasetRef dbDesc = new DatasetRef() ; - dbDesc.name = DatasetRef.canocialDatasetPath(datasetPath) ; - dbDesc.dataset = dsg ; + dbDesc.name = DatasetRef.canocialDatasetPath(params.datasetPath) ; + dbDesc.dataset = params.dsg ; dbDesc.query.endpoints.add(HttpNames.ServiceQuery) ; dbDesc.query.endpoints.add(HttpNames.ServiceQueryAlt) ; - if ( allowUpdate ) { + if ( params.allowUpdate ) { dbDesc.update.endpoints.add(HttpNames.ServiceUpdate) ; dbDesc.upload.endpoints.add(HttpNames.ServiceUpload) ; dbDesc.readWriteGraphStore.endpoints.add(HttpNames.ServiceData) ; @@ -345,7 +335,7 @@ public class FusekiConfig { QuerySolution soln = rs.next() ; String epName = soln.getLiteral("ep").getLexicalForm() ; service.endpoints.add(epName) ; - log.info(" " + label + " = /" + name + "/" + epName) ; + log.info(" " + label + " = " + name + "/" + epName) ; } } Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java Mon Dec 23 19:57:29 2013 @@ -18,34 +18,33 @@ package org.apache.jena.fuseki.server; +import java.util.List ; + import javax.servlet.ServletContext ; import javax.servlet.ServletContextEvent ; import javax.servlet.ServletContextListener ; +import org.apache.jena.atlas.lib.DS ; import org.apache.jena.fuseki.Fuseki ; +import org.apache.jena.fuseki.X_Config ; import org.slf4j.Logger ; public class FusekiServletContextListener implements ServletContextListener { private static Logger confLog = Fuseki.configLog ; - // This could do the initialization. - private final SPARQLServer sparqlServer ; - - // Embedded version. - public FusekiServletContextListener(SPARQLServer sparqlServer) { - this.sparqlServer = sparqlServer ; + public FusekiServletContextListener() { + confLog.info("FusekiServletContextListener") ; } - - // web.xml version. - public FusekiServletContextListener() { sparqlServer = null ; } + public static ServerInitialConfig initialSetup = null ; + + // --- later: Play the "hunt the config files" game // Default. static public String rootDirectory = "/usr/share/fuseki" ; -// static public String staticContentDir = rootDirectory + "/pages" ; static public String configurationFile = rootDirectory + "/config-fuseki.ttl" ; - - static public ServerConfig serverConfig = null ; - static Boolean initialized = false ; + // ---- + + private Boolean initialized = false ; @Override public void contextInitialized(ServletContextEvent sce) { @@ -57,7 +56,7 @@ public class FusekiServletContextListene @Override public void contextDestroyed(ServletContextEvent sce) {} - public static void init() { + public void init() { if ( initialized ) return ; synchronized(initialized) @@ -66,8 +65,30 @@ public class FusekiServletContextListene return ; initialized = true ; Fuseki.init() ; - + + if ( initialSetup != null ) { + List datasets = findDatasets(initialSetup) ; + List additionalDatasets = FusekiConfig.additional() ; + datasets.addAll(additionalDatasets) ; + X_Config.configureDatasets(datasets); + } + } + } + + private static List findDatasets(ServerInitialConfig params) { + // Has a side effect of global context setting. + + List datasets = DS.list() ; + + if ( params.fusekiConfigFile != null ) { + Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ; + List cmdLineDatasets = FusekiConfig.configure(params.fusekiConfigFile) ; + datasets.addAll(cmdLineDatasets) ; + } else { + List cmdLineDatasets = FusekiConfig.defaultConfiguration(params) ; + datasets.addAll(cmdLineDatasets) ; } + return datasets ; } } Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SPARQLServer.java Mon Dec 23 19:57:29 2013 @@ -27,7 +27,6 @@ import java.util.EnumSet ; import java.util.List ; import javax.servlet.DispatcherType ; -import javax.servlet.http.HttpServlet ; import org.apache.jena.atlas.lib.NotImplemented ; import org.apache.jena.fuseki.Fuseki ; @@ -39,11 +38,8 @@ import org.eclipse.jetty.security.authen import org.eclipse.jetty.server.Connector ; import org.eclipse.jetty.server.Server ; import org.eclipse.jetty.server.nio.BlockingChannelConnector ; -import org.eclipse.jetty.servlet.DefaultServlet ; import org.eclipse.jetty.servlet.FilterHolder ; import org.eclipse.jetty.servlet.ServletContextHandler ; -import org.eclipse.jetty.servlet.ServletHolder ; -import org.eclipse.jetty.servlets.GzipFilter ; import org.eclipse.jetty.util.security.Constraint ; import org.eclipse.jetty.webapp.WebAppContext ; import org.eclipse.jetty.xml.XmlConfiguration ; @@ -57,13 +53,18 @@ import com.hp.hpl.jena.sparql.util.Utils * {@link org.eclipse.jetty.server.Server#stop()} commands as well as obtaining * instances of the server and server configuration. Finally we can obtain * instances of {@link org.apache.jena.fuseki.server.ServerConfig}. - * */ public class SPARQLServer { static { Fuseki.init() ; } + // Temporarary + public static SPARQLServer instance = null ; + + private Connector serverConnector = null ; + private Connector mgtConnector = null ; + private ServerConfig serverConfig ; private Server server = null ; @@ -90,6 +91,9 @@ public class SPARQLServer { EnumSet es = EnumSet.allOf(DispatcherType.class) ; context.addFilter(f, "/*", es); } + + instance = this ; + mgtConnector = serverConnector ; // Datasets not initialized yet. } @@ -139,9 +143,17 @@ public class SPARQLServer { public Server getServer() { return server ; } - - public int getPort() { - return server.getConnectors()[0].getPort() ; + + public int getServerPort() { + return serverConnector.getPort() ; + } + + public int getMgtPort() { + return mgtConnector.getPort() ; + } + + public void setMgtConnector(Connector connector) { + mgtConnector = connector ; } /** @@ -153,23 +165,22 @@ public class SPARQLServer { } private ServletContextHandler buildServerWebapp(String jettyConfig, boolean enableCompression) { - if ( jettyConfig != null ) { + if ( jettyConfig != null ) // --jetty-config=jetty-fuseki.xml // for detailed configuration of the server using Jetty features. - server = configServer(jettyConfig) ; - } else - server = defaultServerConfig(serverConfig.port, serverConfig.loopback) ; + configServer(jettyConfig) ; + else + defaultServerConfig(serverConfig.port, serverConfig.loopback) ; WebAppContext context = new WebAppContext(); context.getServletContext().getContextHandler().setMaxFormContentSize(10 * 1000 * 1000) ; context.setDescriptor("war-web.xml"); context.setResourceBase("pages"); context.setContextPath("/"); - context.setParentLoaderPriority(true); + context.setParentLoaderPriority(true); // Normal Java classloader behaviour. context.setErrorHandler(new FusekiErrorHandler()) ; - context.addEventListener(new FusekiServletContextListener(this)); server.setHandler(context) ; - + // XXX Security if ( jettyConfig == null && serverConfig.authConfigFile != null ) security(context, serverConfig.authConfigFile) ; @@ -177,12 +188,10 @@ public class SPARQLServer { return context ; } - private ServletContextHandler buildServer(String jettyConfig, boolean enableCompression) { throw new NotImplemented("Use the webapps setup") ; } - private static void security(ServletContextHandler context, String authfile) { Constraint constraint = new Constraint() ; constraint.setName(Constraint.__BASIC_AUTH) ; @@ -210,133 +219,24 @@ public class SPARQLServer { serverLog.debug("Basic Auth Configuration = " + authfile) ; } - -// private ServletContextHandler buildServer(String jettyConfig, boolean enableCompression) { -// if ( jettyConfig != null ) { -// // --jetty-config=jetty-fuseki.xml -// // for detailed configuration of the server using Jetty features. -// server = configServer(jettyConfig) ; -// } else -// server = defaultServerConfig(serverConfig.port, serverConfig.loopback) ; -// -// // Keep the server to a maximum number of threads. -// // server.setThreadPool(new QueuedThreadPool(ThreadPoolSize)) ; -// -// ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS) ; -// context.setErrorHandler(new FusekiErrorHandler()) ; -// context.addEventListener(new FusekiServletContextListener(this)); -// // Increase form size. -// context.getServletContext().getContextHandler().setMaxFormContentSize(10 * 1000 * 1000) ; -// // Constants. Add RDF types. -// MimeTypes mt = new MimeTypes() ; -// mt.addMimeMapping("rdf", contentTypeRDFXML + ";charset=utf-8") ; -// mt.addMimeMapping("ttl", contentTypeTurtle + ";charset=utf-8") ; -// mt.addMimeMapping("nt", contentTypeNTriples + ";charset=utf-8") ; -// mt.addMimeMapping("nq", contentTypeNQuads + ";charset=utf-8") ; -// mt.addMimeMapping("trig", contentTypeTriG + ";charset=utf-8") ; -// // mt.addMimeMapping("tpl", "text/html;charset=utf-8") ; -// context.setMimeTypes(mt) ; -// -// // Wire up authentication if appropriate -// // XXX Use Shiro and web.xml -// if ( jettyConfig == null && serverConfig.authConfigFile != null ) { -// 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() ; -// -// ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler() ; -// securityHandler.addConstraintMapping(mapping) ; -// securityHandler.setIdentityService(identService) ; -// -// HashLoginService loginService = new HashLoginService("Fuseki Authentication", serverConfig.authConfigFile) ; -// loginService.setIdentityService(identService) ; -// -// securityHandler.setLoginService(loginService) ; -// securityHandler.setAuthenticator(new BasicAuthenticator()) ; -// -// context.setSecurityHandler(securityHandler) ; -// -// serverLog.debug("Basic Auth Configuration = " + serverConfig.authConfigFile) ; -// } -// -// server.setHandler(context) ; -// -// serverLog.debug("Pages = " + serverConfig.pages) ; -// -// boolean installServices = true ; -// -// String validationRoot = "/validate" ; -// -// // Should all services be /_/.... or some such? -// -// if ( installServices ) { -// // TODO Respect port. -// if ( serverConfig.pagesPort != serverConfig.port ) -// serverLog.warn("Not supported yet - pages on a different port to services") ; -// -// String base = serverConfig.pages ; -// Map data = new HashMap() ; -// data.put("mgt", new MgtFunctions()) ; -// SimpleVelocityServlet templateEngine = new SimpleVelocityServlet(base, data) ; -// addServlet(context, templateEngine, "*.tpl", false) ; -// } -// -// if ( installServices ) { -// // Validators -// HttpServlet validateQuery = new QueryValidator() ; -// HttpServlet validateUpdate = new UpdateValidator() ; -// -// HttpServlet validateData = new DataValidator() ; -// HttpServlet validateIRI = new IRIValidator() ; -// -// HttpServlet generalQueryService = new SPARQL_QueryGeneral() ; -// -// addServlet(context, validateQuery, validationRoot + "/query", false) ; -// addServlet(context, validateUpdate, validationRoot + "/update", false) ; -// addServlet(context, validateData, validationRoot + "/data", false) ; -// addServlet(context, validateIRI, validationRoot + "/iri", false) ; -// -// // general query processor. -// addServlet(context, generalQueryService, HttpNames.ServiceGeneralQuery, enableCompression) ; -// } -// -// if ( installServices ) { -// String[] files = {"fuseki.html", "index.html"} ; -// context.setWelcomeFiles(files) ; -// addContent(context, "/", serverConfig.pages) ; -// } -// -// return context ; -// } - private static Server configServer(String jettyConfig) { + private void configServer(String jettyConfig) { try { serverLog.info("Jetty server config file = " + jettyConfig) ; - Server server = new Server() ; + server = new Server() ; XmlConfiguration configuration = new XmlConfiguration(new FileInputStream(jettyConfig)) ; configuration.configure(server) ; - return server ; + 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 static Server defaultServerConfig(int port, boolean loopback) { + private void defaultServerConfig(int port, boolean loopback) { // Server, with one NIO-based connector, large input buffer size (for // long URLs, POSTed forms (queries, updates)). - Server server = new Server() ; - - // Using "= new SelectChannelConnector() ;" on Darwin (OS/X) causes - // problems - // with initialization not seen (thread scheduling?) in Joseki. + server = new Server() ; // BlockingChannelConnector is better for pumping large responses back // but there have been observed problems with DirectMemory allocation @@ -360,63 +260,6 @@ public class SPARQLServer { connector.setRequestBufferSize(5 * 1024 * 1024) ; connector.setResponseBufferSize(5 * 1024 * 1024) ; server.addConnector(connector) ; - return server ; - } - - private static void addContent(ServletContextHandler context, String pathSpec, String pages) { - DefaultServlet staticServlet = new DefaultServlet() ; - ServletHolder staticContent = new ServletHolder(staticServlet) ; - staticContent.setInitParameter("resourceBase", pages) ; - - // Note we set GZip to false for static content because the Jetty - // DefaultServlet has - // a built-in GZip capability that is better for static content than the - // mechanism the - // GzipFilter uses for dynamic content - addServlet(context, staticContent, pathSpec, false) ; - } - - private void addServlet(ServletContextHandler context, String datasetPath, HttpServlet servlet, - ServiceRef serviceRef, boolean enableCompression) { - addServlet(context, datasetPath, servlet, serviceRef.endpoints, enableCompression) ; - } - - // SHARE - private static void addServlet(ServletContextHandler context, String datasetPath, HttpServlet servlet, - List pathSpecs, boolean enableCompression) { - for (String pathSpec : pathSpecs) { - if ( pathSpec.equals("") ) { - // "" is special -- add as "base" and "base/" - addServlet(context, servlet, datasetPath + "/", enableCompression) ; - addServlet(context, servlet, datasetPath, enableCompression) ; - continue ; - } - - if ( pathSpec.endsWith("/") ) - pathSpec = pathSpec.substring(0, pathSpec.length() - 1) ; - if ( pathSpec.startsWith("/") ) - pathSpec = pathSpec.substring(1, pathSpec.length()) ; - addServlet(context, servlet, datasetPath + "/" + pathSpec, enableCompression) ; - } - } - - private static void addServlet(ServletContextHandler context, HttpServlet servlet, String pathSpec, - boolean enableCompression) { - ServletHolder holder = new ServletHolder(servlet) ; - addServlet(context, holder, pathSpec, enableCompression) ; - } - - private static void addServlet(ServletContextHandler context, ServletHolder holder, String pathSpec, - boolean enableCompression) { - if ( serverLog.isDebugEnabled() ) { - if ( enableCompression ) - serverLog.debug("Add servlet @ " + pathSpec + " (with gzip)") ; - else - serverLog.debug("Add servlet @ " + pathSpec) ; - } - context.addServlet(holder, pathSpec) ; - - if ( enableCompression ) - context.addFilter(GzipFilter.class, pathSpec, EnumSet.allOf(DispatcherType.class)) ; + serverConnector = connector ; } } Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java (original) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerConfig.java Mon Dec 23 19:57:29 2013 @@ -18,7 +18,6 @@ package org.apache.jena.fuseki.server; -import java.util.List ; /** This represents a configuration of a SPARQL server. */ @@ -39,8 +38,6 @@ public class ServerConfig public boolean loopback = false ; /** The local directory for serving the static pages */ public String pages ; - /** The list of datasets */ - public List datasets ; /** Enable Accept-Encoding compression. Set to false by default.*/ public boolean enableCompression = false ; Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java?rev=1553196&view=auto ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java (added) +++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ServerInitialConfig.java Mon Dec 23 19:57:29 2013 @@ -0,0 +1,29 @@ +/** + * 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. + */ + +package org.apache.jena.fuseki.server; + +import com.hp.hpl.jena.sparql.core.DatasetGraph ; + +/** Dataset setup (command line, config file) for a dataset (or several if config file) */ +public class ServerInitialConfig { + public DatasetGraph dsg = null ; + public String datasetPath = null ; + public boolean allowUpdate = false ; + public String fusekiConfigFile = null ; +} Modified: jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java?rev=1553196&r1=1553195&r2=1553196&view=diff ============================================================================== --- jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java (original) +++ jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java Mon Dec 23 19:57:29 2013 @@ -16,14 +16,12 @@ * limitations under the License. */ -package org.apache.jena.fuseki; +package org.apache.jena.fuseki ; import java.util.Collection ; import org.apache.jena.atlas.iterator.Iter ; -import org.apache.jena.fuseki.mgt.ManagementServer ; import org.apache.jena.fuseki.server.* ; -import org.eclipse.jetty.servlet.ServletContextHandler ; import com.hp.hpl.jena.graph.Graph ; import com.hp.hpl.jena.graph.Node ; @@ -40,109 +38,109 @@ import com.hp.hpl.jena.update.Update ; import com.hp.hpl.jena.update.UpdateExecutionFactory ; import com.hp.hpl.jena.update.UpdateProcessor ; -/** Manage a server for testing. - * Example for one server per test suite: +/** + * Manage a server for testing. Example for one server per test suite: + * *
-    \@BeforeClass public static void beforeClass() { ServerTest.allocServer() ; }
-    \@AfterClass  public static void afterClass()  { ServerTest.freeServer() ; }
-    \@Before      public void beforeTest()         { ServerTest.resetServer() ; }
-    
+ * \@BeforeClass public static void beforeClass() { ServerTest.allocServer() ; } + * \@AfterClass public static void afterClass() { ServerTest.freeServer() ; } + * \@Before public void beforeTest() { ServerTest.resetServer() ; } + * */ -public class ServerTest -{ +public class ServerTest { // Abstraction that runs a SPARQL server for tests. - - public static final int port = 3535 ; - public static final String urlRoot = "http://localhost:"+port+"/" ; - public static final String datasetPath = "/dataset" ; - public static final String urlDataset = "http://localhost:"+port+datasetPath ; - public static final String serviceUpdate = urlDataset+"/update" ; - public static final String serviceQuery = urlDataset+"/query" ; - public static final String serviceREST = urlDataset+"/data" ; - - public static final String gn1 = "http://graph/1" ; - public static final String gn2 = "http://graph/2" ; - public static final String gn99 = "http://graph/99" ; - - public static final Node n1 = NodeFactory.createURI("http://graph/1") ; - public static final Node n2 = NodeFactory.createURI("http://graph/2") ; - public static final Node n99 = NodeFactory.createURI("http://graph/99") ; - - public static final Graph graph1 = SSE.parseGraph("(base (graph (

1)))") ; - public static final Graph graph2 = SSE.parseGraph("(base (graph (

2)))") ; - - public static final Model model1 = ModelFactory.createModelForGraph(graph1) ; - public static final Model model2 = ModelFactory.createModelForGraph(graph2) ; - - private static SPARQLServer server = null ; - + + public static final int port = 3535 ; + public static final String urlRoot = "http://localhost:" + port + "/" ; + public static final String datasetPath = "/dataset" ; + public static final String urlDataset = "http://localhost:" + port + datasetPath ; + public static final String serviceUpdate = urlDataset + "/update" ; + public static final String serviceQuery = urlDataset + "/query" ; + public static final String serviceREST = urlDataset + "/data" ; + + public static final String gn1 = "http://graph/1" ; + public static final String gn2 = "http://graph/2" ; + public static final String gn99 = "http://graph/99" ; + + public static final Node n1 = NodeFactory.createURI("http://graph/1") ; + public static final Node n2 = NodeFactory.createURI("http://graph/2") ; + public static final Node n99 = NodeFactory.createURI("http://graph/99") ; + + public static final Graph graph1 = SSE.parseGraph("(base (graph (

1)))") ; + public static final Graph graph2 = SSE.parseGraph("(base (graph (

2)))") ; + + public static final Model model1 = ModelFactory.createModelForGraph(graph1) ; + public static final Model model2 = ModelFactory.createModelForGraph(graph2) ; + + private static SPARQLServer server = null ; + // reference count of start/stop server - private static int countServer = 0 ; - + private static int countServer = 0 ; + // This will cause there to be one server over all tests. - // Must be after initialization of counters - //static { allocServer() ; } + // Must be after initialization of counters + // static { allocServer() ; } - static public void allocServer() - { + static public void allocServer() { if ( countServer == 0 ) setupServer() ; countServer++ ; } - - static public void freeServer() - { + + static public void freeServer() { if ( countServer >= 0 ) { - countServer -- ; + countServer-- ; if ( countServer == 0 ) teardownServer() ; } } + + protected static void setupServer() { + setupServer(null) ; + } - protected static void setupServer() - { + protected static void setupServer(String authConfigFile) { SystemState.location = Location.mem() ; SystemState.init$() ; - DatasetGraph dsg = DatasetGraphFactory.createMem() ; - // This must agree with ServerTest - ServerConfig config = make(dsg, true, true) ; - server = new SPARQLServer(config) ; - X_Config.configureDatasets(config.datasets) ; - ServletContextHandler context = (ServletContextHandler)server.getServer().getHandler() ; - ManagementServer.addServerFunctions(context, "/$/") ; - ManagementServer.addAdminFunctions(context, "/$/") ; + ServerInitialConfig params = new ServerInitialConfig() ; + DatasetGraph dsg = DatasetGraphFactory.createMem() ; + params.dsg = dsg ; + params.datasetPath = ServerTest.datasetPath ; + params.allowUpdate = true ; + FusekiServletContextListener.initialSetup = params ; + ServerConfig config = make(true, true) ; + config.authConfigFile = authConfigFile ; + server = new SPARQLServer(config) ; server.start() ; } - - public static ServerConfig make(DatasetGraph dsg, boolean allowUpdate, boolean listenLocal) { + + public static ServerConfig make(boolean allowUpdate, boolean listenLocal) { ServerConfig config = new ServerConfig() ; // Avoid any persistent record. - config.datasets = FusekiConfig.defaultConfiguration(ServerTest.datasetPath, dsg, allowUpdate, listenLocal) ; config.port = ServerTest.port ; config.mgtPort = ServerTest.port ; config.pagesPort = ServerTest.port ; - config.loopback = false ; + config.loopback = listenLocal ; config.jettyConfigFile = null ; config.pages = Fuseki.PagesStatic ; config.enableCompression = true ; config.verboseLogging = false ; return config ; } - + protected static void teardownServer() { if ( server != null ) server.stop() ; server = null ; // Clear out the registry. Collection keys = Iter.toList(DatasetRegistry.get().keys()) ; - for ( String k : keys ) - DatasetRegistry.get().remove(k); + for (String k : keys) + DatasetRegistry.get().remove(k) ; } - - public static void resetServer() - { + + public static void resetServer() { Update clearRequest = new UpdateDrop(Target.ALL) ; UpdateProcessor proc = UpdateExecutionFactory.createRemote(clearRequest, ServerTest.serviceUpdate) ; proc.execute() ;