You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/03/29 22:45:54 UTC

svn commit: r1583063 - in /jena/Experimental/jena-fuseki2: ./ docs/ src-dev/dev/ src/main/java/org/apache/jena/fuseki/ src/main/java/org/apache/jena/fuseki/build/ src/main/java/org/apache/jena/fuseki/jetty/ src/main/java/org/apache/jena/fuseki/server/ ...

Author: andy
Date: Sat Mar 29 21:45:54 2014
New Revision: 1583063

URL: http://svn.apache.org/r1583063
Log:
Improvement for startup (various modes)

Added:
    jena/Experimental/jena-fuseki2/src/main/resources/org/apache/jena/fuseki/server/config.ttl
Removed:
    jena/Experimental/jena-fuseki2/config.ttl
Modified:
    jena/Experimental/jena-fuseki2/assembly-dist.xml
    jena/Experimental/jena-fuseki2/docs/fuseki-data-services.md
    jena/Experimental/jena-fuseki2/docs/fuseki-stats.md
    jena/Experimental/jena-fuseki2/fuseki
    jena/Experimental/jena-fuseki2/src-dev/dev/RunFuseki2.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiCmd.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/JettyServerConfig.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java
    jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java
    jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/ServerTest.java

Modified: jena/Experimental/jena-fuseki2/assembly-dist.xml
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/assembly-dist.xml?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/assembly-dist.xml (original)
+++ jena/Experimental/jena-fuseki2/assembly-dist.xml Sat Mar 29 21:45:54 2014
@@ -71,14 +71,18 @@ Assumes jar made and onejar has been ass
       <outputDirectory></outputDirectory>
       <includes>
         <include>log4j.properties</include>
