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 2013/12/04 17:46:03 UTC
svn commit: r1547840 - in
/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki: ./
mgt/ migrate/ server/ servlets/
Author: andy
Date: Wed Dec 4 16:46:02 2013
New Revision: 1547840
URL: http://svn.apache.org/r1547840
Log:
Persistent server state.
Added:
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/StreamRDFLimited.java
- copied, changed from r1547170, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/SinkRDFLimited.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SystemState.java
Removed:
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/SinkRDFLimited.java
Modified:
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/DEF.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/GraphLoadUtils.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/DatasetStatus.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java
jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.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_Upload.java
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/DEF.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/DEF.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/DEF.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/DEF.java Wed Dec 4 16:46:02 2013
@@ -25,20 +25,21 @@ import org.apache.jena.riot.WebContent ;
public class DEF
{
public static final MediaType acceptRDFXML = MediaType.create(WebContent.contentTypeRDFXML) ;
- public static final MediaType acceptTurtle1 = MediaType.create(WebContent.contentTypeTurtle) ;
- public static final MediaType acceptTurtle2 = MediaType.create(WebContent.contentTypeTurtleAlt1) ;
- public static final MediaType acceptTurtle3 = MediaType.create(WebContent.contentTypeTurtleAlt2) ;
- public static final MediaType acceptNTriples = MediaType.create(WebContent.contentTypeNTriples) ;
- public static final MediaType acceptNTriplesAlt = MediaType.create(WebContent.contentTypeNTriplesAlt) ;
- public static final MediaType acceptTriG = MediaType.create(WebContent.contentTypeTriG) ;
- public static final MediaType acceptTriGAlt1 = MediaType.create(WebContent.contentTypeTriGAlt1) ;
- public static final MediaType acceptTriGAlt2 = MediaType.create(WebContent.contentTypeTriGAlt2) ;
- public static final MediaType acceptRDFJSON = MediaType.create(WebContent.contentTypeRDFJSON) ;
public static final MediaType acceptNQuads = MediaType.create(WebContent.contentTypeNQuads) ;
- public static final MediaType acceptNQuadsAlt1 = MediaType.create(WebContent.contentTypeNQuadsAlt1) ;
- public static final MediaType acceptNQuadsAlt2 = MediaType.create(WebContent.contentTypeNQuadsAlt2) ;
-
public static final MediaType acceptRSXML = MediaType.create(WebContent.contentTypeResultsXML) ;
+
+ private static final MediaType acceptTurtle1 = MediaType.create(WebContent.contentTypeTurtle) ;
+ private static final MediaType acceptTurtle2 = MediaType.create(WebContent.contentTypeTurtleAlt1) ;
+ private static final MediaType acceptTurtle3 = MediaType.create(WebContent.contentTypeTurtleAlt2) ;
+ private static final MediaType acceptNTriples = MediaType.create(WebContent.contentTypeNTriples) ;
+ private static final MediaType acceptNTriplesAlt = MediaType.create(WebContent.contentTypeNTriplesAlt) ;
+ private static final MediaType acceptTriG = MediaType.create(WebContent.contentTypeTriG) ;
+ private static final MediaType acceptTriGAlt1 = MediaType.create(WebContent.contentTypeTriGAlt1) ;
+ private static final MediaType acceptTriGAlt2 = MediaType.create(WebContent.contentTypeTriGAlt2) ;
+ private static final MediaType acceptRDFJSON = MediaType.create(WebContent.contentTypeRDFJSON) ;
+ private static final MediaType acceptNQuadsAlt1 = MediaType.create(WebContent.contentTypeNQuadsAlt1) ;
+ private static final MediaType acceptNQuadsAlt2 = MediaType.create(WebContent.contentTypeNQuadsAlt2) ;
+
public static final AcceptList rdfOffer = AcceptList.create(acceptTurtle1, acceptTurtle2, acceptTurtle3,
acceptNTriples, acceptNTriplesAlt,
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionCtl.java Wed Dec 4 16:46:02 2013
@@ -19,9 +19,9 @@
package org.apache.jena.fuseki.mgt;
import org.apache.jena.fuseki.Fuseki ;
-import org.apache.jena.fuseki.server.* ;
+import org.apache.jena.fuseki.server.DatasetRef ;
+import org.apache.jena.fuseki.server.DatasetRegistry ;
import org.apache.jena.fuseki.servlets.ActionBase ;
-import org.apache.jena.fuseki.servlets.ActionLib ;
import org.apache.jena.fuseki.servlets.HttpAction ;
/** Control/admin request lifecycle */
@@ -34,26 +34,41 @@ public abstract class ActionCtl extends
protected void execCommonWorker(HttpAction action)
{
DatasetRef dsRef = null ;
-
- String datasetUri = mapRequestToDataset(action) ;
-
- if ( datasetUri != null ) {
- dsRef = DatasetRegistry.get().get(datasetUri) ;
- if ( dsRef == null ) {
- errorNotFound("No dataset for URI: "+datasetUri) ;
- return ;
- }
- } else
- dsRef = FusekiConfig.serviceOnlyDatasetRef() ;
-
+ String name = mapRequestToDatasetName(action) ;
+ if ( name != null )
+ dsRef = DatasetRegistry.get().get(name) ;
+ else {
+ // This is a placeholder when creating new DatasetRefs
+ // and also if addressig a container, not a dataset
+ dsRef = new DatasetRef() ;
+ dsRef.name = name ;
+ }
action.setDataset(dsRef) ;
- String uri = action.request.getRequestURI() ;
- String serviceName = ActionLib.mapRequestToService(dsRef, uri, datasetUri) ;
- ServiceRef srvRef = dsRef.getServiceRef(serviceName) ;
- action.setService(srvRef) ;
executeAction(action) ;
}
+ protected String mapRequestToDatasetName(HttpAction action) {
+// action.log.info("context path = "+action.request.getContextPath()) ;
+// action.log.info("pathinfo = "+action.request.getPathInfo()) ;
+// action.log.info("servlet path = "+action.request.getServletPath()) ;
+ // if /name
+ // request.getServletPath() otherwise it's null
+ // if /*
+ // request.getPathInfo() ; otherwise it's null.
+
+ String pathInfo = action.request.getPathInfo() ;
+ if ( pathInfo == null || pathInfo.isEmpty() || pathInfo.equals("/") )
+ // Includes calling as a container.
+ return null ;
+ String name = pathInfo ;
+ // pathInfo starts with a "/"
+ int idx = pathInfo.lastIndexOf('/') ;
+ if ( idx > 0 )
+ name = name.substring(idx) ;
+ // Returns "/name"
+ return name ;
+ }
+
// Execute - no stats.
// Intercept point for the UberServlet
protected void executeAction(HttpAction action) {
@@ -71,29 +86,11 @@ public abstract class ActionCtl extends
protected abstract void perform(HttpAction action) ;
- /** Map request to uri in the registry.
- * null means no mapping done (passthrough).
- */
- protected String mapRequestToDataset(HttpAction action)
- {
- return ActionLib.mapRequestToDataset(action.request.getRequestURI()) ;
- }
-
- protected static void incCounter(Counters counters, CounterName name) {
- try {
- if ( counters.getCounters().contains(name) )
- counters.getCounters().inc(name) ;
- } catch (Exception ex) {
- Fuseki.serverLog.warn("Exception on counter inc", ex) ;
- }
- }
-
- protected static void decCounter(Counters counters, CounterName name) {
- try {
- if ( counters.getCounters().contains(name) )
- counters.getCounters().dec(name) ;
- } catch (Exception ex) {
- Fuseki.serverLog.warn("Exception on counter dec", ex) ;
- }
- }
+// /** Map request to uri in the registry.
+// * null means no mapping done (passthrough).
+// */
+// protected String mapRequestToDataset(HttpAction action)
+// {
+// return ActionLib.mapRequestToDataset(action.request.getRequestURI()) ;
+// }
}
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/mgt/ActionDatasets.java Wed Dec 4 16:46:02 2013
@@ -18,9 +18,11 @@
package org.apache.jena.fuseki.mgt;
+import static java.lang.String.format ;
+
import java.io.* ;
import java.nio.channels.FileChannel ;
-import java.util.List ;
+import java.util.Iterator ;
import java.util.Locale ;
import javax.servlet.ServletException ;
@@ -32,14 +34,15 @@ 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.lib.StrUtils ;
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.server.* ;
import org.apache.jena.fuseki.servlets.HttpAction ;
-import org.apache.jena.riot.* ;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RiotException ;
+import org.apache.jena.riot.RiotReader ;
+import org.apache.jena.riot.WebContent ;
import org.apache.jena.riot.lang.LangRIOT ;
import org.apache.jena.riot.system.ErrorHandler ;
import org.apache.jena.riot.system.ErrorHandlerFactory ;
@@ -47,12 +50,39 @@ import org.apache.jena.riot.system.Strea
import org.apache.jena.riot.system.StreamRDFLib ;
import org.apache.jena.web.HttpSC ;
-import com.hp.hpl.jena.rdf.model.Model ;
-import com.hp.hpl.jena.rdf.model.ModelFactory ;
-
+import com.hp.hpl.jena.datatypes.xsd.XSDDatatype ;
+import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.graph.NodeFactory ;
+import com.hp.hpl.jena.query.Dataset ;
+import com.hp.hpl.jena.query.ReadWrite ;
+import com.hp.hpl.jena.rdf.model.* ;
+import com.hp.hpl.jena.shared.uuid.JenaUUID ;
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
+import com.hp.hpl.jena.sparql.core.Quad ;
+import com.hp.hpl.jena.sparql.util.FmtUtils ;
+import com.hp.hpl.jena.tdb.transaction.DatasetGraphTransaction ;
+import com.hp.hpl.jena.update.UpdateAction ;
+import com.hp.hpl.jena.update.UpdateFactory ;
+import com.hp.hpl.jena.update.UpdateRequest ;
public class ActionDatasets extends ActionCtl {
+ // XXX DatasetRef to include UUID : see execPostDataset
+ // XXX Build registry from system database
+ // XXX Put the system database somewhere on disk.
+ // XXX
+ // DatasetRef ref = processService(s) ;
+ // Needs to do the state.
+
+ // DORMANT on restart excludes on counters. Not initialised.
+ // DORMANT - close or not close?
+ // ACTIVE - initialize.
+ private static Dataset system = SystemState.dataset ;
+ private static DatasetGraphTransaction systemDSG = SystemState.dsg ;
+
+ static private Property pServiceName = FusekiVocab.pServiceName ;
+ static private Property pStatus = FusekiVocab.pStatus ;
+
public ActionDatasets() { super() ; }
@Override
@@ -77,59 +107,28 @@ public class ActionDatasets extends Acti
@Override
protected void perform(HttpAction action) {
- String name = mapRequestToDataset(action) ;
String method = action.request.getMethod().toUpperCase(Locale.ROOT) ;
if ( method.equals("GET") )
- execGet(name, action) ;
+ execGet(action) ;
else if ( method.equals("POST") )
- execPost(name, action) ;
+ execPost(action) ;
else if ( method.equals("DELETE") )
- execDelete(name, action) ;
+ execDelete(action) ;
else
error(HttpSC.METHOD_NOT_ALLOWED_405) ;
- }
-
- // Null means no name given, i.e. names the collection.
- @Override
- protected String mapRequestToDataset(HttpAction action) {
- action.log.info("context path = "+action.request.getContextPath()) ;
- action.log.info("pathinfo = "+action.request.getPathInfo()) ;
- action.log.info("servlet path = "+action.request.getServletPath()) ;
- // if /name
- //action.request.getServletPath() ;
- // if /*
- String pathInfo = action.request.getPathInfo() ;
-
- // Or uri after servlet path.
- 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 ;
+// system.begin(ReadWrite.READ) ;
+// try { RDFDataMgr.write(System.out, system, Lang.TRIG); }
+// finally { system.end() ; }
+
}
- protected void execGet(String name, HttpAction action) {
- action.log.info("GET ds="+(name==null?"":name)) ;
- JsonBuilder builder = new JsonBuilder() ;
- 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() ;
+ protected void execGet(HttpAction action) {
+ JsonValue v ;
+ if (action.dsRef.name == null )
+ v = execGetContainer(action) ;
+ else
+ v = execGetDataset(action) ;
try {
HttpServletResponse response = action.response ;
ServletOutputStream out = response.getOutputStream() ;
@@ -140,84 +139,182 @@ public class ActionDatasets extends Acti
out.flush() ;
} catch (IOException ex) { errorOccurred(ex) ; }
success(action);
-
}
+ // This does not consult the system database for dormant etc.
+ private JsonValue execGetDataset(HttpAction action) {
+ JsonBuilder builder = new JsonBuilder() ;
+ builder.startObject() ;
+ builder.key("datasets") ;
+ JsonDescription.arrayDatasets(builder, DatasetRegistry.get());
+ builder.finishObject() ;
+ return builder.build() ;
+ }
+
+ private JsonValue execGetContainer(HttpAction action) {
+ action.log.info(format("[%d] GET ds=%s", action.id, action.dsRef.name)) ;
+ JsonBuilder builder = new JsonBuilder() ;
+ String datasetPath = DatasetRef.canocialDatasetPath(action.dsRef.name) ;
+ DatasetRef dsDesc = DatasetRegistry.get().get(datasetPath) ;
+ if ( dsDesc == null )
+ errorNotFound("Not found: dataset "+action.dsRef.name);
+ JsonDescription.describe(builder, dsDesc) ;
+ return builder.build() ;
+ }
// POST container -> register new dataset
- // POST conatins/name -> change the state of an exiting entry.
+ // POST contains/name -> change the state of an existing entry.
- protected void execPost(String name, HttpAction action) {
- if (name == null )
+ protected void execPost(HttpAction action) {
+ if (action.dsRef.name == null )
execPostContainer(action) ;
else
- execPostDataset(name, action) ;
+ execPostDataset(action) ;
}
- private void execPostDataset(String name, HttpAction action) {
- String datasetPath = DatasetRef.canocialDatasetPath(name) ;
- DatasetRef dsDesc = DatasetRegistry.get().get(datasetPath) ;
- if ( dsDesc == null )
- errorNotFound("Not found: dataset "+name);
+ // An action on a dataset.
+ // XXX extend to backup etc??
+ private void execPostDataset(HttpAction action) {
+ String name = action.dsRef.name ;
+ if ( name == null )
+ name = "" ;
+ action.log.info(format("[%d] POST dataset %s", action.id, name)) ;
+ if ( action.dsRef.dataset == null )
+ errorNotFound("Not found: dataset "+action.dsRef.name);
+ DatasetRef dsDesc = action.dsRef ;
String s = action.request.getParameter("status") ;
if ( s == null || s.isEmpty() )
errorBadRequest("No state change given") ;
- if ( s.equalsIgnoreCase("active") )
+
+ if ( s.equalsIgnoreCase("active") ) {
+ setDatasetState(name, FusekiVocab.stateActive) ;
dsDesc.activate() ;
- else if ( s.equalsIgnoreCase("dormant") )
+ } else if ( s.equalsIgnoreCase("dormant") ) {
+ setDatasetState(name, FusekiVocab.stateDormant) ;
dsDesc.dormant() ;
- else
+ } else
errorBadRequest("New state '"+s+"' not recognized");
- success(action);
+ success(action) ;
}
- protected void execPostContainer(HttpAction action) {
- action.log.info("POST container") ;
- // ???
- // Send to disk, then parse, then decide what to do.
- // Overwrite?
-
- Model m = ModelFactory.createDefaultModel() ;
- StreamRDF dest = StreamRDFLib.graph(m.getGraph()) ;
- bodyAsGraph(action, 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) ;
+ // Persistent state change.
+ private void setDatasetState(String name, Resource newState) {
+ boolean committed = false ;
+ system.begin(ReadWrite.WRITE) ;
+ try {
+ String dbName = name ;
+ if ( dbName.startsWith("/") )
+ dbName = dbName.substring(1) ;
+
+ String update = StrUtils.strjoinNL
+ (SystemState.PREFIXES,
+ "DELETE { GRAPH ?g { ?s fu:status ?state } }",
+ "INSERT { GRAPH ?g { ?s fu:status "+FmtUtils.stringForRDFNode(newState)+" } }",
+ "WHERE {",
+ " GRAPH ?g { ?s fu:name '"+dbName+"' ; ",
+ " fu:status ?state .",
+ " }",
+ "}"
+ ) ;
+ UpdateRequest req = UpdateFactory.create(update) ;
+ UpdateAction.execute(req, system);
+ system.commit();
+ committed = true ;
+ } finally {
+ if ( ! committed ) system.abort() ;
+ system.end() ;
}
+ }
+
+ private void execPostContainer(HttpAction action) {
+ String newURI = JenaUUID.generate().asURI() ;
+ Node gn = NodeFactory.createURI(newURI) ;
+
+ //action.beginWrite() ;
+ boolean committed = false ;
+ system.begin(ReadWrite.WRITE) ;
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) ; }
- success(action);
+ Model model = system.getNamedModel(newURI) ;
+ StreamRDF dest = StreamRDFLib.graph(model.getGraph()) ;
+ bodyAsGraph(action, dest) ;
+ // Find name.
+
+ StmtIterator sIter = model.listStatements(null, pServiceName, (RDFNode)null ) ;
+ if ( ! sIter.hasNext() )
+ errorBadRequest("No name given in description of Fuseki service") ;
+ Statement stmt = sIter.next() ;
+ if ( sIter.hasNext() )
+ errorBadRequest("Multiple names given in description of Fuseki service") ;
+ if ( ! stmt.getObject().isLiteral() )
+ errorBadRequest("Found "+FmtUtils.stringForRDFNode(stmt.getObject())+" : Service names are strings, then used to build the external URI") ;
+
+ Resource subject = stmt.getSubject() ;
+ Literal object = stmt.getObject().asLiteral() ;
+
+ if ( object.getDatatype() != null && ! object.getDatatype().equals(XSDDatatype.XSDstring) )
+ action.log.warn(format("[%d] Service name '%s' is not a string", action.id, FmtUtils.stringForRDFNode(object)));
+
+ String datasetName = object.getLexicalForm() ;
+ model.removeAll(null, pStatus, null) ;
+ model.add(subject, pStatus, FusekiVocab.stateActive) ;
+
+ String datasetPath = DatasetRef.canocialDatasetPath(datasetName) ;
+ DatasetRef dsRef = FusekiConfig.processService(subject) ;
+ SPARQLServer.registerDataset(datasetPath, dsRef) ;
+ system.commit();
+ committed = true ;
+ success(action) ;
+ } finally {
+ if ( ! committed ) system.abort() ;
+ system.end() ;
+ }
}
-
- protected void execDelete(String name, HttpAction action) {
- // Find DS.
- action.log.info("DELETE "+(name==null?"":name));
- if ( name == null ) {
+
+ protected void execDelete(HttpAction action) {
+ // Does not exist?
+ String name = action.dsRef.name ;
+ if ( name == null )
+ name = "" ;
+ action.log.info(format("[%d] DELETE ds=%s", action.id, name)) ;
+ if ( action.dsRef.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() ;
- success(action);
+
+ systemDSG.begin(ReadWrite.WRITE) ;
+ boolean committed =false ;
+ try {
+ // Name to graph
+ Quad q = getOne(SystemState.dsg, null, null, pServiceName.asNode(), null) ;
+ if ( q == null )
+ errorBadRequest("Failed to find dataset for '"+name+"'");
+ Node gn = q.getGraph() ;
+
+ DatasetRef dsRef = DatasetRegistry.get().get(name) ;
+ dsRef.gracefulShutdown() ;
+ DatasetRegistry.get().remove(name) ;
+ // XXX or set to state deleted.
+ systemDSG.deleteAny(gn, null, null, null) ;
+ systemDSG.commit() ;
+ committed = true ;
+ success(action) ;
+ } finally {
+ if ( ! committed ) systemDSG.abort() ;
+ systemDSG.end() ;
+ }
+ }
+
+ private Quad getOne(DatasetGraph dsg, Node g, Node s, Node p, Node o) {
+ Iterator<Quad> iter = dsg.findNG(g, s, p, o) ;
+ if ( ! iter.hasNext() )
+ return null ;
+ Quad q = iter.next() ;
+ if ( iter.hasNext() )
+ return null ;
+ return q ;
}
+
private static void copyFile(File source, File dest) {
try {
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/GraphLoadUtils.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/GraphLoadUtils.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/GraphLoadUtils.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/GraphLoadUtils.java Wed Dec 4 16:46:02 2013
@@ -68,7 +68,7 @@ public class GraphLoadUtils
{
// We need to do this ourselves, not via riot, to use the webStreamManager
StreamRDF sink = StreamRDFLib.graph(graph) ;
- sink = new SinkRDFLimited(sink, limit) ;
+ sink = new StreamRDFLimited(sink, limit) ;
TypedInputStream input = Fuseki.webStreamManager.open(uri) ;
RDFDataMgr.parse(sink, input, uri) ;
Copied: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/StreamRDFLimited.java (from r1547170, jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/SinkRDFLimited.java)
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/StreamRDFLimited.java?p2=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/StreamRDFLimited.java&p1=jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/SinkRDFLimited.java&r1=1547170&r2=1547840&rev=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/SinkRDFLimited.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/migrate/StreamRDFLimited.java Wed Dec 4 16:46:02 2013
@@ -16,9 +16,10 @@
* limitations under the License.
*/
-package org.apache.jena.fuseki.migrate;
+package org.apache.jena.fuseki.migrate ;
import org.apache.jena.atlas.lib.Tuple ;
+import org.apache.jena.riot.RiotException ;
import org.apache.jena.riot.system.StreamRDF ;
import org.apache.jena.riot.system.StreamRDFWrapper ;
@@ -26,40 +27,47 @@ import com.hp.hpl.jena.graph.Node ;
import com.hp.hpl.jena.graph.Triple ;
import com.hp.hpl.jena.sparql.core.Quad ;
-public class SinkRDFLimited extends StreamRDFWrapper
-{
- private long count = 0 ;
- private final long limit ;
-
- public SinkRDFLimited(StreamRDF output, long limit)
- {
+/**
+ * Limit triples/quads and stop passing through after a limit is reached.
+ */
+public class StreamRDFLimited extends StreamRDFWrapper {
+ private long count = 0 ;
+ private final long limit ;
+
+ public StreamRDFLimited(StreamRDF output, long limit) {
super(output) ;
this.limit = limit ;
}
@Override
- public void triple(Triple triple)
- {
+ public void triple(Triple triple) {
count++ ;
+ if ( count > limit )
+ throw new RiotException("Limit ("+limit+") reached") ;
super.triple(triple) ;
}
@Override
- public void quad(Quad quad)
- {
+ public void quad(Quad quad) {
count++ ;
+ if ( count > limit )
+ throw new RiotException("Limit ("+limit+") reached") ;
super.quad(quad) ;
}
@Override
- public void tuple(Tuple<Node> tuple)
- {
+ public void tuple(Tuple<Node> tuple) {
count++ ;
+ if ( count > limit )
+ throw new RiotException("Limit ("+limit+") reached") ;
super.tuple(tuple) ;
}
-
- public long getCount() { return count ; }
- public long getLimit() { return limit ; }
-}
+ public long getCount() {
+ return count ;
+ }
+ public long getLimit() {
+ return limit ;
+ }
+}
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=1547840&r1=1547839&r2=1547840&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 Wed Dec 4 16:46:02 2013
@@ -61,12 +61,12 @@ public class DatasetRef implements Datas
if ( getState() == UNINITIALIZED )
initServices() ;
setState(ACTIVE) ;
-
}
public boolean isActive() { return getState() == ACTIVE ; }
- public DatasetStatus getStatus() { return state ; }
+ public DatasetStatus getStatus() { return state ; }
+ public void setStatus(DatasetStatus newStatus) { setState(newStatus) ; }
private DatasetStatus getState() {
return state ;
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetStatus.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetStatus.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetStatus.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/DatasetStatus.java Wed Dec 4 16:46:02 2013
@@ -18,7 +18,24 @@
package org.apache.jena.fuseki.server;
+import com.hp.hpl.jena.rdf.model.Resource ;
+
public enum DatasetStatus {
- UNINITIALIZED, ACTIVE, CLOSING, DORMANT
+ UNINITIALIZED("Uninitialized"), ACTIVE("Active"), CLOSING("Closing"), CLOSED("Closed"), DORMANT("Dormant") ;
+ public final String name ;
+ DatasetStatus(String string) { name = string ; }
+
+ public static DatasetStatus status(Resource r) {
+ if ( FusekiVocab.stateActive.equals(r) )
+ return ACTIVE ;
+ if ( FusekiVocab.stateDormant.equals(r) )
+ return DORMANT ;
+ if ( FusekiVocab.stateClosing.equals(r) )
+ return CLOSING ;
+ if ( FusekiVocab.stateClosed.equals(r) )
+ return CLOSED ;
+
+ return null ;
+ }
}
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiConfig.java Wed Dec 4 16:46:02 2013
@@ -30,7 +30,6 @@ import org.apache.jena.atlas.lib.StrUtil
import org.apache.jena.fuseki.Fuseki ;
import org.apache.jena.fuseki.FusekiConfigException ;
import org.apache.jena.fuseki.HttpNames ;
-import org.apache.jena.riot.RDFDataMgr ;
import org.slf4j.Logger ;
import com.hp.hpl.jena.assembler.Assembler ;
@@ -68,17 +67,6 @@ public class FusekiConfig {
private static Logger log = Fuseki.configLog ;
- private static String prefixes = StrUtils.strjoinNL
- ("PREFIX fu: <http://jena.apache.org/fuseki#>",
- "PREFIX fuseki: <http://jena.apache.org/fuseki#>",
- "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>",
- "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
- "PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>",
- "PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>",
- "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>",
- "PREFIX apf: <http://jena.hpl.hp.com/ARQ/property#>",
- "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>", "") ;
-
public static ServerConfig defaultConfiguration(String datasetPath, DatasetGraph dsg, boolean allowUpdate,
boolean listenLocal) {
DatasetRef dbDesc = new DatasetRef() ;
@@ -118,25 +106,57 @@ public class FusekiConfig {
}
} ;
- public static void additional(ServerConfig config) {
- // server/
- // configure/
- // databases/
+// public static void additional(ServerConfig config) {
+// // server/
+// // configure/
+// // databases/
+//
+// File d = new File(configurationsDirectory) ;
+// String[] assemblerFiles = d.list(visibleFiles) ;
+//
+// if ( assemblerFiles == null ) {
+// log.warn("No configurtion directory '"+configurationsDirectory+"'") ;
+// }
+//
+// String x = Iter.asString(Arrays.asList(assemblerFiles));
+// log.info("Files: "+x);
+//
+// for ( String fn : assemblerFiles ) {
+// Model m = RDFDataMgr.loadModel(configurationsDirectory+"/"+fn);
+// List<DatasetRef> refs = readConfiguration(m);
+// config.datasets.addAll(refs) ;
+// }
+// }
- File d = new File(configurationsDirectory) ;
- String[] assemblerFiles = d.list(visibleFiles) ;
+ public static void additional(ServerConfig config) {
+ String qs = StrUtils.strjoinNL
+ (SystemState.PREFIXES ,
+ "SELECT * {" ,
+ " GRAPH ?g {",
+ " ?s fu:name ?name ;" ,
+ " fu:status ?status ." ,
+ " }",
+ "}"
+ ) ;
- if ( assemblerFiles == null ) {
- log.warn("No configurtion directory '"+configurationsDirectory+"'") ;
- }
+ ResultSet rs = query(qs,SystemState.dataset) ;
- String x = Iter.asString(Arrays.asList(assemblerFiles));
- log.info("Files: "+x);
+// ResultSetFormatter.out(rs);
+// ((ResultSetRewindable)rs).reset();
- for ( String fn : assemblerFiles ) {
- Model m = RDFDataMgr.loadModel(configurationsDirectory+"/"+fn);
- List<DatasetRef> refs = readConfiguration(m);
- config.datasets.addAll(refs) ;
+ for ( ; rs.hasNext() ; ) {
+ QuerySolution row = rs.next() ;
+ Resource s = row.getResource("s") ;
+ // The result set was copied so we need to find the model again.
+ Resource g = row.getResource("g") ;
+ Resource rStatus = row.getResource("status") ;
+ DatasetStatus status = DatasetStatus.status(rStatus) ;
+ Model m = SystemState.dataset.getNamedModel(g.getURI()) ;
+ s = m.wrapAsResource(s.asNode()) ;
+ //String name = row.getLiteral("name").getLexicalForm() ;
+ DatasetRef ref = processService(s) ;
+ ref.setStatus(status) ;
+ config.datasets.add(ref) ;
}
}
@@ -169,15 +189,12 @@ public class FusekiConfig {
private static Model additionalRDF(Model m ) {
String x1 = StrUtils.strjoinNL
- ( "PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>" ,
- "PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>",
+ ( SystemState.PREFIXES,
"INSERT { [] ja:loadClass 'com.hp.hpl.jena.tdb.TDB' }",
"WHERE { FILTER NOT EXISTS { [] ja:loadClass 'com.hp.hpl.jena.tdb.TDB' } }"
) ;
String x2 = StrUtils.strjoinNL
- ("PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>" ,
- "PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>",
- "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
+ (SystemState.PREFIXES,
"INSERT DATA {",
" tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .",
" tdb:GraphTDB rdfs:subClassOf ja:Model .",
@@ -378,7 +395,7 @@ public class FusekiConfig {
}
private static ResultSet query(String string, Model m, String varName, RDFNode value) {
- Query query = QueryFactory.create(prefixes + string) ;
+ Query query = QueryFactory.create(SystemState.PREFIXES + string) ;
QuerySolutionMap initValues = null ;
if ( varName != null )
initValues = querySolution(varName, value) ;
@@ -388,6 +405,21 @@ public class FusekiConfig {
return rs ;
}
+ private static ResultSet query(String string, Dataset ds) {
+ return query(string, ds, null, null) ;
+ }
+
+ private static ResultSet query(String string, Dataset ds, String varName, RDFNode value) {
+ Query query = QueryFactory.create(SystemState.PREFIXES + string) ;
+ QuerySolutionMap initValues = null ;
+ if ( varName != null )
+ initValues = querySolution(varName, value) ;
+ QueryExecution qExec = QueryExecutionFactory.create(query, ds, initValues) ;
+ ResultSet rs = ResultSetFactory.copyResults(qExec.execSelect()) ;
+ qExec.close() ;
+ return rs ;
+ }
+
private static QuerySolutionMap querySolution(String varName, RDFNode value) {
QuerySolutionMap qsm = new QuerySolutionMap() ;
querySolution(qsm, varName, value) ;
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/FusekiVocab.java Wed Dec 4 16:46:02 2013
@@ -43,7 +43,22 @@ public class FusekiVocab
public static final Property pAllowTimeoutOverride = property("allowTimeoutOverride");
public static final Property pMaximumTimeoutOverride = property("maximumTimeoutOverride");
+
+ // Internal
+
+ private static final String stateNameActive = DatasetStatus.ACTIVE.name ;
+ private static final String stateNameDormant = DatasetStatus.DORMANT.name ;
+ private static final String stateNameClosing = DatasetStatus.CLOSING.name ;
+ private static final String stateNameClosed = DatasetStatus.CLOSED.name ;
+
+ public static final Resource stateActive = resource(stateNameActive) ;
+ public static final Resource stateDormant = resource(stateNameDormant) ;
+ public static final Resource stateClosing = resource(stateNameClosing) ;
+ public static final Resource stateClosed = resource(stateNameClosed) ;
+
+ public static final Property pStatus = property("status") ;
+
private static Resource resource(String localname) { return ResourceFactory.createResource(iri(localname)) ; }
private static Property property(String localname) { return ResourceFactory.createProperty(iri(localname)) ; }
Added: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SystemState.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SystemState.java?rev=1547840&view=auto
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SystemState.java (added)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/server/SystemState.java Wed Dec 4 16:46:02 2013
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.fuseki.server;
+
+import org.apache.jena.atlas.lib.FileOps ;
+import org.apache.jena.atlas.lib.StrUtils ;
+
+import com.hp.hpl.jena.query.Dataset ;
+import com.hp.hpl.jena.tdb.TDBFactory ;
+import com.hp.hpl.jena.tdb.transaction.DatasetGraphTransaction ;
+
+public class SystemState {
+ public static String SystemDatabaseLocation = "system" ;
+ static { FileOps.ensureDir(SystemDatabaseLocation); }
+ public static Dataset dataset = TDBFactory.createDataset(SystemDatabaseLocation) ;
+ public static DatasetGraphTransaction dsg = (DatasetGraphTransaction)(dataset.asDatasetGraph()) ;
+
+ public static String PREFIXES = StrUtils.strjoinNL
+ ("BASE <http://example/base#>",
+ "PREFIX fu: <http://jena.apache.org/fuseki#>",
+ "PREFIX fuseki: <http://jena.apache.org/fuseki#>",
+ "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>",
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
+ "PREFIX tdb: <http://jena.hpl.hp.com/2008/tdb#>",
+ "PREFIX sdb: <http://jena.hpl.hp.com/20087/sdb#>",
+ "PREFIX list: <http://jena.hpl.hp.com/ARQ/list#>",
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>",
+ "PREFIX apf: <http://jena.hpl.hp.com/ARQ/property#>",
+ "PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>",
+ "") ;
+}
+
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/HttpAction.java Wed Dec 4 16:46:02 2013
@@ -48,13 +48,13 @@ public class HttpAction
public final boolean verbose ;
public final Logger log ;
- // Phase two items - set and valida after the datasetRef is known.
+ // Phase two items - set and valid after the datasetRef is known.
private DatasetGraph dsg ; // The data
public DatasetRef dsRef ;
public ServiceRef srvRef ;
- private Transactional transactional ;
- private boolean isTransactional;
+ private Transactional transactional ;
+ private boolean isTransactional;
private DatasetGraph activeDSG ; // Set when inside begin/end.
private ReadWrite activeMode ; // Set when inside begin/end.
@@ -90,6 +90,9 @@ public class HttpAction
public void setDataset(DatasetRef desc) {
this.dsRef = desc ;
+ if ( desc == null || desc.dataset == null )
+ return ;
+
this.dsg = desc.dataset ;
DatasetGraph basedsg = unwrap(dsg) ;
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=1547840&r1=1547839&r2=1547840&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 Wed Dec 4 16:46:02 2013
@@ -91,7 +91,6 @@ public class SPARQL_QueryGeneral extends
throw new InternalErrorException("Default graph URI is null or the empty string") ;
try {
- //TODO Clearup - RIOT integration.
GraphLoadUtils.loadModel(model, uri, MaxTriples) ;
action.log.info(format("[%d] Load (default graph) %s", action.id, uri)) ;
} catch (RiotException ex) {
Modified: jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java
URL: http://svn.apache.org/viewvc/jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java?rev=1547840&r1=1547839&r2=1547840&view=diff
==============================================================================
--- jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java (original)
+++ jena/branches/jena-fuseki-new-ui/src/main/java/org/apache/jena/fuseki/servlets/SPARQL_Upload.java Wed Dec 4 16:46:02 2013
@@ -23,6 +23,7 @@ import static java.lang.String.format ;
import java.io.IOException ;
import java.io.InputStream ;
import java.io.PrintWriter ;
+import java.util.zip.GZIPInputStream ;
import javax.servlet.ServletException ;
import javax.servlet.http.HttpServletRequest ;
@@ -41,7 +42,9 @@ import org.apache.jena.riot.Lang ;
import org.apache.jena.riot.RDFLanguages ;
import org.apache.jena.riot.WebContent ;
import org.apache.jena.riot.lang.StreamRDFCounting ;
-import org.apache.jena.riot.system.* ;
+import org.apache.jena.riot.system.IRIResolver ;
+import org.apache.jena.riot.system.StreamRDF ;
+import org.apache.jena.riot.system.StreamRDFLib ;
import org.apache.jena.web.HttpSC ;
import com.hp.hpl.jena.graph.Graph ;
@@ -220,8 +223,16 @@ public class SPARQL_Upload extends Actio
ct = ContentType.create(contentTypeHeader) ;
lang = WebContent.contentTypeToLang(ct.getContentType()) ;
- if ( lang == null )
+ if ( lang == null ) {
lang = RDFLanguages.filenameToLang(name) ;
+
+ //JENA-600 filenameToLang() strips off certain extensions such as .gz and
+ //we need to ensure that if there was a .gz extension present we wrap the stream accordingly
+ if (name.endsWith(".gz") )
+ stream = new GZIPInputStream(stream);
+ }
+
+
if ( lang == null )
// Desperate.
lang = RDFLanguages.RDFXML ;