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 2015/08/24 10:13:50 UTC

[41/50] jena git commit: Add execConstructDataset(Dataset)

Add execConstructDataset(Dataset)


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/179a2048
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/179a2048
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/179a2048

Branch: refs/heads/master
Commit: 179a2048a2d6b4e4a44a5304d4ca87e9b8f14f4f
Parents: cfb7fda
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Aug 20 11:30:53 2015 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Aug 20 11:31:59 2015 +0100

----------------------------------------------------------------------
 .../sparql/engine/http/QueryEngineHTTP.java     | 164 ++++++++++---------
 1 file changed, 90 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/179a2048/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java
index 2fa9602..933c8e7 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/http/QueryEngineHTTP.java
@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit ;
 
 import org.apache.http.client.HttpClient ;
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.atlas.web.auth.HttpAuthenticator ;
 import org.apache.jena.atlas.web.auth.SimpleAuthenticator ;
 import org.apache.jena.graph.Triple ;
@@ -36,8 +37,6 @@ import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.riot.* ;
 import org.apache.jena.riot.web.HttpOp ;
 import org.apache.jena.sparql.ARQException ;
-import org.apache.jena.sparql.core.DatasetGraph;
-import org.apache.jena.sparql.core.DatasetGraphFactory;
 import org.apache.jena.sparql.core.Quad;
 import org.apache.jena.sparql.engine.ResultSetCheckCondition ;
 import org.apache.jena.sparql.graph.GraphFactory ;