-        <include>examples/**</include>
+	<!--<include>examples/**</include>-->
         <include>fuseki</include>
         <include>fuseki-server</include>
         <include>fuseki-server.bat</include>
-        <include>config*.ttl</include>
-	<include>shiro.ini</include>
-        <include>s-*</include>
+        <!--<include>s-*</include>-->
       </includes>
     </fileSet>
+
+     <fileSet>
+       <directory>src/main/webapp</directory>
+       <outputDirectory>webapp</outputDirectory>
+    </fileSet>
+
   </fileSets>
 </assembly>

Modified: jena/Experimental/jena-fuseki2/docs/fuseki-data-services.md
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/docs/fuseki-data-services.md?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/docs/fuseki-data-services.md (original)
+++ jena/Experimental/jena-fuseki2/docs/fuseki-data-services.md Sat Mar 29 21:45:54 2014
@@ -5,7 +5,7 @@ and a configurable set of endpoints for 
 SPARQL update and file upload.
 
 URI scheme.
-  Datasets and serviecs
+  Datasets and services
   Admin
 
 ----------------------------
@@ -44,16 +44,16 @@ The lifecycle of a dataset 
 * Active 
 * Offline
 
-An *active* dataset is able to rpocess applications requests. 
+An *active* dataset is able to process applications requests. 
 
-An *offline* dataset is one whos configuration is know to the server but is currently not controlled by the server.
+An *offline* dataset is one whose configuration is know to the server but is currently not controlled by the server.
 
 When offline, the dataset is unavailable for application requests but the name remains in-use and the configuration information retained.  When made active again, the dataset and it's associated services are recreated.  When offline, Fuseki does not retain any access to the data so the dataset can be changed with tools outside of Fuseki.  When active, Fuseki assumes it has full control of a dataset (in particular TDB datasets can not be updated by other applications while active).
 
-When Fuseki is not running, all datasets can be comnsidered offline even if theywere not explciitly made so prior to shutdown of the server.
+When Fuseki is not running, all datasets can be considered offline even if they were not explicitly made so prior to shutdown of the server.
 
 
-(If a datset uses in-memory storage, changes to its state are lost even though it is recreated from its; configuration when the server restarts.)
+(If a dataset uses in-memory storage, changes to its state are lost even though it is recreated from its; configuration when the server restarts.)
 
 
 ## Links

Modified: jena/Experimental/jena-fuseki2/docs/fuseki-stats.md
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/docs/fuseki-stats.md?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/docs/fuseki-stats.md (original)
+++ jena/Experimental/jena-fuseki2/docs/fuseki-stats.md Sat Mar 29 21:45:54 2014
@@ -8,7 +8,7 @@ Statistics are returned as JSON. They ar
 
 ## Structure of the Statistics Report
 
-### SPARQL Protolo Service 
+### SPARQL Protocol Service 
 
 Query and Update
 

Modified: jena/Experimental/jena-fuseki2/fuseki
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/fuseki?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/fuseki (original)
+++ jena/Experimental/jena-fuseki2/fuseki Sat Mar 29 21:45:54 2014
@@ -47,8 +47,8 @@
 #
 # FUSEKI_ARGS
 #   The arguments to pass to the Fuseki server on the command line. Defaults to:
-#    --update --loc=$FUSKEI_DATA_DIR /ds    # if FUSEKI_CONF is not set
-#    --config=$FUSEKI_CONF                  # if FUSEKI_CONF is set
+#                                        # if FUSEKI_CONF is not set
+#    --config=$FUSEKI_CONF               # if FUSEKI_CONF is set
 #
 # FUSEKI_START
 #   Path to the jar file. Defaults to $FUSEKI_HOME/fuseki-server.jar 
@@ -59,11 +59,6 @@
 # FUSEKI_USER
 #   If set, the server will be run as this user
 #
-# FUSEKI_DATA_DIR
-#   The location of the data directory Fuseki will use (i.e. the value of --loc).
-#   This is not the same as the databases/ area.
-#   Defaults to $FUSEKI_HOME/DB
-#
 # FUSEKI_LOGS
 #   Directory where logs will be generated. 
 #   Fixed as $FUSEKI_BASE/logs.
@@ -114,6 +109,7 @@ usage()
 }
 
 [ $# -gt 0 ] || usage
+CMD="$1"
 
 # Utility functions
 
@@ -151,7 +147,6 @@ case "`uname`" in
     CYGWIN*) cygwin=true;;
 esac
 
-
 # Set FUSKEI_HOME to the script invocation directory if it is not specified
 if [ -z "$FUSEKI_HOME" ]
 then
@@ -280,7 +275,7 @@ if [ -z "$FUSEKI_ARGS" ]
 then
   if [ -z "$FUSEKI_CONF" ]
   then
-    FUSEKI_ARGS="--update --loc=$DATA_DIR /ds"
+    FUSEKI_ARGS=""
   else
     FUSEKI_ARGS="--config=$FUSEKI_CONF"
   fi
@@ -450,7 +445,7 @@ run() {
   exec "${RUN_CMD[@]}"
 }
 
-case $1 in
+case $CMD in
   start)
     start
   ;;

Modified: jena/Experimental/jena-fuseki2/src-dev/dev/RunFuseki2.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src-dev/dev/RunFuseki2.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src-dev/dev/RunFuseki2.java (original)
+++ jena/Experimental/jena-fuseki2/src-dev/dev/RunFuseki2.java Sat Mar 29 21:45:54 2014
@@ -66,7 +66,7 @@ public class RunFuseki2
                      //  "-v",
                      //"--update", "--memtdb", "--mgt", "/ds"
                      
-                     "--update", "--mem", "--mgt", "/ds"
+                     "--update", "--mem", "/ds"
                      
                      //"--update", "--loc="+tmpdir+"DB", "--set=tdb:unionDefaultGraph=true", "/ds"
                      //"--update", "--mem", "/ds"

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiCmd.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiCmd.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiCmd.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/FusekiCmd.java Sat Mar 29 21:45:54 2014
@@ -56,8 +56,12 @@ public class FusekiCmd {
     }
     
     static class FusekiCmdInner extends CmdARQ {
+        // Legacy.
         private static ArgDecl  argMgt          = new ArgDecl(ArgDecl.NoValue, "mgt") ;
         private static ArgDecl  argMgtPort      = new ArgDecl(ArgDecl.HasValue, "mgtPort", "mgtport") ;
+        private static ArgDecl  argHome         = new ArgDecl(ArgDecl.HasValue, "home") ;
+        private static ArgDecl  argPages        = new ArgDecl(ArgDecl.HasValue, "pages") ;
+
         private static ArgDecl  argMem          = new ArgDecl(ArgDecl.NoValue, "mem") ;
         private static ArgDecl  argAllowUpdate  = new ArgDecl(ArgDecl.NoValue, "update", "allowUpdate") ;
         private static ArgDecl  argFile         = new ArgDecl(ArgDecl.HasValue, "file") ;
@@ -73,9 +77,6 @@ public class FusekiCmd {
         // Deprecated.  Use shiro.
         private static ArgDecl  argBasicAuth    = new ArgDecl(ArgDecl.HasValue, "basic-auth") ;
 
-        private static ArgDecl  argHome         = new ArgDecl(ArgDecl.HasValue, "home") ;
-        private static ArgDecl  argPages        = new ArgDecl(ArgDecl.HasValue, "pages") ;
-
         // private static ModLocation modLocation = new ModLocation() ;
         private static ModDatasetAssembler modDataset      = new ModDatasetAssembler() ;
 
@@ -92,8 +93,6 @@ public class FusekiCmd {
         private JettyServerConfig   jettyServerConfig = new JettyServerConfig() ;
         {
             jettyServerConfig.port = 3030 ;
-            jettyServerConfig.mgtPort = 3031 ;
-            jettyServerConfig.pagesPort = jettyServerConfig.port ;
             jettyServerConfig.jettyConfigFile = null ;
             jettyServerConfig.pages = Fuseki.PagesStatic ;
             jettyServerConfig.enableCompression = true ;
@@ -125,8 +124,10 @@ public class FusekiCmd {
             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") ;
             add(argBasicAuth) ;
-            add(argMgt,     "--mgt",          "Enable the management commands") ;
-            add(argMgtPort, "--mgtPort=port", "Port for management optations") ;
+            //add(argMgt,     "--mgt",          "Enable the management commands") ;
+            add(argMgt) ; // Legacy
+            add(argMgtPort) ; // Legacy
+            //add(argMgtPort, "--mgtPort=port", "Port for management optations") ;
             //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") ;
 
@@ -249,20 +250,23 @@ public class FusekiCmd {
                 }
             }
 
-            if ( ! contains(argMgt) && contains(argMgtPort) )
-                Fuseki.configLog.warn("Management port specified by admin functions not enabled with --"+argMgt.getKeyName()) ;
-
-            if ( contains(argMgt) ) {
-                jettyServerConfig.mgtPort = 0 ;
-                if (  contains(argMgtPort) ) {
-                    String mgtPortStr = getValue(argMgtPort) ;
-                    try {
-                        jettyServerConfig.mgtPort = Integer.parseInt(mgtPortStr) ;
-                    } catch (NumberFormatException ex) {
-                        throw new CmdException("--"+argMgtPort.getKeyName() + " : bad port number: " + mgtPortStr) ;
-                    }
-                }
-            }
+            if ( contains(argMgt) )
+                Fuseki.configLog.warn("Fuseki v2: Management functions are always enabled.  --mgt not needed.") ; 
+            
+            if ( contains(argMgtPort) )
+                Fuseki.configLog.warn("Fuseki v2: Management functions are always on the same port as the server.  --mgtPort ignored.") ; 
+
+//            if ( contains(argMgt) ) {
+//                jettyServerConfig.mgtPort = 0 ;
+//                if (  contains(argMgtPort) ) {
+//                    String mgtPortStr = getValue(argMgtPort) ;
+//                    try {
+//                        jettyServerConfig.mgtPort = Integer.parseInt(mgtPortStr) ;
+//                    } catch (NumberFormatException ex) {
+//                        throw new CmdException("--"+argMgtPort.getKeyName() + " : bad port number: " + mgtPortStr) ;
+//                    }
+//                }
+//            }
 
             if ( contains(argLocalhost) )
                 jettyServerConfig.loopback = true ;
@@ -311,7 +315,6 @@ public class FusekiCmd {
 
         @Override
         protected void exec() {
-            Fuseki.init() ;
             FusekiServletContextListener.initialSetup = cmdLineDataset ;
             // For standalone, command line use ...
             SPARQLServer.initializeServer(jettyServerConfig) ;

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/build/FusekiConfig.java Sat Mar 29 21:45:54 2014
@@ -68,6 +68,8 @@ public class FusekiConfig {
     public static List<DataAccessPoint> readConfigFile(String filename) {
         // Old-style config file.
         Model model = RDFDataMgr.loadModel(filename) ;
+        if ( model.size() == 0 )
+            return Collections.emptyList() ;
         additionalRDF(model) ;
         server(model) ;
         return servicesAndDatasets(model) ;
@@ -77,12 +79,10 @@ public class FusekiConfig {
         // Find one server.
         List<Resource> servers = getByType(FusekiVocab.tServer, model) ;
         if ( servers.size() == 0 )
-            throw new FusekiConfigException("No server found (no resource with type "
-                + FusekiLib.strForResource(FusekiVocab.tServer)) ;
+            return ; 
         if ( servers.size() > 1 )
             throw new FusekiConfigException(servers.size()
                                             + " servers found (must be exactly one in a configuration file)") ;
-
         // ---- Server
         Resource server = servers.get(0) ;
         processServer(server) ;

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/JettyServerConfig.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/JettyServerConfig.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/JettyServerConfig.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/JettyServerConfig.java Sat Mar 29 21:45:54 2014
@@ -29,10 +29,6 @@ public class JettyServerConfig
     
     /** 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 */

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java Sat Mar 29 21:45:54 2014
@@ -23,6 +23,7 @@ import static org.apache.jena.fuseki.Fus
 
 import java.io.FileInputStream ;
 
