JENA-1349: Replace RDFDataMgr use of TypedInputStream with RDFParser

Use 3 code paths for URI, InputStream, Reader
Deprecate use of TypedInputStream in RDFDataMgr;
early opening of the stream requries duplicate conneg determination.


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

Branch: refs/heads/master
Commit: 6853d8247d4d16f499c45d0de081d408d10d3ced
Parents: a2fb93c
Author: Andy Seaborne <[email protected]>
Authored: Sun May 28 19:48:16 2017 +0100
Committer: Andy Seaborne <[email protected]>
Committed: Sun May 28 19:48:16 2017 +0100

----------------------------------------------------------------------
 .../java/org/apache/jena/riot/RDFDataMgr.java   | 138 ++++++++++++-------
 .../java/org/apache/jena/riot/RDFParser.java    |   3 +-
 .../jena/riot/lang/TestParserFactory.java       |   4 +-
 3 files changed, 93 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/6853d824/jena-arq/src/main/java/org/apache/jena/riot/RDFDataMgr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFDataMgr.java 
b/jena-arq/src/main/java/org/apache/jena/riot/RDFDataMgr.java
index c5f1409..552114b 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFDataMgr.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFDataMgr.java
@@ -218,7 +218,7 @@ public class RDFDataMgr
     public static void read(Graph graph, String uri, String base, Lang 
hintLang, Context context)
     {
         StreamRDF dest = StreamRDFLib.graph(graph) ;
-        parse(dest, uri, base, hintLang, context) ;
+        parseFromURI(dest, uri, base, hintLang, context) ;
     }
 
     /** Read triples into a Model with bytes from an InputStream.
@@ -265,7 +265,7 @@ public class RDFDataMgr
     public static void read(Graph graph, InputStream in, String base, Lang 
lang) {
         Objects.requireNonNull(in, "InputStream is null") ;
         StreamRDF dest = StreamRDFLib.graph(graph) ;
-        process(dest, TypedInputStream.wrap(in), base, lang, (Context)null) ;
+        parseFromInputStream(dest, in, base, lang, null) ;
     }
 
     /** Read triples into a model with chars from an Reader.
@@ -295,7 +295,7 @@ public class RDFDataMgr
     @Deprecated
     public static void read(Graph graph, Reader in, String base, Lang lang) {
         StreamRDF dest = StreamRDFLib.graph(graph) ;
-        process(dest, in, base, lang, (Context)null) ;
+        parseFromReader(dest, in, base, lang, null) ;
     }
 
     /** Read triples into a model with chars from a StringReader.
@@ -307,7 +307,7 @@ public class RDFDataMgr
     public static void read(Model model, StringReader in, String base, Lang 
lang) {
         Graph g = model.getGraph() ;
         StreamRDF dest = StreamRDFLib.graph(g) ;
-        process(dest, in, base, lang, (Context)null) ;
+        parseFromReader(dest, in, base, lang, (Context)null) ;
     }
 
     /** Read triples into a model with chars from a StringReader.
@@ -318,7 +318,7 @@ public class RDFDataMgr
      */
     public static void read(Graph graph, StringReader in, String base, Lang 
lang) {
         StreamRDF dest = StreamRDFLib.graph(graph) ;
-        process(dest, in, base, lang, (Context)null) ;
+        parseFromReader(dest, in, base, lang, (Context)null) ;
     }
     
     private static Model createModel()                  { return 
ModelFactory.createDefaultModel() ; } 
@@ -516,7 +516,7 @@ public class RDFDataMgr
     @Deprecated
     public static void read(DatasetGraph dataset, String uri, String base, 
Lang hintLang, Context context) {
         StreamRDF sink = StreamRDFLib.dataset(dataset) ;
-        parse(sink, uri, base, hintLang, context) ;
+        parseFromURI(sink, uri, base, hintLang, context) ;
     }
 
     /** Read quads or triples into a dataset with bytes from an input stream.
@@ -556,7 +556,7 @@ public class RDFDataMgr
     public static void read(DatasetGraph dataset, InputStream in, String base, 
Lang lang) {
         Objects.requireNonNull(in, "InputStream is null") ;
         StreamRDF dest = StreamRDFLib.dataset(dataset) ;
-        process(dest, TypedInputStream.wrap(in), base, lang, (Context)null) ;
+        parseFromInputStream(dest, in, base, lang, (Context)null) ;
     }
     
     /** Read quads into a dataset with chars from an Reader.
@@ -586,7 +586,7 @@ public class RDFDataMgr
     @Deprecated
     public static void read(DatasetGraph dataset, Reader in, String base, Lang 
lang) {
         StreamRDF dest = StreamRDFLib.dataset(dataset) ;
-        process(dest, in, base, lang, (Context)null) ;
+        parseFromReader(dest, in, base, lang, (Context)null) ;
     }
 
     /** Read quads into a dataset with chars from a StringReader.
@@ -611,22 +611,28 @@ public class RDFDataMgr
      */
     public static void read(DatasetGraph dataset, StringReader in, String 
base, Lang lang) {
         StreamRDF dest = StreamRDFLib.dataset(dataset) ;
-        process(dest, in, base, lang, (Context)null) ;
+        parseFromReader(dest, in, base, lang, (Context)null) ;
     }
 
     /** Read RDF data.
+     * Use {@code RDFParser.source(uri).parse(sink)}
      * @param sink     Destination for the RDF read.
-     * @param uri       URI to read from (includes file: and a plain file 
name).
+     * @param uri      URI to read from (includes file: and a plain file name).
      */
