Author: andy
Date: Sun Dec  1 15:01:13 2013
New Revision: 1546818

URL: http://svn.apache.org/r1546818
Log:
Intermediate checkpoint - some support for removing a dataset.

Added:
    jena/branches/jena-fuseki-new-ui/delete-ds   (with props)
    jena/branches/jena-fuseki-new-ui/get-ds   (with props)
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsServlet.java
Modified:
    jena/branches/jena-fuseki-new-ui/post-ds
    jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki.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/DatasetsCollectionServlet.java
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.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/servlets/SPARQL_QueryGeneral.java
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberFilter.java
    
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java

Added: jena/branches/jena-fuseki-new-ui/delete-ds
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/delete-ds?rev=1546818&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/delete-ds (added)
+++ jena/branches/jena-fuseki-new-ui/delete-ds Sun Dec  1 15:01:13 2013
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+curl -X DELETE 'http://localhost:3030/$/datasets/NEW'
\ No newline at end of file

Propchange: jena/branches/jena-fuseki-new-ui/delete-ds
------------------------------------------------------------------------------
    svn:executable = *

Added: jena/branches/jena-fuseki-new-ui/get-ds
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/get-ds?rev=1546818&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/get-ds (added)
+++ jena/branches/jena-fuseki-new-ui/get-ds Sun Dec  1 15:01:13 2013
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+wget -S -O- -q 'http://localhost:3030/NEW/query?query=ASK{}'
\ No newline at end of file

Propchange: jena/branches/jena-fuseki-new-ui/get-ds
------------------------------------------------------------------------------
    svn:executable = *

Modified: jena/branches/jena-fuseki-new-ui/post-ds
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/post-ds?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/post-ds (original)
+++ jena/branches/jena-fuseki-new-ui/post-ds Sun Dec  1 15:01:13 2013
@@ -1,4 +1,4 @@
 #!/bin/bash
 
 curl --data-binary @config2.ttl --header 'Content-type: text/turtle' \
-     http://localhost:3030/$/datasets
\ No newline at end of file
+     'http://localhost:3030/$/datasets'
\ No newline at end of file

Modified: jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki.java (original)
+++ jena/branches/jena-fuseki-new-ui/src-dev/dev/RunFuseki.java Sun Dec  1 
15:01:13 2013
@@ -61,7 +61,7 @@ public class RunFuseki
         
         FusekiCmd.main(
                      //  "-v",
-                     "--uber", "--update", "--mem", "--mgtPort=0", "/ds"
+                     "--update", "--mem", "--mgtPort=0", "/ds"
                      //"--update", "--loc="+tmpdir+"DB", 
"--set=tdb:unionDefaultGraph=true", "/ds"
                      //"--update", "--mem", "/ds"
 

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=1546818&r1=1546817&r2=1546818&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
 Sun Dec  1 15:01:13 2013
@@ -103,6 +103,13 @@ public class Fuseki
     /** Instance of log for operations */
     public static final Logger requestLog       = 
LoggerFactory.getLogger(requestLogName) ;
     
+    /** Admin log file for operations */
+    public static final String adminLogName   = PATH+".Admin" ;
+    
+    /** Instance of log for operations */
+    public static final Logger adminLog       = 
LoggerFactory.getLogger(adminLogName) ;
+    
+
     /** Actual log file for general server messages.*/
     public static final String serverLogName    = PATH+".Server" ;
     

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=1546818&r1=1546817&r2=1546818&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
 Sun Dec  1 15:01:13 2013
@@ -55,35 +55,35 @@ import com.hp.hpl.jena.tdb.sys.Names ;
 import com.hp.hpl.jena.tdb.transaction.TransactionManager ;
 
 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"
-
-                                                          ,
-                                                          "## 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"
-
-                                                          , "## Everything", 
"log4j.rootLogger=INFO, jena.plain",
-                                                          
"log4j.logger.com.hp.hpl.jena=WARN",
-                                                          
"log4j.logger.org.openjena=WARN",
-                                                          
"log4j.logger.org.apache.jena=WARN"
-
-                                                          , "# Server log.",
-                                                          
"log4j.logger.org.apache.jena.fuseki.Server=INFO",
-                                                          "# Request log.",
-                                                          
"log4j.logger.org.apache.jena.fuseki.Fuseki=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 ") ;
+    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",
+         
+         "## 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",
+
+         "## Everything", "log4j.rootLogger=INFO, jena.plain",
+         "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.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"
+            ) ;
 
     // Set logging.
     // 1/ Use log4j.configuration is defined.