+import org.apache.jena.atlas.lib.FileOps ;
 import org.apache.jena.atlas.logging.LogCtl ;
 import org.apache.jena.fuseki.Fuseki ;
 import org.apache.jena.fuseki.FusekiException ;
@@ -67,8 +68,8 @@ public class SPARQLServer {
     
     // webapp setup - standard maven layout
     public static final String contextpath    = "/" ;
-    public static final String resourceBase   = "src/main/webapp" ;
-    public static final String descriptorFile = resourceBase+"/WEB-INF/web.xml" ;
+    public static final String resourceBase1   = "webapp" ;             // Standalone jar
+    public static final String resourceBase2   = "src/main/webapp" ;    // Development
 
     /**
      * Default setup which requires a {@link org.apache.jena.fuseki.jetty.JettyServerConfig}
@@ -166,6 +167,14 @@ public class SPARQLServer {
     public static WebAppContext createWebApp() {
       WebAppContext webapp = new WebAppContext();
       webapp.getServletContext().getContextHandler().setMaxFormContentSize(10 * 1000 * 1000) ;
+      String resourceBase = null ;
+      if ( /*resourceBase == null &&*/ FileOps.exists(resourceBase1) )
+          resourceBase = resourceBase1 ;
+      if ( resourceBase == null && FileOps.exists(resourceBase2) )
+          resourceBase = resourceBase2 ;
+      if ( resourceBase == null )
+          Fuseki.serverLog.warn("Can't find resourceBase (tried "+resourceBase1+" and "+resourceBase2+")") ;
+      
       webapp.setDescriptor(resourceBase+"/WEB-INF/web.xml");
       webapp.setResourceBase(resourceBase);
       webapp.setContextPath(contextpath);

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java Sat Mar 29 21:45:54 2014
@@ -48,6 +48,7 @@ import arq.cmd.CmdException ;
 import com.hp.hpl.jena.rdf.model.* ;
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 import com.hp.hpl.jena.tdb.sys.Names ;
+import com.hp.hpl.jena.tdb.sys.SystemTDB ;
 
 public class FusekiServer
 {
@@ -59,7 +60,13 @@ public class FusekiServer
      */ 
     public static Path FUSEKI_BASE = null ;
     
-    public static final String FUSEKI_BASE_ETC = "/etc/fuseki" ;  
+    public static final boolean isWindows = SystemTDB.isWindows ;
+        
+        
+    public static final String DFT_FUSEKI_HOME  = isWindows ? /*What's correct here?*/ "/usr/share/fuseki" : "/usr/share/fuseki" ;
+    public static final String DFT_FUSEKI_BASE  = isWindows ? /*What's correct here?*/ "/etc/fuseki"       : "/etc/fuseki" ;
+    // In FUSEKI_BASE
+    public static final String DFT_CONFIG       = "config.ttl" ;
 
     // Relative names of directories
     private static final String        runArea                  = "run" ;
@@ -70,7 +77,8 @@ public class FusekiServer
     private static final String        systemDatabaseNameBase   = "system" ;
     private static final String        systemFileAreaBase       = "system_files" ;
     private static final String        templatesNameBase        = "templates" ;
-    private static final String        dftShiroIniFile          = "shiro.ini" ; // This is in web.xml as well. 
+    private static final String        DFT_SHIRO_INI            = "shiro.ini" ; // This name is in web.xml as well. 
+
     
     // --- Set during server initialization
 
@@ -96,11 +104,19 @@ public class FusekiServer
     public static Path        dirTemplates       = null ;
 
     private static boolean    initialized        = false ;
+    public static boolean     serverInitialized  = false ;
+
+    /** For testing - reset the places which initialize once */
+    public synchronized static void reset() {
+        initialized = false ;
+        FusekiServer.initialized = false ;
+    }
     
     public synchronized static void init() {
         if ( initialized )
             return ;
         initialized = true ;
+        Fuseki.init() ;
         
         // ----  Set and check FUSEKI_HOME and FUSEKI_BASE
         
@@ -120,7 +136,7 @@ public class FusekiServer
                     FUSEKI_BASE = FUSEKI_HOME.resolve(runArea) ;
                 else
                     // Neither FUSEKI_HOME nor FUSEKI_BASE set.
-                    FUSEKI_BASE = Paths.get(FUSEKI_BASE_ETC) ;
+                    FUSEKI_BASE = Paths.get(DFT_FUSEKI_BASE) ;
             }
         }
         
