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 2017/11/18 09:47:49 UTC
[08/12] jena git commit: JENA-1424: LOAD with conneg
JENA-1424: LOAD with conneg
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/c3d6d178
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/c3d6d178
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/c3d6d178
Branch: refs/heads/master
Commit: c3d6d17894b98f5fb340964cdd8e2f269e27acf0
Parents: f0255f1
Author: Andy Seaborne <an...@apache.org>
Authored: Wed Nov 15 23:26:47 2017 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Wed Nov 15 23:44:15 2017 +0000
----------------------------------------------------------------------
.../jena/sparql/modify/UpdateEngineWorker.java | 63 ++++++++-----
.../sparql/modify/TestUpdateOperations.java | 97 +++++++++++++++++++-
jena-arq/testing/Update/D-bad.nq | 2 +
jena-arq/testing/Update/D-bad.nt | 3 +
jena-arq/testing/Update/D-quads.nt | 1 +
5 files changed, 142 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/c3d6d178/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
index 0b9d97d..e6891ec 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
@@ -33,15 +33,14 @@ import org.apache.jena.atlas.data.ThresholdPolicyFactory ;
import org.apache.jena.atlas.iterator.Iter ;
import org.apache.jena.atlas.lib.Pair ;
import org.apache.jena.atlas.lib.Sink ;
+import org.apache.jena.atlas.web.TypedInputStream;
import org.apache.jena.graph.Graph ;
import org.apache.jena.graph.GraphUtil ;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.query.Query ;
import org.apache.jena.query.QueryExecutionFactory ;
-import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.RDFLanguages ;
-import org.apache.jena.riot.RDFParser ;
+import org.apache.jena.riot.*;
import org.apache.jena.riot.system.SerializationFactoryFinder ;
import org.apache.jena.sparql.ARQInternalErrorException ;
import org.apache.jena.sparql.SystemARQ ;
@@ -137,30 +136,48 @@ public class UpdateEngineWorker implements UpdateVisitor
// LOAD SILENT? iri ( INTO GraphRef )?
String source = update.getSource();
Node dest = update.getDest();
+ Graph graph = graph(datasetGraph, dest);
+ // We must load buffered if silent so that the dataset graph sees
+ // all or no triples/quads when there is a parse error
+ // (no nested transaction abort).
+ boolean loadBuffered = update.getSilent() || ! datasetGraph.supportsTransactionAbort() ;
try {
- // Read into temporary storage to protect against parse errors.
- if ( dest != null ) {
- Lang lang = RDFLanguages.filenameToLang(source);
- // load-to-graph - must be triples.
- if ( ! RDFLanguages.isTriples(lang) )
- throw new UpdateException("Attempt to load quads into a graph");
- // LOAD-INTO graph ... must be triples.
+ if ( dest == null ) {
+ // LOAD SILENT? iri
+ // Quads accepted (extension).
+ if ( loadBuffered ) {
+ DatasetGraph dsg2 = DatasetGraphFactory.create();
+ RDFDataMgr.read(dsg2, source);
+ dsg2.find().forEachRemaining(datasetGraph::add);
+ } else {
+ RDFDataMgr.read(datasetGraph, source);
+ }
+ return ;
+ }
+ // LOAD SILENT? iri INTO GraphRef
+ // Load triples. To give a decent error message and also not have the usual
+ // parser behaviour of just selecting default graph triples when the
+ // destination is a graph, we need to do the same steps as RDFParser.parseURI,
+ // with different checking.
+ TypedInputStream input = RDFDataMgr.open(source);
+ String contentType = input.getContentType();
+ Lang lang = RDFDataMgr.determineLang(source, contentType, Lang.TTL);
+ if ( lang == null )
+ throw new UpdateException("Failed to determine the syntax for '"+source+"'");
+ if ( ! RDFLanguages.isTriples(lang) )
+ throw new UpdateException("Attempt to load quads into a graph");
+ RDFParser parser = RDFParser
+ .source(input.getInputStream())
+ .forceLang(lang)
+ .build();
+ if ( loadBuffered ) {
Graph g = GraphFactory.createGraphMem();
- RDFParser.source(source).parse(g);
- Graph g2 = graph(datasetGraph, dest);
- GraphUtil.addInto(g2, g);
+ parser.parse(g);
+ GraphUtil.addInto(graph, g);
} else {
- // LOAD <iri> -- allow quads.
- DatasetGraph dsg = DatasetGraphFactory.create();
- RDFParser.source(source).parse(dsg);
- Iterator<Quad> iter = dsg.find();
- for ( ; iter.hasNext() ; ) {
- Quad q = iter.next();
- datasetGraph.add(q);
- }
+ parser.parse(graph);
}
- }
- catch (RuntimeException ex) {
+ } catch (RuntimeException ex) {
if ( !update.getSilent() ) {
if ( ex instanceof UpdateException )
throw ex;
http://git-wip-us.apache.org/repos/asf/jena/blob/c3d6d178/jena-arq/src/test/java/org/apache/jena/sparql/modify/TestUpdateOperations.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/modify/TestUpdateOperations.java b/jena-arq/src/test/java/org/apache/jena/sparql/modify/TestUpdateOperations.java
index 02d83ac..aa25047 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/modify/TestUpdateOperations.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/modify/TestUpdateOperations.java
@@ -28,14 +28,21 @@ import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdf.model.RDFNode ;
import org.apache.jena.rdf.model.Resource ;
+import org.apache.jena.riot.system.ErrorHandler;
+import org.apache.jena.riot.system.ErrorHandlerFactory;
import org.apache.jena.sparql.core.DatasetGraph ;
import org.apache.jena.sparql.core.DatasetGraphFactory ;
import org.apache.jena.sparql.core.DatasetGraphWrapper ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.sparql.sse.SSE ;
-import org.apache.jena.update.* ;
+import org.apache.jena.update.UpdateAction;
+import org.apache.jena.update.UpdateException;
+import org.apache.jena.update.UpdateFactory;
+import org.apache.jena.update.UpdateRequest;
import org.apache.jena.vocabulary.OWL ;
import org.apache.jena.vocabulary.RDF ;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
import org.junit.Test ;
// Most of the testing of SPARQL Update is scripts and uses the SPARQL-WG test suite.
@@ -46,6 +53,19 @@ public class TestUpdateOperations extends BaseTest
private DatasetGraph graphStore() { return DatasetGraphFactory.create() ; }
private Node gName = SSE.parseNode("<http://example/g>") ;
+ private static ErrorHandler eh;
+
+ // Silence parser output.
+ @BeforeClass public static void beforeClass() {
+ eh = ErrorHandlerFactory.getDefaultErrorHandler();
+ ErrorHandler silent = ErrorHandlerFactory.errorHandlerStrictSilent();
+ ErrorHandlerFactory.setDefaultErrorHandler(silent);
+ }
+
+ @AfterClass public static void afterClass() {
+ ErrorHandlerFactory.setDefaultErrorHandler(eh);
+ }
+
@Test public void load1() {
DatasetGraph gs = graphStore() ;
UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D.nt>") ;
@@ -86,6 +106,81 @@ public class TestUpdateOperations extends BaseTest
assertEquals(0, Iter.count(gs.find())) ;
}
+ @Test(expected=UpdateException.class)
+ public void load6() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D-bad.nq>") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test public void load7() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD SILENT <"+DIR+"/D-bad.nq>") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test(expected=UpdateException.class)
+ public void load8() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D-bad.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test public void load9() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD SILENT <"+DIR+"/D-bad.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test(expected=UpdateException.class)
+ public void load10() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D-quads.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test public void load11() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD SILENT <"+DIR+"/D-quads.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test(expected=UpdateException.class)
+ public void load12() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D-not-found.nt>") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test public void load13() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD SILENT <"+DIR+"/D-not-found.nt>") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test(expected=UpdateException.class)
+ public void load14() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD <"+DIR+"/D-not-found.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
+ @Test public void load15() {
+ DatasetGraph gs = graphStore() ;
+ UpdateRequest req = UpdateFactory.create("LOAD SILENT <"+DIR+"/D-not-found.nt> INTO GRAPH <"+gName.getURI()+">") ;
+ UpdateAction.execute(req, gs) ;
+ assertEquals(0, Iter.count(gs.find())) ;
+ }
+
@Test public void insert_where_01() {
Model m = ModelFactory.createDefaultModel();
Resource anon = m.createResource();
http://git-wip-us.apache.org/repos/asf/jena/blob/c3d6d178/jena-arq/testing/Update/D-bad.nq
----------------------------------------------------------------------
diff --git a/jena-arq/testing/Update/D-bad.nq b/jena-arq/testing/Update/D-bad.nq
new file mode 100644
index 0000000..58ca5b3
--- /dev/null
+++ b/jena-arq/testing/Update/D-bad.nq
@@ -0,0 +1,2 @@
+<http://example/s> <http://example/p> <http://example/o> <http://example/g> .
+aaaaaaaaaaaaaaaaaa .
http://git-wip-us.apache.org/repos/asf/jena/blob/c3d6d178/jena-arq/testing/Update/D-bad.nt
----------------------------------------------------------------------
diff --git a/jena-arq/testing/Update/D-bad.nt b/jena-arq/testing/Update/D-bad.nt
new file mode 100644
index 0000000..d7a9e8f
--- /dev/null
+++ b/jena-arq/testing/Update/D-bad.nt
@@ -0,0 +1,3 @@
+<http://example/s> <http://example/p> <http://example/o> .
+aaaaaaaaa .
+
http://git-wip-us.apache.org/repos/asf/jena/blob/c3d6d178/jena-arq/testing/Update/D-quads.nt
----------------------------------------------------------------------
diff --git a/jena-arq/testing/Update/D-quads.nt b/jena-arq/testing/Update/D-quads.nt
new file mode 100644
index 0000000..a52ec90
--- /dev/null
+++ b/jena-arq/testing/Update/D-quads.nt
@@ -0,0 +1 @@
+<http://example/s> <http://example/p> <http://example/o> <http://example/g> .