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()) ;
}