@@ -146,8 +162,9 @@ public class FusekiServer
                 throw new FusekiConfigException("FUSEKI_BASE is not a directory: "+FUSEKI_BASE) ;
             if ( ! Files.isWritable(FUSEKI_BASE) )
                 throw new FusekiConfigException("FUSEKI_BASE is not writable: "+FUSEKI_BASE) ;
-        } else
+        } else {
             ensureDir(FUSEKI_BASE);
+        }
 
         // Ensure FUSEKI_BASE has the assumed directories.
         dirTemplates        = writeableDirectory(FUSEKI_BASE, templatesNameBase) ;
@@ -164,10 +181,13 @@ public class FusekiServer
             throw new FusekiConfigException("FUSEKI_BASE exists but is a file") ;
         
         // Copy missing files into FUSEKI_BASE
-        copyFileIfMissing(null, dftShiroIniFile, FUSEKI_BASE) ;
+        copyFileIfMissing(null, DFT_SHIRO_INI, FUSEKI_BASE) ;
+        copyFileIfMissing(null, DFT_CONFIG, FUSEKI_BASE) ;
         for ( String n : Template.templateNames ) {
             copyFileIfMissing(null, n, FUSEKI_BASE) ;
         }
+        
+        serverInitialized = true ;
     }
 
     private static boolean emptyDir(Path dir) {
@@ -239,9 +259,13 @@ public class FusekiServer
             return datasets ;
 
         if ( params.fusekiConfigFile != null ) {
-            Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ;
-            List<DataAccessPoint> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
-            datasets.addAll(cmdLineDatasets) ;
+            if ( FileOps.exists(params.fusekiConfigFile ) ) {
+                Fuseki.configLog.info("Configuration file: " + params.fusekiConfigFile) ;
+                List<DataAccessPoint> cmdLineDatasets = FusekiConfig.readConfigFile(params.fusekiConfigFile) ;
+                datasets.addAll(cmdLineDatasets) ;
+            } else {
+                Fuseki.configLog.info("Configuration file '" + params.fusekiConfigFile+"' does not exist") ;
+            }
         } else if ( params.dsg != null ) {
             DataAccessPoint dap = defaultConfiguration(params.datasetPath, params.dsg, params.allowUpdate) ;
             datasets.add(dap) ;
@@ -257,7 +281,6 @@ public class FusekiServer
                     Fuseki.configLog.info("TDB dataset: directory=" + dir) ;
                 }
             }