+    //@deprecated     Use {@code RDFParser.source(uri).parse(sink)}
+    //@Deprecated
     public static void parse(StreamRDF sink, String uri) {
         parse(sink, uri, defaultLang(uri)) ;
     }
 
     /** Read RDF data.
+     * Use {@code RDFParser.source(uri).lang(hintLang).parse(sink)}
      * @param sink      Destination for the RDF read.
      * @param uri       URI to read from (includes file: and a plain file 
name).
      * @param lang      Hint for the syntax
      */
+    //* @deprecated     Use {@code 
RDFParser.source(uri).lang(hintLang).parse(sink)}
+    //@Deprecated
     public static void parse(StreamRDF sink, String uri, Lang lang) {
         parse(sink, uri, lang, (Context)null) ;
     }
@@ -636,7 +642,7 @@ public class RDFDataMgr
      * @param uri       URI to read from (includes file: and a plain file 
name).
      * @param hintLang  Hint for the syntax
      * @param context   Content object to control reading process.
-     * @deprecated To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated To be removed.  Use {@code 
RDFParser.source(uri).lang(hintLang).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, String uri, Lang hintLang, 
Context context) {
@@ -648,7 +654,9 @@ public class RDFDataMgr
      * @param uri       URI to read from (includes file: and a plain file 
name).
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
+     * @deprecated To be removed.  Use {@code 
RDFParser.source(uri).base(base)...}
      */
+    @Deprecated
     public static void parse(StreamRDF sink, String uri, String base, Lang 
hintLang) {
         parse(sink, uri, base, hintLang, (Context)null) ;
     }
@@ -659,7 +667,7 @@ public class RDFDataMgr
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
      * @param context   Content object to control reading process.
-     * @deprecated To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated     To be removed.  Use {@code 
RDFParser.source(uri).lang(hintLang).base(base).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, String uri, String base, Lang 
hintLang, Context context) {
@@ -669,30 +677,34 @@ public class RDFDataMgr
             base = SysRIOT.chooseBaseIRI(uri) ;
         if ( hintLang == null )
             hintLang = RDFLanguages.filenameToLang(uri) ;
-        try ( TypedInputStream in = open(uri, context) ) { 
-            if ( in == null )
-                throw new RiotNotFoundException("Not found: "+uri) ;
-            process(sink, in, base, hintLang, context) ;
-        }
+        parseFromURI(sink, uri, base, hintLang, context);
     }
 
+    // TODO Deprecate this?
     /** Read RDF data.
+     *  Use {@code RDFParser.source(in).lang(lang).parse(sink)}
      * @param sink      Destination for the RDF read.
      * @param in        Bytes to read.
      * @param lang      Syntax for the stream.
      */
+    //@deprecated     To be removed.  Use {@code 
RDFParser.source(in).lang(lang).parse(sink)}
+    //@Deprecated
     public static void parse(StreamRDF sink, InputStream in, Lang lang) {
-        parse(sink, in, defaultBase(), lang, (Context)null) ;  
+        parseFromInputStream(sink, in, defaultBase(), lang, (Context)null) ;  
     }
 
