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/25 17:57:23 UTC

svn commit: r1581417 - in /jena/branches/jena-fuseki-new-ui/src: main/java/org/apache/jena/fuseki/build/ main/java/org/apache/jena/fuseki/jetty/ main/java/org/apache/jena/fuseki/server/ test/java/org/apache/jena/fuseki/

Author: andy
Date: Tue Mar 25 16:57:23 2014
New Revision: 1581417

URL: http://svn.apache.org/r1581417
Log:
Creation/initialization of FUSEKI_BASE

Modified:
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/Template.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/TemplateFunctions.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java
    jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java
    jena/branches/jena-fuseki-new-ui/src/test/java/org/apache/jena/fuseki/ServerTest.java

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/Template.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/Template.java?rev=1581417&r1=1581416&r2=1581417&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/Template.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/Template.java Tue Mar 25 16:57:23 2014
@@ -18,15 +18,31 @@
 
 package org.apache.jena.fuseki.build;
 
+import java.nio.file.Path ;
+
+import org.apache.jena.fuseki.server.FusekiServer ;
+
 public class Template
 {
-    public static final String TemplateDir = "templates"; 
-
-    public static final String templateMemFN        = TemplateDir+"/config-mem" ;
-    public static final String templateTDBFN        = TemplateDir+"/config-tdb" ;
-    public static final String templateTDBMemFN     = TemplateDir+"/config-tdb-mem" ; 
-    public static final String templateTDBDirFN     = TemplateDir+"/config-tdb-dir" ;
+    public static Path getPath(String templateName) {
+        return FusekiServer.FUSEKI_BASE.resolve(templateName) ;
+    }
+    
+    public static final String templateDir          = "templates" ;
+    public static final String templateMemFN        = templateDir+"/config-mem" ;
+    public static final String templateTDBFN        = templateDir+"/config-tdb" ;
+    public static final String templateTDBMemFN     = templateDir+"/config-tdb-mem" ; 
+    public static final String templateTDBDirFN     = templateDir+"/config-tdb-dir" ;
+    public static final String templateServiceFN    = templateDir+"/config-service" ;       // Dummy used by dataset-less service.
     
+    // Template may be in a resources area of a jar file so you can't do a directory listing.
+    public static final String[] templateNames = {
+        templateMemFN ,
+        templateTDBFN ,
+        templateTDBMemFN ,
+        templateTDBDirFN ,
+        templateServiceFN
+    } ;
     
     public static final String NAME = "NAME" ;
     public static final String DATA = "DATA" ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/TemplateFunctions.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/TemplateFunctions.java?rev=1581417&r1=1581416&r2=1581417&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/TemplateFunctions.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/build/TemplateFunctions.java Tue Mar 25 16:57:23 2014
@@ -31,11 +31,12 @@ import com.hp.hpl.jena.util.FileUtils ;
 public class TemplateFunctions
 {
     /** Read in a template from a file, substitute for {NAME} and return the string. */
-    public static String templateFile(String templateFile, Map<String, String> params) {
+    public static String templateFile(String templateName, Map<String, String> params) {
+        String templateFilename = Template.getPath(templateName).toString() ;
         String template ;
-        try { template = FileUtils.readWholeFileAsUTF8(templateFile) ; }
+        try { template = FileUtils.readWholeFileAsUTF8(templateFilename) ; }
         catch (IOException ex) { 
-            Fuseki.serverLog.error("File not found: "+templateFile);
+            Fuseki.serverLog.error("File not found: "+templateFilename);
             IO.exception(ex); return null ;
         }
         return templateString(template, params) ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java?rev=1581417&r1=1581416&r2=1581417&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/jetty/SPARQLServer.java Tue Mar 25 16:57:23 2014
@@ -129,7 +129,7 @@ public class SPARQLServer {
         try {
             server.start() ;
         } catch (java.net.BindException ex) {
-            serverLog.error("SPARQLServer: Failed to start server: " + ex.getMessage()) ;
+            serverLog.error("SPARQLServer (port="+serverConnector.getPort()+"): Failed to start server: " + ex.getMessage()) ;
             System.exit(1) ;
         } catch (Exception ex) {
             serverLog.error("SPARQLServer: Failed to start server: " + ex.getMessage(), ex) ;

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java?rev=1581417&r1=1581416&r2=1581417&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiServer.java Tue Mar 25 16:57:23 2014
@@ -18,10 +18,7 @@
 
 package org.apache.jena.fuseki.server;
 
-import java.io.File ;
-import java.io.FilenameFilter ;
-import java.io.IOException ;
-import java.io.StringReader ;
+import java.io.* ;
 import java.nio.file.Files ;
 import java.nio.file.Path ;
 import java.nio.file.Paths ;
@@ -54,10 +51,14 @@ import com.hp.hpl.jena.tdb.sys.Names ;
 
 public class FusekiServer
 {
-    /** Root of the Fuseki installation for fixed files. */ 
+    /** Root of the Fuseki installation for fixed files. THis may be null (e.g. running inside a web application container) */ 
     public static Path FUSEKI_HOME = null ;
-    /** Root of the varying files in this deployment. Often $FUSEKI_HOME/run */ 
+    /** Root of the varying files in this deployment. Often $FUSEKI_HOME/run.
+     * This is not null - it may be /etc/fuseki, which must be writable.
+     */ 
     public static Path FUSEKI_BASE = null ;
+    
+    public static final String FUSEKI_BASE_ETC = "/etc/fuseki" ;  
 
     private static FilenameFilter filterConfig = new FilenameFilter() {
         @Override
@@ -106,30 +107,61 @@ public class FusekiServer
             return ;
         initialized = true ;
         
+        // --  Set and check FUSEKI_HOME and FUSEKI_BASE
+        
         if ( FUSEKI_HOME == null ) {
             // Make absolute
             String x1 = System.getenv("FUSEKI_HOME") ;
             if ( x1 != null )
                 FUSEKI_HOME = Paths.get(x1) ;
-            else
-                FUSEKI_HOME = Paths.get("") ;
         }
             
         if ( FUSEKI_BASE == null ) {
             String x2 = System.getenv("FUSEKI_BASE") ;
             if ( x2 != null )
                 FUSEKI_BASE = Paths.get(x2) ;
-            else
+            else if ( FUSEKI_HOME != null )
                 FUSEKI_BASE = FUSEKI_HOME.resolve(runArea) ;
         }
-
-        FUSEKI_HOME = FUSEKI_HOME.toAbsolutePath() ;
+        
+        if ( FUSEKI_HOME != null )
+            FUSEKI_HOME = FUSEKI_HOME.toAbsolutePath() ;
+        
         FUSEKI_BASE = FUSEKI_BASE.toAbsolutePath() ;
         
-        Fuseki.configLog.info("FUSEKI_HOME="+FUSEKI_HOME.toString());
+        Fuseki.configLog.info("FUSEKI_HOME="+ ((FUSEKI_HOME==null) ? "null" : FUSEKI_HOME.toString())) ;
         Fuseki.configLog.info("FUSEKI_BASE="+FUSEKI_BASE.toString());
+
+        // If FUSEKI_HOME exists, it may be FUSEKI_BASE.
+        
+        if ( FUSEKI_HOME != null ) {
+            if ( ! Files.isDirectory(FUSEKI_HOME) )
+                throw new FusekiConfigException("FUSEKI_HOME is not a directory: "+FUSEKI_HOME) ;
+            if ( ! Files.isReadable(FUSEKI_HOME) )
+                throw new FusekiConfigException("FUSEKI_HOME is not readable: "+FUSEKI_HOME) ;
+        }
+            
+        if ( Files.exists(FUSEKI_BASE) ) {
+            if ( ! Files.isDirectory(FUSEKI_BASE) )
+                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
+            ensureDir(FUSEKI_BASE);
+
+        // Ensure FUSEKI_BASE has the assumed directories.
+        dirTemplates        = writeableDirectory(FUSEKI_BASE, templatesNameBase) ;
+        dirDatabases        = writeableDirectory(FUSEKI_BASE, databasesLocationBase) ;
+        dirBackups          = writeableDirectory(FUSEKI_BASE, backupDirNameBase) ;
+        dirConfiguration    = writeableDirectory(FUSEKI_BASE, configDirNameBase) ;
+        dirLogs             = writeableDirectory(FUSEKI_BASE, logsNameBase) ;
+        dirSystemDatabase   = writeableDirectory(FUSEKI_BASE, systemDatabaseNameBase) ;
+        dirFileArea         = writeableDirectory(FUSEKI_BASE, systemFileAreaBase) ;
         
-        mustExist(FUSEKI_HOME) ;
+        // ---- Initialize with files.
+        
+        // Copy shiro.ini
+        // Copy templates
         
         // Copy in defaults?
         Path dirTemplatesMasters = makePath(FUSEKI_HOME, templatesNameBase) ;
@@ -139,23 +171,13 @@ public class FusekiServer
             throw new FusekiConfigException("FUSEKI_BASE exists but is a file") ;
         boolean initFusekiBase = ! Files.exists(FUSEKI_BASE) || emptyDir(FUSEKI_BASE) ;
         
-        ensureDir(FUSEKI_BASE) ;
-
-        dirTemplates        = makePath(FUSEKI_BASE, templatesNameBase) ;
-        ensureDir(dirTemplates) ; 
-
-        dirDatabases        = makePathEnsureDir(FUSEKI_BASE, databasesLocationBase) ;
-        dirBackups          = makePathEnsureDir(FUSEKI_BASE, backupDirNameBase) ;
-        dirConfiguration    = makePathEnsureDir(FUSEKI_BASE, configDirNameBase) ;
-        dirLogs             = makePathEnsureDir(FUSEKI_BASE, logsNameBase) ;
-        dirSystemDatabase   = makePathEnsureDir(FUSEKI_BASE, systemDatabaseNameBase) ;
-        dirFileArea         = makePathEnsureDir(FUSEKI_BASE, systemFileAreaBase) ;
-        
         String dftShiroIniFile = "shiro.ini" ;
-        if ( initFusekiBase ) { 
-            Fuseki.configLog.info("Initializing FUSEKI_BASE") ;
-            copyFile(FUSEKI_HOME.resolve(dftShiroIniFile), FUSEKI_BASE.resolve(dftShiroIniFile)) ; 
-            copyFileFilter(dirTemplatesMasters, dirTemplates, filterConfig) ;
+        
+        // Copy missing files into FUSEKI_BASE
+        Fuseki.configLog.info("Initializing FUSEKI_BASE") ;
+        copyFileIfMissing(FUSEKI_HOME, dftShiroIniFile, FUSEKI_BASE) ;
+        for ( String n : Template.templateNames ) {
+            copyFileIfMissing(FUSEKI_HOME, n, FUSEKI_BASE) ;
         }
     }
 
@@ -163,29 +185,50 @@ public class FusekiServer
         return dir.toFile().list().length <= 2 ;
     }
     
-    private static void copyFile(Path src, Path dst) {
-        try {
-            Files.copy(src, dst, StandardCopyOption.COPY_ATTRIBUTES) ;
-        } catch (IOException e) {
-            IO.exception("Failed to copy file "+src, e);
-            e.printStackTrace();
-        }
-    }
-
-    private static void copyFileFilter(Path srcDir, Path dstDir, FilenameFilter filterConfig) {
-        String[] files = srcDir.toFile().list(filterConfig) ;
-        for ( String fn : files ) {
+    /** Copy a file from src to dst under name fn.
+     * If src is null, try as a classpath resource
+     */
+    private static void copyFileIfMissing(Path src, String fn, Path dst) {
+        
+        Path dstFile = dst.resolve(fn) ;
+        if ( Files.exists(dstFile) )
+            return ;
+        
+        // fn may be a path.
+        if ( src != null ) {
             try {
-                Path src = srcDir.resolve(fn) ;
-                Path dst = dstDir.resolve(fn) ;
-                Files.copy(src, dst, StandardCopyOption.COPY_ATTRIBUTES) ;
+                Files.copy(src.resolve(fn), dstFile, StandardCopyOption.COPY_ATTRIBUTES) ;
             } catch (IOException e) {
-                IO.exception("Failed to copy directory of files "+srcDir, e);
+                IO.exception("Failed to copy file "+src, e);
+                e.printStackTrace();
+            }
+        } else {
+            try {
+                InputStream in = FusekiServer.class.getResource(fn).openStream() ;
+                Files.copy(in, dstFile) ;
+            }
+            catch (IOException e) {
+                IO.exception("Failed to copy file from resource: "+src, e);
                 e.printStackTrace();
             }
         }
+        
     }
 
+//    private static void copyFileFilter(Path srcDir, Path dstDir, FilenameFilter filterConfig) {
+//        String[] files = srcDir.toFile().list(filterConfig) ;
+//        for ( String fn : files ) {
+//            try {
+//                Path src = srcDir.resolve(fn) ;
+//                Path dst = dstDir.resolve(fn) ;
+//                Files.copy(src, dst, StandardCopyOption.COPY_ATTRIBUTES) ;
+//            } catch (IOException e) {
+//                IO.exception("Failed to copy directory of files "+srcDir, e);
+//                e.printStackTrace();
+//            }
+//        }
+//    }
+
     public static void initializeDataAccessPoints(ServerInitialConfig initialSetup, String configDir) {
         List<DataAccessPoint> configFileDBs = findDatasets(initialSetup) ;
         List<DataAccessPoint> directoryDBs =  FusekiConfig.readConfigurationDirectory(configDir) ;
@@ -304,7 +347,7 @@ public class FusekiServer
 
     /** Ensure a directory exists, creating it if necessary.
      */
-    private static void  ensureDir(Path directory) {
+    private static void ensureDir(Path directory) {
         File dir = directory.toFile() ;
         if ( ! dir.exists() )
             dir.mkdirs() ;
@@ -325,9 +368,11 @@ public class FusekiServer
         return dir.exists() ;
     }
 
-    private static Path makePathEnsureDir(Path root , String relName ) {
+    private static Path writeableDirectory(Path root , String relName ) {
         Path p = makePath(root, relName) ;
         ensureDir(p);
+        if ( ! Files.isWritable(p) )
+            throw new FusekiConfigException("Not writable: "+p) ;
         return p ;
     }
     

Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java?rev=1581417&r1=1581416&r2=1581417&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/ShiroEnvironmentLoader.java Tue Mar 25 16:57:23 2014
@@ -28,6 +28,7 @@ import javax.servlet.ServletContextEvent
 import javax.servlet.ServletContextListener ;
 
 import org.apache.jena.fuseki.Fuseki ;
+import org.apache.shiro.config.ConfigurationException ;
 import org.apache.shiro.io.ResourceUtils ;
 import org.apache.shiro.web.env.EnvironmentLoader ;
 import org.apache.shiro.web.env.ResourceBasedWebEnvironment ;
@@ -48,8 +49,15 @@ public class ShiroEnvironmentLoader exte
         Fuseki.init() ;
         FusekiServer.init() ;
         this.servletContext = sce.getServletContext() ;
+        try { 
         // Shiro.
-        initEnvironment(servletContext);
+            initEnvironment(servletContext);
+        } catch (ConfigurationException  ex) {
+            Fuseki.configLog.error("Shiro initialization failed: "+ex.getMessage());
+            // Exit?
+            throw ex ;
+        }
+        
     }
 
     @Override

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=1581417&r1=1581416&r2=1581417&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 Tue Mar 25 16:57:23 2014
@@ -100,10 +100,10 @@ public class ServerTest {
     }
 
     protected static void setupServer() {
-        FusekiServer.FUSEKI_HOME = Paths.get(".") ;
+        FusekiServer.FUSEKI_HOME = Paths.get("") ;
         FileOps.ensureDir("target");
         FileOps.ensureDir("target/run");
-        FusekiServer.FUSEKI_BASE = Paths.get("target/run") ;
+        FusekiServer.FUSEKI_BASE = FusekiServer.FUSEKI_HOME.resolve("target/run").toAbsolutePath() ;
         setupServer(null) ;
     }