-
             DataAccessPoint dap = configFromTemplate(params.templateFile, params.datasetPath, params.params) ;
             datasets.add(dap) ;
         }
@@ -328,8 +351,11 @@ public class FusekiServer
      */
     private static void ensureDir(Path directory) {
         File dir = directory.toFile() ;
-        if ( ! dir.exists() )
-            dir.mkdirs() ;
+        if ( ! dir.exists() ) {
+            boolean b = dir.mkdirs() ;
+            if ( ! b )
+                throw new FusekiConfigException("Failed to create directory: "+directory) ;
+        }
         else if ( ! dir.isDirectory())
             throw new FusekiConfigException("Not a directory: "+directory) ;
     }

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiServletContextListener.java Sat Mar 29 21:45:54 2014
@@ -60,20 +60,29 @@ public class FusekiServletContextListene
             if ( initialized )
                 return ;
             initialized = true ;
-            
-            Fuseki.init() ;         // Java wiring
-            FusekiServer.init() ;   // Server and the filesystem 
-            
-            if ( initialSetup == null ) {
-                initialSetup = new ServerInitialConfig() ;
-                initialSetup.fusekiConfigFile = "config.ttl" ;
-            }
-            
-            if ( initialSetup != null ) {
-                FusekiServer.initializeDataAccessPoints(initialSetup, FusekiServer.dirConfiguration.toString()) ;
-            } else {
-                Fuseki.serverLog.error("No configuration") ;
-                System.exit(0) ;
+
+            try {
+                FusekiServer.init() ; 
+                if ( ! FusekiServer.serverInitialized ) {
+                    Fuseki.serverLog.error("Failed to initialize : Server not running") ;
+                    return ;
+                }
+                
+                if ( initialSetup == null ) {
+                    initialSetup = new ServerInitialConfig() ;
+                    String cfg = FusekiServer.FUSEKI_BASE.resolve(FusekiServer.DFT_CONFIG).toAbsolutePath().toString() ;
+                    initialSetup.fusekiConfigFile = cfg ;
+                }
+
+                if ( initialSetup != null ) {
+                    FusekiServer.initializeDataAccessPoints(initialSetup, FusekiServer.dirConfiguration.toString()) ;
+                } else {
+                    Fuseki.serverLog.error("No configuration") ;
+                    System.exit(0) ;
+                }
+            } catch (Throwable th) { 
+                Fuseki.serverLog.error("Exception in initialization", th) ;
+                throw th ;
             }
         }
     }

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java Sat Mar 29 21:45:54 2014
@@ -22,13 +22,12 @@ import org.apache.jena.fuseki.FusekiExce
 import org.apache.jena.iri.IRI ;
 import org.apache.jena.riot.system.IRIResolver ;
 