+    // TODO Deprecate this?
     /** Read RDF data.
+     * Use {@code RDFParser.source(in).lang(lang).base(base).parse(sink)}
      * @param sink      Destination for the RDF read.
      * @param in        Bytes to read.
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
      */
+    //@deprecated     To be removed.  Use {@code 
RDFParser.source(in).lang(lang).base(base).parse(sink)}
+    //@Deprecated
     public static void parse(StreamRDF sink, InputStream in, String base, Lang 
hintLang) {
-        parse(sink, in, base, hintLang, (Context)null) ;  
+        parseFromInputStream(sink, in, base, hintLang, null) ;  
     }
 
     /** Read RDF data.
@@ -701,17 +713,18 @@ public class RDFDataMgr
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
      * @param context   Content object to control reading process.
-     * @deprecated To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated     To be removed.  Use {@code 
RDFParser.source(in).base(base).lang(hintLang).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, InputStream in, String base, Lang 
hintLang, Context context) {
-        process(sink, TypedInputStream.wrap(in), base, hintLang, context) ;
+        parseFromInputStream(sink, in, base, hintLang, context) ;
     }
 
     /** Read RDF data.
      * @param sink      Destination for the RDF read.
      * @param in        StringReader
      * @param lang      Syntax for the stream.
+     * @deprecated     To be removed. Use {@code 
RDFParser.create().source(in).lang(hintLang)...}
      */
     public static void parse(StreamRDF sink, StringReader in, Lang lang) {
         parse(sink, in, defaultBase(), lang, (Context)null) ;  
@@ -722,6 +735,7 @@ public class RDFDataMgr
      * @param in        Reader
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
+     * @deprecated     To be removed. Use {@code 
RDFParser.create().source(in).base(base).lang(hintLang).parse(sink)}
      */
     public static void parse(StreamRDF sink, StringReader in, String base, 
Lang hintLang) {
         parse(sink, in, base, hintLang, (Context)null) ;  
@@ -733,18 +747,18 @@ public class RDFDataMgr
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
      * @param context   Content object to control reading process.
-     * @deprecated To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated     To be removed. Use {@code 
RDFParser.create().source(in).base(base).lang(hintLang).context(context).pase(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, StringReader in, String base, 
Lang hintLang, Context context) {
-        process(sink, in, base, hintLang, context) ;
+        parseFromReader(sink, in, base, hintLang, context) ;
     }
 
     /** Read RDF data.
      * @param sink      Destination for the RDF read.
      * @param in        Reader
      * @param lang      Syntax for the stream.
-     * @deprecated     Use an InputStream or a StringReader. 
+     * @deprecated     To be removed. An {@code InputStream} or {@code 
StringReader} is preferrable. Use {@code 
RDFParser.create().source(in).lang(hintLang).parse()}
      */
     @Deprecated
     public static void parse(StreamRDF sink, Reader in, Lang lang) {
@@ -756,7 +770,7 @@ public class RDFDataMgr
      * @param in        Reader
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
-     * @deprecated     Use an InputStream or a StringReader. 
+     * @deprecated     To be removed. An {@code InputStream} or {@code 
StringReader} is preferrable. Use {@code 
RDFParser.create().source(in).lang(hintLang).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, Reader in, String base, Lang 
hintLang) {
@@ -769,17 +783,19 @@ public class RDFDataMgr
      * @param base      Base URI (defaults to uri).
      * @param hintLang  Hint for the syntax
      * @param context   Content object to control reading process.
-     * @deprecated     To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated     To be removed. An {@code InputStream} or {@code 
StringReader} is preferrable. Use {@code 
RDFParser.create().source(in).lang(hintLang).base(base).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, Reader in, String base, Lang 
hintLang, Context context) {
-        process(sink, in, base, hintLang, context) ;
+        parseFromReader(sink, in, base, hintLang, context) ;
     }
 
     /** Read RDF data.
      * @param sink      Destination for the RDF read.
-     * @param in        Bytes to read.  This must include the content type.
+     * @param in        Bytes to read. This must include the content type.
+     * @deprecated     To be removed. Use an {@code InputStream} and {@code 
RDFParser.source(in).lang(hintLang).parse(sink)}
      */
+    @Deprecated
     public static void parse(StreamRDF sink, TypedInputStream in) {
         parse(sink, in, defaultBase()) ;
     }
@@ -789,7 +805,9 @@ public class RDFDataMgr
      * @param sink      Destination for the RDF read.
      * @param in        Bytes to read.
      * @param base      Base URI
+     * @deprecated     To be removed. Use an {@code InputStream} and {@code 
RDFParser.source(in).base(base).lang(lang).parse(sink)}
      */
+    @Deprecated
     public static void parse(StreamRDF sink, TypedInputStream in, String base) 
{
         parse(sink, in, base, (Context)null);
     }
@@ -799,13 +817,13 @@ public class RDFDataMgr
      * @param in        Bytes to read.
      * @param base      Base URI
      * @param context   Content object to control reading process.
-     * @deprecated To be removed.  Use {@code 
RDFParser.create().context(context)...}
+     * @deprecated To be removed. Use {@code 
RDFParser.source(in).lang(lang).base(base).context(context).parse(sink)}
      */
     @Deprecated
     public static void parse(StreamRDF sink, TypedInputStream in, String base, 
Context context) {
         Objects.requireNonNull(in, "TypedInputStream is null") ;
         Lang hintLang = RDFLanguages.contentTypeToLang(in.getMediaType()) ;
-        process(sink, in, base, hintLang, context) ;
+        processFromTypedInputStream(sink, in, base, hintLang, context) ;
     }
 
     /** Open a stream to the destination (URI or filename)
@@ -840,19 +858,10 @@ public class RDFDataMgr
         return in ;
     }
     
-    // -----
-    // Readers are algorithms and must be stateless (or they must create a per
-    // run instance of something) because they may be called concurrency from
-    // different threads. The Context Reader object gives the per-run
-    // configuration.
-
-    private static void process(StreamRDF destination, TypedInputStream in, 
String baseUri, Lang lang, Context context) {
-        Objects.requireNonNull(in, "TypedInputStream is null") ;
-        
-        // If the input stream comes with a content type, use that in 
preference to the hint (compatibility).
-        if ( in.getContentType() != null )
-            lang = RDFLanguages.contentTypeToLang(in.getMediaType());
-        
+    // ----
+    // The ways to parse from 3 kinds of source: URI, InputStream and Reader. 
+    
+    private static void parseFromInputStream(StreamRDF destination, 
InputStream in, String baseUri, Lang lang, Context context) {
         RDFParser.create()
             .source(in)
             .base(baseUri)
@@ -861,10 +870,8 @@ public class RDFDataMgr
             .parse(destination);
     }
     
-    // java.io.Readers are NOT preferred.
     @SuppressWarnings("deprecation")
-    private static void process(StreamRDF destination, Reader in, String 
baseUri, Lang lang, Context context ) {
-        Objects.requireNonNull(in, "Reader is null") ;
+    private static void parseFromReader(StreamRDF destination, Reader in, 
String baseUri, Lang lang, Context context) {
         RDFParser.create()
             .source(in)
             .base(baseUri)
@@ -873,8 +880,41 @@ public class RDFDataMgr
             .parse(destination);
     }
 
+
+    private static void parseFromURI(StreamRDF destination, String uri, String 
baseUri, Lang lang, Context context) {
+        RDFParser.create()
+            .source(uri)
+            .base(baseUri)
+            .lang(lang)
+            .context(context)
+            .parse(destination);
+    }
+    
+    // ---- Support for RDFDataMgr.parse from a TypedInputStream only.
+    @Deprecated
+    private static void processFromTypedInputStream(StreamRDF sink, 
TypedInputStream in, String baseUri, Lang hintLang, Context context) {
+        // If the input stream comes with a content type, use that in 
preference to the hint (compatibility).
+        // Except for text/plain. 
+        // Do here, which duplicates RDFParser, because "TypedInputStream" 
gets lost at RDFParser
+        if ( in.getContentType() != null ) {
+            // Special case of text/plain.
+            ContentType ct = WebContent.determineCT(in.getContentType(), 
hintLang, null);
+            Lang lang2 = RDFLanguages.contentTypeToLang(ct);
+            hintLang = lang2 ;
+        }
+        RDFParser.create()
+            .source(in)
+            .base(baseUri)
+            .lang(hintLang)
+            // We made the decision above.
+            .forceLang(hintLang)
+            .context(context)
+            .parse(sink);
+    }
+    // ---- Support for RDFDataMgr.parse only.
+
     /** 
-     * @deprecated Use {@link RDFParser#create} or {@link #createReader(Lang, 
ParserProfile)}.
+     * @deprecated Use {@link RDFParser#create}.
      */
     @Deprecated
     public static ReaderRIOT createReader(Lang lang) {
@@ -1248,7 +1288,7 @@ public class RDFDataMgr
         // Otherwise, we have to spin up a thread to deal with it
         PipedRDFIterator<Triple> it = new PipedRDFIterator<>();
         PipedTriplesStream out = new PipedTriplesStream(it);
-        Thread t = new Thread(()->parse(out, input, baseIRI, lang)) ;
+        Thread t = new Thread(()->parseFromInputStream(out, input, baseIRI, 
lang, null)) ;
         t.start();
         return it;
     }
@@ -1271,7 +1311,7 @@ public class RDFDataMgr
         final PipedRDFIterator<Quad> it = new PipedRDFIterator<>();
         final PipedQuadsStream out = new PipedQuadsStream(it);
 
-        Thread t = new Thread(()->parse(out, input, baseIRI, lang)) ;
+        Thread t = new Thread(()->parseFromInputStream(out, input, baseIRI, 
lang, null)) ;
         t.start();
         return it;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/6853d824/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java 
b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
index 9de4483..f1c07d3 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFParser.java
@@ -251,7 +251,8 @@ public class RDFParser {
                 ct = forceLang.getContentType();
                 reader = createReader(r, forceLang);
             } else {
-                // Conneg and hint
+                // No forced language.
+                // Conneg and hint, ignoring text/plain.
                 ct = WebContent.determineCT(input.getContentType(), hintLang, 
baseUri);
                 if ( ct == null )
                     throw new RiotException("Failed to determine the content 
type: (URI=" + baseUri + " : stream=" + input.getContentType()+")");

http://git-wip-us.apache.org/repos/asf/jena/blob/6853d824/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java 
b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
index d9289ef..2c7eef2 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestParserFactory.java
@@ -26,7 +26,7 @@ import org.apache.jena.atlas.junit.BaseTest ;
 import org.apache.jena.atlas.lib.Pair ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFParser ;
 import org.apache.jena.riot.RIOT;
 import org.apache.jena.riot.system.*;
 import org.apache.jena.riot.tokens.Tokenizer ;
@@ -183,7 +183,7 @@ public class TestParserFactory extends BaseTest
 
     private CatchParserOutput parseCapture(String s, Lang lang) {
         CatchParserOutput sink = new CatchParserOutput() ;
-        RDFDataMgr.parse(sink, new StringReader(s), "http://base/";, lang) ;
+        RDFParser.create().source(new 
StringReader(s)).base("http://base/";).lang(lang).parse(sink);
         return sink ;
     }
 

Reply via email to