@@ -87,7 +86,9 @@ public class QueryEngineHTTP implements QueryExecution {
     private String selectContentType    = defaultSelectHeader();
     private String askContentType       = defaultAskHeader();
     private String modelContentType     = defaultConstructHeader();
-    private String datasetContentType   = WebContent.defaultDatasetAcceptHeader;
+    
+    private String constructContentType = defaultConstructHeader() ;
+    private String datasetContentType   = defaultConstructDatasetHeader() ;
     
     // Received content type 
     private String httpResponseContentType = null ;
@@ -411,14 +412,12 @@ public class QueryEngineHTTP implements QueryExecution {
     
     @Override
     public Dataset execConstructDataset(){
-        checkNotClosed() ;
-    	DatasetGraph dataset = DatasetGraphFactory.createMem();
-        try {
-        	execConstructQuads().forEachRemaining(dataset::add);
-        } finally {
-            this.close();
-        }
-        return DatasetFactory.create(dataset);
+        return execConstructDataset(DatasetFactory.createMem());
+    }
+
+    @Override
+    public Dataset execConstructDataset(Dataset dataset){
+        return execDataset(dataset) ;
     }
 
     @Override
@@ -437,64 +436,43 @@ public class QueryEngineHTTP implements QueryExecution {
     }
 
     private Model execModel(Model model) {
-        checkNotClosed() ;
-        HttpQuery httpQuery = makeHttpQuery();
-        httpQuery.setAccept(modelContentType);
-        InputStream in = httpQuery.exec();
-
-        // Don't assume the endpoint actually gives back the content type we
-        // asked for
-        String actualContentType = httpQuery.getContentType();
-        httpResponseContentType = actualContentType;
-
-        // If the server fails to return a Content-Type then we will assume
-        // the server returned the type we asked for
-        if (actualContentType == null || actualContentType.equals("")) {
-            actualContentType = modelContentType;
-        }
-
-        // Try to select language appropriately here based on the model content
-        // type
-        Lang lang = RDFLanguages.contentTypeToLang(actualContentType);
-        if (!RDFLanguages.isTriples(lang))
-            throw new QueryException("Endpoint returned Content Type: " + actualContentType
-                    + " which is not a valid RDF Graph syntax");
-        RDFDataMgr.read(model, in, lang);
-        this.close();
+        Pair<InputStream, Lang> p = execConstructWorker(modelContentType) ;
+        InputStream in = p.getLeft() ;
+        Lang lang = p.getRight() ;
+        try { RDFDataMgr.read(model, in, lang); }
+        finally { this.close(); }
         return model;
     }
 
-    private Iterator<Triple> execTriples() {
-        checkNotClosed() ;
-        HttpQuery httpQuery = makeHttpQuery();
-        httpQuery.setAccept(modelContentType);
-        InputStream in = httpQuery.exec();
-
-        // Don't assume the endpoint actually gives back the content type we
-        // asked for
-        String actualContentType = httpQuery.getContentType();
-        httpResponseContentType = actualContentType;
-
-        // If the server fails to return a Content-Type then we will assume
-        // the server returned the type we asked for
-        if (actualContentType == null || actualContentType.equals("")) {
-            actualContentType = modelContentType;
-        }
-
-        // Try to select language appropriately here based on the model content
-        // type
-        Lang lang = RDFLanguages.contentTypeToLang(actualContentType);
-        if (!RDFLanguages.isTriples(lang))
-            throw new QueryException("Endpoint returned Content Type: " + actualContentType
-                    + " which is not a valid RDF Graph syntax");
+    private Dataset execDataset(Dataset dataset) {
+        Pair<InputStream, Lang> p = execConstructWorker(datasetContentType);
+        InputStream in = p.getLeft() ;
+        Lang lang = p.getRight() ;
+        try { RDFDataMgr.read(dataset, in, lang); }
+        finally { this.close(); }
+        return dataset;
+    }
 
+    private Iterator<Triple> execTriples() {
+        Pair<InputStream, Lang> p = execConstructWorker(modelContentType) ;
+        InputStream in = p.getLeft() ;
+        Lang lang = p.getRight() ;
+        // Base URI?
         return RiotReader.createIteratorTriples(in, lang, null);
     }
     
     private Iterator<Quad> execQuads() {
+        Pair<InputStream, Lang> p = execConstructWorker(datasetContentType) ;
+        InputStream in = p.getLeft() ;
+        Lang lang = p.getRight() ;
+        // Base URI?
+        return RiotReader.createIteratorQuads(in, lang, null);
+    }
+
+    private Pair<InputStream, Lang> execConstructWorker(String contentType) {
         checkNotClosed() ;
         HttpQuery httpQuery = makeHttpQuery();
-        httpQuery.setAccept(datasetContentType);
+        httpQuery.setAccept(contentType);
         InputStream in = httpQuery.exec();
         
         // Don't assume the endpoint actually gives back the content type we
@@ -507,17 +485,14 @@ public class QueryEngineHTTP implements QueryExecution {
         if (actualContentType == null || actualContentType.equals("")) {
             actualContentType = WebContent.defaultDatasetAcceptHeader;
         }
-
-        // Try to select language appropriately here based on the model content
-        // type
         Lang lang = RDFLanguages.contentTypeToLang(actualContentType);
-        if (!RDFLanguages.isQuads(lang))
-            throw new QueryException("Endpoint returned Content Type: " + actualContentType
-                    + " which is not a valid RDF Dataset syntax");
-
-        return RiotReader.createIteratorQuads(in, lang, null);
+        if ( ! RDFLanguages.isQuads(lang) && ! RDFLanguages.isTriples(lang) )
+            throw new QueryException("Endpoint returned Content Type: "
+                                     + actualContentType 
+                                     + " which is not a valid RDF syntax");
+        return Pair.create(in, lang) ;
     }
-
+    
     @Override
     public boolean execAsk() {
         checkNotClosed() ;
@@ -813,10 +788,10 @@ public class QueryEngineHTTP implements QueryExecution {
         datasetContentType = contentType;
     }
     
-    private static final String selectContentTypeHeader = initSelectContentTypes() ;
+    private static final String dftSelectContentTypeHeader = initSelectContentTypes() ;
 
     public static String defaultSelectHeader() {
-        return selectContentTypeHeader ;
+        return dftSelectContentTypeHeader ;
     }
 
     private static String initSelectContentTypes() {
@@ -836,18 +811,18 @@ public class QueryEngineHTTP implements QueryExecution {
     private static final String askContentTypeHeader = initAskContentTypes() ;
 
     public static String defaultAskHeader() {
-        return selectContentTypeHeader ;
+        return dftSelectContentTypeHeader ;
     }
 
     // These happen to be the same.
     private static String initAskContentTypes() { return initSelectContentTypes(); }
 
-    private static final String constructContentTypeHeader = initConstructContentTypes() ;
+    private static final String dftConstructContentTypeHeader = initConstructContentTypes() ;
 
     public static String defaultConstructHeader() {
-        return constructContentTypeHeader ;
+        return dftConstructContentTypeHeader ;
     }
-
+    
     private static String initConstructContentTypes() {
         // Or use WebContent.defaultGraphAcceptHeader which is slightly
         // narrower. Here, we have a tuned setting for SPARQL operations.
@@ -869,6 +844,47 @@ public class QueryEngineHTTP implements QueryExecution {
         return sBuff.toString();
     }
 
+    private static final String dftConstructDatasetContentTypeHeader = initConstructDatasetContentTypes() ;
+
+    public static String defaultConstructDatasetHeader() {
+        return dftConstructDatasetContentTypeHeader ; 
+    }
+    
+    private static String initConstructDatasetContentTypes() {
+        // Or use WebContent.defaultDatasetAcceptHeader which is slightly
+        // narrower. Here, we have a tuned setting for SPARQL operations.
+        StringBuilder sBuff = new StringBuilder() ;
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTriG,         1.0) ;
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTriGAlt1,     1.0) ;
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTriGAlt2,     1.0) ;
+
+        accumulateContentTypeString(sBuff, WebContent.contentTypeNQuads,       1.0) ;
+        accumulateContentTypeString(sBuff, WebContent.contentTypeNQuadsAlt1,   1.0) ;
+        accumulateContentTypeString(sBuff, WebContent.contentTypeNQuadsAlt2,   1.0) ;
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeJSONLD,       0.9) ;
+
+        // And triple formats (the case of execConstructDatasets but a regular triples CONSTRUCT). 
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTurtle,       0.8);
+        accumulateContentTypeString(sBuff, WebContent.contentTypeNTriples,     0.8);
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeRDFXML,       0.7);
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTurtleAlt1,   0.6);
+        accumulateContentTypeString(sBuff, WebContent.contentTypeTurtleAlt2,   0.6);
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeN3,           0.5);
+        accumulateContentTypeString(sBuff, WebContent.contentTypeN3Alt1,       0.5);
+        accumulateContentTypeString(sBuff, WebContent.contentTypeN3Alt2,       0.5);
+        
+        accumulateContentTypeString(sBuff, WebContent.contentTypeNTriplesAlt,  0.4);
+        
+        accumulateContentTypeString(sBuff, "*/*",                              0.1) ;
+
+        return sBuff.toString();
+    }
+    
     private static void accumulateContentTypeString(StringBuilder sBuff, String str, double v) {
         if ( sBuff.length() != 0 )
             sBuff.append(", ") ;