@@ -145,15 +145,12 @@ public class FusekiCmd extends CmdARQ {
     private static ArgDecl             argFusekiConfig = new 
ArgDecl(ArgDecl.HasValue, "config", "conf") ;
     private static ArgDecl             argJettyConfig  = new 
ArgDecl(ArgDecl.HasValue, "jetty-config") ;
     private static ArgDecl             argGZip         = new 
ArgDecl(ArgDecl.HasValue, "gzip") ;
-    private static ArgDecl             argUber         = new 
ArgDecl(ArgDecl.NoValue, "uber", "über") ;         // Use
-                                                                               
                                  // the
-                                                                               
                                  // überservlet
-                                                                               
                                  // (experimental)
-    private static ArgDecl             argBasicAuth    = new 
ArgDecl(ArgDecl.HasValue, "basic-auth") ;
-
+    
+    // Ignored - it's always dynamic dispatch 
+    private static ArgDecl             argUber         = new 
ArgDecl(ArgDecl.NoValue, "uber", "über") ;
     private static ArgDecl             argGSP          = new 
ArgDecl(ArgDecl.NoValue, "gsp") ;                  // GSP
-                                                                               
                                  // compliance
-                                                                               
                                  // mode
+
+    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") ;
@@ -384,10 +381,9 @@ public class FusekiCmd extends CmdARQ {
         }
 
         if ( contains(argUber) )
-            SPARQLServer.überServlet = true ;
-
+            Fuseki.configLog.info("Dynamic dispatch is now the only mode: 
--uber is not needed" );
+        
         if ( contains(argGSP) ) {
-            SPARQLServer.überServlet = true ;
             Fuseki.graphStoreProtocolPostCreate = true ;
         }
 

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsCollectionServlet.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsCollectionServlet.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsCollectionServlet.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsCollectionServlet.java
 Sun Dec  1 15:01:13 2013
@@ -32,6 +32,7 @@ import org.apache.jena.atlas.json.JSON ;
 import org.apache.jena.atlas.json.JsonBuilder ;
 import org.apache.jena.atlas.json.JsonValue ;
 import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.fuseki.Fuseki ;
 import org.apache.jena.fuseki.FusekiLib ;
 import org.apache.jena.fuseki.server.DatasetRef ;
 import org.apache.jena.fuseki.server.DatasetRegistry ;
@@ -45,17 +46,34 @@ import org.apache.jena.riot.system.Error
 import org.apache.jena.riot.system.ErrorHandlerFactory ;
 import org.apache.jena.riot.system.StreamRDF ;
 import org.apache.jena.riot.system.StreamRDFLib ;
+import org.slf4j.Logger ;
 
 import com.hp.hpl.jena.rdf.model.Model ;
 import com.hp.hpl.jena.rdf.model.ModelFactory ;
 
 public class DatasetsCollectionServlet extends ServletBase {
+    //private static Logger log = Fuseki.adminLog ;
     
     public DatasetsCollectionServlet() {}
     
-    // Move doCommon from SPARQL_ServletBase to between ServiceBase and 
SPARQL_ServletBase??
+    // LOG
     
     @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
+        try {
+            execGet(request, response) ;
+        } catch (ActionErrorException ex) {
+            if ( ex.exception != null )
+                ex.exception.printStackTrace(System.err) ;
+            // XXX Log message done by printResponse in a moment.
+            if ( ex.message != null )
+                responseSendError(response, ex.rc, ex.message) ;
+            else
+                responseSendError(response, ex.rc) ;
+        } 
+    }
+
+    @Override
     protected void doPost(HttpServletRequest request, HttpServletResponse 
response) {
         // POST a new description.
         try {
@@ -72,9 +90,9 @@ public class DatasetsCollectionServlet e
     }
         
     @Override
-    protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
+    protected void doDelete(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
         try {
-            execGet(request, response) ;
+            execDelete(request, response) ;
         } catch (ActionErrorException ex) {
             if ( ex.exception != null )
                 ex.exception.printStackTrace(System.err) ;
@@ -85,21 +103,18 @@ public class DatasetsCollectionServlet e
                 responseSendError(response, ex.rc) ;
         } 
     }
+    
     protected void execGet(HttpServletRequest request, HttpServletResponse 
response) {
+        log.info("Admin: GET "+request.getRequestURI()); // +Query string.
         JsonBuilder builder = new JsonBuilder() ;
-        String pathInfo = request.getPathInfo() ;
-        if ( pathInfo == null || pathInfo.isEmpty() || pathInfo.equals("/") ) {
+        String name = mapRequestToDataset(request) ;
+        if ( name == null ) {
             // All
-            
             builder.startObject() ;
             builder.key("datasets") ;
             JsonDescription.arrayDatasets(builder, DatasetRegistry.get());
             builder.finishObject() ;
         } else {
-            String name = pathInfo ; // request.getRequestURI() ;
-            int idx = pathInfo.lastIndexOf('/') ;
-            if ( idx > 0 )
-                name = name.substring(idx) ;
             String datasetPath = DatasetRef.canocialDatasetPath(name) ;
             DatasetRef dsDesc = DatasetRegistry.get().get(datasetPath) ;
             if ( dsDesc == null )
@@ -117,11 +132,25 @@ public class DatasetsCollectionServlet e
         } catch (IOException ex) { errorOccurred(ex) ; }
     }
     
-    protected void execPost(HttpServletRequest request, HttpServletResponse 
response) {
+    // Null means no name given.
+    static String mapRequestToDataset(HttpServletRequest request) {
         String pathInfo = request.getPathInfo() ;
-        if ( pathInfo != null && ! pathInfo.isEmpty() && ! 
pathInfo.equals("/") ) {
-            // Can only POST to the container.
-            errorNotFound("Not found") ;
+        if ( pathInfo == null || pathInfo.isEmpty() || pathInfo.equals("/") )
+            return null ;
+        String name = pathInfo ;
+        // pathInfo starts with a "/"
+        int idx = pathInfo.lastIndexOf('/') ;
+        if ( idx > 0 )
+            name = name.substring(idx) ;
+        // Returns "/name"
+        return name ; 
+    }
+    
+    protected void execPost(HttpServletRequest request, HttpServletResponse 
response) {
+        log.info("Admin: POST "+request.getRequestURI()); // +Query string.
+        String name = mapRequestToDataset(request) ;
+        if ( name != null ) {
+            errorBadRequest("POST only to the container") ;
             return ;
         }
         
@@ -146,6 +175,25 @@ public class DatasetsCollectionServlet e
         } catch (IOException ex) { IO.exception(ex) ; }
     }
 
+    protected void execDelete(HttpServletRequest request, HttpServletResponse 
response) {
+        // Find DS.
+        log.info("Admin: DELETE "+request.getRequestURI()); // +Query string.
+        String name = mapRequestToDataset(request) ;
+        if ( name == null ) {
+            errorBadRequest("DELETE only to the container entries.") ;
+            return ;
+        }
+        
+        //  Canoncial name
+        if ( ! DatasetRegistry.get().isRegistered(name) )
+            errorBadRequest("Not found: " + name) ;
+        
+        DatasetRef dsRef = DatasetRegistry.get().get(name) ;
+        DatasetRegistry.get().remove(name) ;
+        // No longer routeable
+        dsRef.gracefulShutdown() ;
+    }
+
     private static void copyFile(File source, File dest) {
         try {
             @SuppressWarnings("resource")

Added: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsServlet.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsServlet.java?rev=1546818&view=auto
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsServlet.java
 (added)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/DatasetsServlet.java
 Sun Dec  1 15:01:13 2013
@@ -0,0 +1,257 @@
+/**
+ * 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.mgt;
+
+import java.io.* ;
+import java.nio.channels.FileChannel ;
+import java.util.List ;
+
+import javax.servlet.ServletException ;
+import javax.servlet.ServletOutputStream ;
+import javax.servlet.http.HttpServletRequest ;
+import javax.servlet.http.HttpServletResponse ;
+
+import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.json.JSON ;
+import org.apache.jena.atlas.json.JsonBuilder ;
+import org.apache.jena.atlas.json.JsonValue ;
+import org.apache.jena.atlas.web.ContentType ;
+import org.apache.jena.fuseki.FusekiLib ;
+import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DatasetRegistry ;
+import org.apache.jena.fuseki.server.FusekiConfig ;
+import org.apache.jena.fuseki.server.SPARQLServer ;
+import org.apache.jena.fuseki.servlets.HttpAction ;
+import org.apache.jena.fuseki.servlets.SPARQL_ServletBase ;
+import org.apache.jena.riot.* ;
+import org.apache.jena.riot.lang.LangRIOT ;
+import org.apache.jena.riot.system.ErrorHandler ;
+import org.apache.jena.riot.system.ErrorHandlerFactory ;
+import org.apache.jena.riot.system.StreamRDF ;
+import org.apache.jena.riot.system.StreamRDFLib ;
+
+import com.hp.hpl.jena.rdf.model.Model ;
+import com.hp.hpl.jena.rdf.model.ModelFactory ;
+
+
+public class DatasetsServlet extends SPARQL_ServletBase /* rename */ {
+    //private static Logger log = Fuseki.adminLog ;
+
+    // XXX Rewrite for (renamed) SPARQL_ServletBase
+    
+    public DatasetsServlet() {}
+    
+    // LOG
+    
+    @Override
+    protected void doGet(HttpServletRequest request, HttpServletResponse 
response) {
+        doCommon(request, response);
+    }
+
+    @Override
+    protected void doPost(HttpServletRequest request, HttpServletResponse 
response) {
+        doCommon(request, response);
+    }
+    
+    @Override
+    protected void doDelete(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
+        doCommon(request, response);
+    }
+    
+    @Override
+    protected void validate(HttpAction action) {
+    }
+
+    @Override
+    protected void perform(HttpAction action) {
+        String name = mapRequestToDataset(action) ;
+        
+    }
+    
+
+    protected void execGet(HttpServletRequest request, HttpServletResponse 
response) {
+        log.info("Admin: GET "+request.getRequestURI()); // +Query string.
+        JsonBuilder builder = new JsonBuilder() ;
+        String name = mapRequestToDataset(request) ;
+        if ( name == null ) {
+            // All
+            builder.startObject() ;
+            builder.key("datasets") ;
+            JsonDescription.arrayDatasets(builder, DatasetRegistry.get());
+            builder.finishObject() ;
+        } else {
+            String datasetPath = DatasetRef.canocialDatasetPath(name) ;
+            DatasetRef dsDesc = DatasetRegistry.get().get(datasetPath) ;
+            if ( dsDesc == null )
+                errorNotFound("Not found: dataset "+name);
+            JsonDescription.describe(builder, dsDesc) ;
+        }
+        JsonValue v = builder.build() ;
+        try {
+            ServletOutputStream out = response.getOutputStream() ;
+            response.setContentType(WebContent.contentTypeJSON);
+            response.setCharacterEncoding(WebContent.charsetUTF8) ;
+            JSON.write(out, v) ;
+            out.println() ; 
+            out.flush() ;
+        } catch (IOException ex) { errorOccurred(ex) ; }
+    }
+    
+    @Deprecated()
+    static String mapRequestToDataset(HttpServletRequest request) {
+        String pathInfo = request.getPathInfo() ;
+        if ( pathInfo == null || pathInfo.isEmpty() || pathInfo.equals("/") )
+            return null ;
+        String name = pathInfo ;
+        // pathInfo starts with a "/"
+        int idx = pathInfo.lastIndexOf('/') ;
+        if ( idx > 0 )
+            name = name.substring(idx) ;
+        // Returns "/name"
+        return name ; 
+    }
+    
+    // Null means no name given.
+    @Override
+    protected String mapRequestToDataset(HttpAction action) {
+        // Find the part after the name used to dispatch this request. 
+        System.out.println("context path = 
'"+action.request.getContextPath()+"'") ;
+        System.out.println("pathinfo     = 
'"+action.request.getPathInfo()+"'") ;
+        System.out.println("servlet path = 
'"+action.request.getServletPath()+"'") ;
+        
+
+//        log.info("context path = "+action.request.getContextPath()) ;
+//        log.info("pathinfo     = "+action.request.getPathInfo()) ;
+//        log.info("servlet path = "+action.request.getServletPath()) ;
+        // if /name
+        //action.request.getServletPath() ;
+        // if /*
+        String pathInfo = action.request.getPathInfo() ;
+        if ( pathInfo == null || pathInfo.isEmpty() || pathInfo.equals("/") )
+            return null ;
+        String name = pathInfo ;
+        // pathInfo starts with a "/"
+        int idx = pathInfo.lastIndexOf('/') ;
+        if ( idx > 0 )
+            name = name.substring(idx) ;
+        // Returns "/name"
+        return name ; 
+    }
+    
+    protected void execPost(HttpServletRequest request, HttpServletResponse 
response) {
+        log.info("Admin: POST "+request.getRequestURI()); // +Query string.
+        String name = mapRequestToDataset(request) ;
+        if ( name != null ) {
+            errorBadRequest("POST only to the container") ;
+            return ;
+        }
+        
+        Model m = ModelFactory.createDefaultModel() ;
+        StreamRDF dest = StreamRDFLib.graph(m.getGraph()) ;
+        bodyAsGraph(request, dest) ;
+        List<DatasetRef> refs = FusekiConfig.readConfiguration(m);
+        
+        for (DatasetRef dsDesc : refs) {
+            String datasetPath = dsDesc.name ;
+            if ( DatasetRegistry.get().isRegistered(datasetPath) )
+                // Remove?
+                errorBadRequest("Already registered: " + dsDesc.name) ;
+            SPARQLServer.registerDataset(datasetPath, dsDesc) ;
+        }
+        try {
+            String n = IO.uniqueFilename(FusekiConfig.configurationsDirectory, 
"assem", "ttl") ;
+            OutputStream out = new FileOutputStream(n) ;
+            out = new BufferedOutputStream(out) ;
+            RDFDataMgr.write(out, m, Lang.TURTLE) ;
+            out.close() ;
+        } catch (IOException ex) { IO.exception(ex) ; }
+    }
+
+    protected void execDelete(HttpServletRequest request, HttpServletResponse 
response) {
+        // Find DS.
+        log.info("Admin: DELETE "+request.getRequestURI()); // +Query string.
+        String name = mapRequestToDataset(request) ;
+        if ( name == null ) {
+            errorBadRequest("DELETE only to the container entries.") ;
+            return ;
+        }
+        
+        //  Canoncial name
+        if ( ! DatasetRegistry.get().isRegistered(name) )
+            errorBadRequest("Not found: " + name) ;
+        
+        DatasetRef dsRef = DatasetRegistry.get().get(name) ;
+        DatasetRegistry.get().remove(name) ;
+        // No longer routeable
+        dsRef.gracefulShutdown() ;
+    }
+
+    private static void copyFile(File source, File dest) {
+        try {
+            @SuppressWarnings("resource")
+            FileChannel sourceChannel = new 
FileInputStream(source).getChannel();
+            @SuppressWarnings("resource")
+            FileChannel destChannel = new FileOutputStream(dest).getChannel();
+            destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
+            sourceChannel.close();
+            destChannel.close();
+        } catch (IOException ex) { IO.exception(ex); }
+    }
+    
+    // XXX Merge with SPARQL_REST_RW.incomingData
+    
+    protected static ErrorHandler errorHandler = 
ErrorHandlerFactory.errorHandlerStd(log) ;
+
+    private static void bodyAsGraph(HttpServletRequest request, StreamRDF 
dest) {
+        String base = wholeRequestURL(request) ;
+        ContentType ct = FusekiLib.getContentType(request) ;
+        Lang lang = WebContent.contentTypeToLang(ct.getContentType()) ;
+        if ( lang == null ) {
+            errorBadRequest("Unknown content type for triples: " + ct) ;
+            return ;
+        }
+        InputStream input = null ;
+        try { input = request.getInputStream() ; } 
+        catch (IOException ex) { IO.exception(ex) ; }
+
+        int len = request.getContentLength() ;
+//        if ( verbose ) {
+//            if ( len >= 0 )
+//                log.info(format("[%d]   Body: Content-Length=%d, 
Content-Type=%s, Charset=%s => %s", action.id, len,
+//                                ct.getContentType(), ct.getCharset(), 
lang.getName())) ;
+//            else
+//                log.info(format("[%d]   Body: Content-Type=%s, Charset=%s => 
%s", action.id, ct.getContentType(),
+//                                ct.getCharset(), lang.getName())) ;
+//        }
+        dest.prefix("root", base+"#");
+        parse(dest, input, lang, base) ;
+         
+    }
+
+    public static void parse(StreamRDF dest, InputStream input, Lang lang, 
String base) {
+        // Need to adjust the error handler.
+//        try { RDFDataMgr.parse(dest, input, base, lang) ; }
+//        catch (RiotException ex) { errorBadRequest("Parse error: 
"+ex.getMessage()) ; }
+        LangRIOT parser = RiotReader.createParser(input, lang, base, dest) ;
+        parser.getProfile().setHandler(errorHandler) ;
+        try { parser.parse() ; } 
+        catch (RiotException ex) { errorBadRequest("Parse error: 
"+ex.getMessage()) ; }
+    }
+}
+

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetRef.java
 Sun Dec  1 15:01:13 2013
@@ -19,12 +19,15 @@
 package org.apache.jena.fuseki.server;
 
 import java.util.* ;
+import java.util.concurrent.atomic.AtomicBoolean ;
 import java.util.concurrent.atomic.AtomicLong ;
 
 import org.apache.jena.fuseki.Fuseki ;
 
 import com.hp.hpl.jena.query.ReadWrite ;
 import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+import com.hp.hpl.jena.tdb.StoreConnection ;
+import com.hp.hpl.jena.tdb.transaction.DatasetGraphTransaction ;
 
 public class DatasetRef implements DatasetMXBean, Counters
 {
@@ -36,6 +39,7 @@ public class DatasetRef implements Datas
     public ServiceRef upload                    = new ServiceRef("upload") ;
     public ServiceRef readGraphStore            = new ServiceRef("gspRead") ;
     public ServiceRef readWriteGraphStore       = new 
ServiceRef("gspReadWrite") ; 
+    private AtomicBoolean shuttingdown          = new AtomicBoolean(false) ; 
     
     // Dataset-level counters.
     private final CounterSet counters           = new CounterSet() ;
@@ -141,8 +145,24 @@ public class DatasetRef implements Datas
                 activeWriteTxn.decrementAndGet() ;
                 break ;
         }
+        checkShutdown() ;
     }
 
+    private void checkShutdown() {
+        if ( shuttingdown.get() ) {
+        if ( activeReadTxn.get() == 0 && activeWriteTxn.get() == 0 )
+            shutdown() ;
+        }
+    }
+    
+    private void shutdown() {
+        dataset.close() ;
+        if ( dataset instanceof DatasetGraphTransaction ) {
+            DatasetGraphTransaction dsgtxn = (DatasetGraphTransaction)dataset ;
+            StoreConnection.release(dsgtxn.getLocation()) ;
+        }
+    }
+    
     //TODO Need to be able to set this from the config file.  
     public boolean allowDatasetUpdate           = false;
     
@@ -158,6 +178,13 @@ public class DatasetRef implements Datas
                ;
     }
     
+    public void gracefulShutdown() {
+        // In graceful shutdown, we assume it has been unlinked from the 
registry.
+        // We just wait for the transactions to end.
+        shuttingdown.set(true) ;
+        checkShutdown() ;
+    }
+    
     // MBean
     
     @Override

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=1546818&r1=1546817&r2=1546818&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
 Sun Dec  1 15:01:13 2013
@@ -99,13 +99,15 @@ public class SPARQLServer {
         
         for (DatasetRef dsDesc : serverConfig.datasets)
             configureOneDataset(context, dsDesc, 
serverConfig.enableCompression) ;
-        
-        if ( überServlet ) {
-            FilterHolder f = new FilterHolder(new SPARQL_UberFilter()) ;
-            //FilterMapping
-            EnumSet<DispatcherType> es = EnumSet.allOf(DispatcherType.class) ; 
-            context.addFilter(f, "/*", es);
-        }
+
+        // Service operation dispatch:
+        // This filter looks at incoming HTTP requests and routes one that 
match
+        // registered, active datasets to the all purpose service dispatch 
servlet
+        // SPARQL_UberServlet.
+
+        FilterHolder f = new FilterHolder(new SPARQL_UberFilter()) ;
+        EnumSet<DispatcherType> es = EnumSet.allOf(DispatcherType.class) ; 
+        context.addFilter(f, "/*", es);
     }
     
     /**
@@ -289,51 +291,13 @@ public class SPARQLServer {
         return context ;
     }
 
-    /** Experimental - off by default. The überservlet sits on the dataset 
name and handles all requests.
-      * Includes direct naming and quad access to the dataset. 
-      */
-    public static boolean       überServlet       = false ;
-    
     private static List<String> ListOfEmptyString = Arrays.asList("") ;
 
     private void configureOneDataset(ServletContextHandler context, DatasetRef 
dsDesc, boolean enableCompression) {
         
         String datasetPath = DatasetRef.canocialDatasetPath(dsDesc.name) ;
         registerDataset(datasetPath, dsDesc) ;
-        
-        if ( !überServlet ) {
-            HttpServlet sparqlQuery = new SPARQL_QueryDataset() ;
-            HttpServlet sparqlUpdate = new SPARQL_Update() ;
-            HttpServlet sparqlUpload = new SPARQL_Upload() ;
-            HttpServlet sparqlHttpR = new SPARQL_REST_R() ;
-            HttpServlet sparqlHttpRW = new SPARQL_REST_RW() ;
-
-            addServlet(context, datasetPath, sparqlQuery, dsDesc.query, 
enableCompression) ;
-            addServlet(context, datasetPath, sparqlUpdate, dsDesc.update, 
false) ;
-            addServlet(context, datasetPath, sparqlUpload, dsDesc.upload, 
false) ; // No point - no results of any size.
-            addServlet(context, datasetPath, sparqlHttpR, 
dsDesc.readGraphStore, enableCompression) ;
-            addServlet(context, datasetPath, sparqlHttpRW, 
dsDesc.readWriteGraphStore, enableCompression) ;
-            // This adds direct operations on the dataset itself.
-            // addServlet(context, datasetPath, sparqlDataset,
-            // ListOfEmptyString, enableCompression) ;
-        } else {
-            // This is the servlet that analyses requests and dispatches them 
to
-            // the appropriate servlet. 
-            // SPARQL Query, SPARQL Update -- handles dataset?query=
-            // dataset?update=
-            // Graph Store Protocol (direct and indirect naming) if enabled.
-            // GET/PUT/POST on the dataset itself.
-            // It also checks for a request that looks like a service request 
and passes it
-            // on to the service (this takes precedence over direct naming).
-
-            if ( false ) {
-                //XXX Filter version superceeds this.
-                HttpServlet sparqlDataset = new 
SPARQL_UberServlet.AccessByConfig() ;
-                addServlet(context, datasetPath, sparqlDataset, epDataset, 
enableCompression) ;
-            }
-        }
-
-        // Add JMX beans to record daatset and it's services.
+        // Add JMX beans to record dataset and it's services.
         addJMX(dsDesc) ;
     }
 

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_QueryGeneral.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_QueryGeneral.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_QueryGeneral.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_QueryGeneral.java
 Sun Dec  1 15:01:13 2013
@@ -46,7 +46,7 @@ public class SPARQL_QueryGeneral extends
     protected void validateQuery(HttpAction action, Query query) {}
     
     @Override
-    protected String mapRequestToDataset(String uri)
+    protected String mapRequestToDataset(HttpAction action)
     { return null ; }
     
     @Override

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_REST_R.java
 Sun Dec  1 15:01:13 2013
@@ -39,7 +39,7 @@ public class SPARQL_REST_R extends SPARQ
     
     
     @Override
-    protected String mapRequestToDataset(String uri) { return 
ActionLib.mapRequestToDatasetLongest$(uri) ; } 
+    protected String mapRequestToDataset(HttpAction action) { return 
ActionLib.mapRequestToDatasetLongest$(action.request.getRequestURI()) ; } 
 
     @Override
     protected void doGet(HttpAction action)

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_ServletBase.java
 Sun Dec  1 15:01:13 2013
@@ -119,9 +119,8 @@ public abstract class SPARQL_ServletBase
     private void execCommonWorker(HttpAction action)
     {
         DatasetRef dsRef = null ;
-        String uri = action.request.getRequestURI() ;
 
-        String datasetUri = mapRequestToDataset(uri) ;
+        String datasetUri = mapRequestToDataset(action) ;
         
         if ( datasetUri != null ) {
             dsRef = DatasetRegistry.get().get(datasetUri) ;
@@ -133,6 +132,7 @@ public abstract class SPARQL_ServletBase
             dsRef = FusekiConfig.serviceOnlyDatasetRef() ;
 
         action.setDataset(dsRef) ;
+        String uri = action.request.getRequestURI() ;
         String serviceName = ActionLib.mapRequestToService(dsRef, uri, 
datasetUri) ;
         ServiceRef srvRef = dsRef.getServiceRef(serviceName) ;
         action.setService(srvRef) ;
@@ -145,9 +145,8 @@ public abstract class SPARQL_ServletBase
     }
 
     // Execute - no stats.
-    // Intecept point for the UberServlet 
-    protected void executeAction(HttpAction action)
-    {
+    // Intercept point for the UberServlet 
+    protected void executeAction(HttpAction action) {
         executeLifecycle(action) ;
     }
     
@@ -187,9 +186,9 @@ public abstract class SPARQL_ServletBase
     /** Map request to uri in the registry.
      *  null means no mapping done (passthrough). 
      */
-    protected String mapRequestToDataset(String uri) 
+    protected String mapRequestToDataset(HttpAction action) 
     {
-        return ActionLib.mapRequestToDataset(uri) ;
+        return ActionLib.mapRequestToDataset(action.request.getRequestURI()) ;
     }
     
     protected static void incCounter(Counters counters, CounterName name) {
@@ -211,9 +210,7 @@ public abstract class SPARQL_ServletBase
     }
 
     @SuppressWarnings("unused") // ServletException
-    protected void doPatch(HttpServletRequest request, HttpServletResponse 
response)
-    throws ServletException, IOException
-    {
+    protected void doPatch(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
         response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "HTTP 
PATCH not supported");
     }
     

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberFilter.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberFilter.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberFilter.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberFilter.java
 Sun Dec  1 15:01:13 2013
@@ -53,7 +53,7 @@ public class SPARQL_UberFilter implement
             if ( datasetUri != null ) {        
                 if ( DatasetRegistry.get().isRegistered(datasetUri) ) {
                     // Intercept and redirect
-                    log.info("Redirect: "+uri);
+                    //log.info("Redirect: "+uri);
                     überServlet.doCommon(req, resp) ;
                     return ;
                 }

Modified: 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
URL: 
http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java?rev=1546818&r1=1546817&r2=1546818&view=diff
==============================================================================
--- 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
 (original)
+++ 
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_UberServlet.java
 Sun Dec  1 15:01:13 2013
@@ -120,9 +120,8 @@ public abstract class SPARQL_UberServlet
      *  null means no mapping done 
      */
     @Override
-    protected String mapRequestToDataset(String uri) 
-    {
-        return ActionLib.mapRequestToDatasetLongest$(uri) ;
+    protected String mapRequestToDataset(HttpAction action) {
+        return 
ActionLib.mapRequestToDatasetLongest$(action.request.getRequestURI()) ;
     }
     
 


Reply via email to