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> .