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 ; }