-import com.hp.hpl.jena.rdf.model.Property ;
-import com.hp.hpl.jena.rdf.model.Resource ;
-import com.hp.hpl.jena.rdf.model.ResourceFactory ;
+import com.hp.hpl.jena.rdf.model.* ;
 
 public class FusekiVocab
 {
     public static String NS = "http://jena.apache.org/fuseki#" ;
+    private static Model model = ModelFactory.createDefaultModel() ;
 
     public static final Resource tServer = resource("Server") ;
 
@@ -60,9 +59,8 @@ public class FusekiVocab
     
     public static final Property pStatus = property("status") ;
 
-    
-    private static Resource resource(String localname) { return ResourceFactory.createResource(iri(localname)) ; }
-    private static Property property(String localname) { return ResourceFactory.createProperty(iri(localname)) ; }
+    private static Resource resource(String localname) { return model.createResource(iri(localname)) ; }
+    private static Property property(String localname) { return model.createProperty(iri(localname)) ; }
         
     private static String iri(String localname)
     {

Modified: jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java (original)
+++ jena/Experimental/jena-fuseki2/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java Sat Mar 29 21:45:54 2014
@@ -46,11 +46,10 @@ public class ShiroEnvironmentLoader exte
     private ServletContext servletContext ; 
     @Override
     public void contextInitialized(ServletContextEvent sce) {
-        Fuseki.init() ;
-        FusekiServer.init() ;
+        FusekiServer.init() ; 
         this.servletContext = sce.getServletContext() ;
         try { 
-        // Shiro.
+            // Shiro.
             initEnvironment(servletContext);
         } catch (ConfigurationException  ex) {
             Fuseki.configLog.error("Shiro initialization failed: "+ex.getMessage());

Added: jena/Experimental/jena-fuseki2/src/main/resources/org/apache/jena/fuseki/server/config.ttl
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/main/resources/org/apache/jena/fuseki/server/config.ttl?rev=1583063&view=auto
==============================================================================
--- jena/Experimental/jena-fuseki2/src/main/resources/org/apache/jena/fuseki/server/config.ttl (added)
+++ jena/Experimental/jena-fuseki2/src/main/resources/org/apache/jena/fuseki/server/config.ttl Sat Mar 29 21:45:54 2014
@@ -0,0 +1,28 @@
+## Fuseki Server configuation file.
+
+@prefix :        <#> .
+@prefix fuseki:  <http://jena.apache.org/fuseki#> .
+@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .
+
+[] rdf:type fuseki:Server ;
+   # Example::
+   # Server-wide query timeout.   
+   # 
+   # Timeout - server-wide default: milliseconds.
+   # Format 1: "1000" -- 1 second timeout
+   # Format 2: "10000,60000" -- 10s timeout to first result, 
+   #                            then 60s timeout for the rest of query.
+   #
+   # See javadoc for ARQ.queryTimeout for details.
+   # This can also be set on a per dataset basis in the dataset assembler.
+   #
+   # ja:context [ ja:cxtName "arq:queryTimeout" ;  ja:cxtValue "30000" ] ;
+
+   # Add any custom classes you want to load.
+   # Must have a "public static void init()" method.
+   # ja:loadClass "your.code.Class" ;   
+
+   # End triples.
+   .

Modified: jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/ServerTest.java
URL: http://svn.apache.org/viewvc/jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/ServerTest.java?rev=1583063&r1=1583062&r2=1583063&view=diff
==============================================================================
--- jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/ServerTest.java (original)
+++ jena/Experimental/jena-fuseki2/src/test/java/org/apache/jena/fuseki/ServerTest.java Sat Mar 29 21:45:54 2014
@@ -129,8 +129,6 @@ public class ServerTest {
         JettyServerConfig config = new JettyServerConfig() ;
         // Avoid any persistent record.
         config.port = ServerTest.port ;
-        config.mgtPort = ServerTest.port ;
-        config.pagesPort = ServerTest.port ;
         config.loopback = listenLocal ;
         config.jettyConfigFile = null ;
         config.pages = Fuseki.PagesStatic ;