[
https://issues.apache.org/jira/browse/JENA-1306?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15899342#comment-15899342
]
ASF GitHub Bot commented on JENA-1306:
--------------------------------------
Github user afs commented on a diff in the pull request:
https://github.com/apache/jena/pull/222#discussion_r104651733
--- Diff: jena-arq/src/main/java/org/apache/jena/riot/RDFParserBuilder.java
---
@@ -0,0 +1,431 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.riot;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.Header;
+import org.apache.http.client.HttpClient;
+import org.apache.http.impl.client.cache.CachingHttpClientBuilder;
+import org.apache.http.message.BasicHeader;
+import org.apache.jena.atlas.lib.IRILib;
+import org.apache.jena.graph.BlankNodeId;
+import org.apache.jena.graph.Graph;
+import org.apache.jena.riot.lang.LabelToNode;
+import org.apache.jena.riot.system.*;
+import org.apache.jena.riot.web.HttpNames;
+import org.apache.jena.sparql.core.DatasetGraph;
+import org.apache.jena.sparql.util.Context;
+
+/**
+ * An {@link RDFParser} is a process that will generate triples;
+ * {@link RDFParserBuilder} provides the means to setup the parser.
+ * <p>
+ * An {@link RDFParser} has a predefined source; the target for output is
given when the "parse" method is called.
+ * It can be used multiple times in which case the same source is reread.
The destination can vary.
+ * The application is responsible for concurrency of the destination of
the parse operation.
+ *
+ * The process is
+ * <pre>
+ * StreamRDF destination = ...
+ * RDFParser parser = RDFParser.create()
+ * .source("filename.ttl")
+ * .build();
+ * parser.parse(destination);
+ * </pre>
+ * or using a short cut:
+ * <pre>
+ * RDFParser parser = RDFParser.create()
+ * .source("filename.ttl")
+ * .parse(destination);
+ * </pre>
+ */
+public class RDFParserBuilder {
+ // Source
+ private String uri = null;
+ private Path path = null;
+ private InputStream inputStream;
+ // StringReader - charset problems with any other kind.
+ private Reader javaReader = null;
+
+ // HTTP
+ private Map<String, String> httpHeaders = new HashMap<>();
+ private HttpClient httpClient = null;
+
+ // Syntax
+ private Lang hintLang = null;
+ private Lang forceLang = null;
+
+ private String baseUri = null;
+
+ // ---- Unused but left in case required in the future.
+ private boolean strict = SysRIOT.isStrictMode();
+ private boolean resolveURIs = true;
+ private IRIResolver resolver = null;
+ // ----
+
+ // Construction for the StreamRDF
+ private FactoryRDF factory = null;
+ private LabelToNode labelToNode = null;
+
+ // Bad news.
+ private ErrorHandler errorHandler = null;
+
+ // Parsing process
+ private Context context = null;
+
+ public static RDFParserBuilder create() { return new
RDFParserBuilder() ; }
+ private RDFParserBuilder() {}
+
+ /**
+ * Set the source to {@link Path}.
+ * This clears any other source setting.
+ * @param path
+ * @return this
+ */
+ public RDFParserBuilder source(Path path) {
+ clearSource();
+ this.path = path;
+ return this;
+ }
+
+ /**
+ * Set the source to a URI; this includes OS file names.
+ * File URL shoudl be of the form {@code file:///...}.
+ * This clears any other source setting.
+ * @param uri
+ * @return this
+ */
+ public RDFParserBuilder source(String uri) {
+ clearSource();
+ this.uri = uri;
+ return this;
+ }
+
+ /**
+ * Set the source to {@link InputStream}.
+ * This clears any other source setting.
+ * The {@link InputStream} will be closed when the
+ * parser is called and the parser can not be reused.
+ * @param input
+ * @return this
+ */
+ public RDFParserBuilder source(InputStream input) {
+ clearSource();
+ this.inputStream = input;
+ return this;
+ }
+
+ /**
+ * Set the source to {@link StringReader}.
+ * This clears any other source setting.
+ * The {@link StringReader} will be closed when the
+ * parser is called and the parser can not be reused.
+ * @param reader
+ * @return this
+ */
+ public RDFParserBuilder source(StringReader reader) {
+ clearSource();
+ this.javaReader = reader;
+ return this;
+ }
+
+ /**
+ * Set the source to {@link StringReader}.
+ * This clears any other source setting.
+ * The {@link StringReader} will be closed when the
+ * parser is called and the parser can not be reused.
+ * @param reader
+ * @return this
+ * @deprecated Use an InputStream or a StringReader.
+ */
+ @Deprecated
+ public RDFParserBuilder source(Reader reader) {
+ clearSource();
+ this.javaReader = reader;
+ return this;
+ }
+
+ private void clearSource() {
+ this.uri = null;
+ this.inputStream = null;
+ this.path = null;
+ this.javaReader = null;
+ }
+
+ /**
+ * Set the hint {@link Lang}. This is the RDF syntax used when there
is no way to
+ * deduce the syntax (e.g. read from a InputStream, no recognized file
extension, no
+ * recognized HTTP Content-Type provided).
+ *
+ * @param lang
+ * @return this
+ */
+ public RDFParserBuilder lang(Lang lang) { this.hintLang = lang ;
return this; }
+
+ /**
+ * Force the choice RDF syntax to be {@code lang}, and ignore any
indications such as file extension
+ * or HTTP Content-Type.
+ * @see Lang
+ * @param lang
+ * @return this
+ */
+ public RDFParserBuilder forceLang(Lang lang) { this.forceLang = lang ;
return this; }
+
+ /**
+ * Set the HTTP "Accept" header.
+ * The default if not set is {@link WebContent#defaultRDFAcceptHeader}.
+ * @param acceptHeader
+ * @return this
+ */
+ public RDFParserBuilder httpAccept(String acceptHeader) {
+ httpHeader(HttpNames.hAccept, acceptHeader);
+ return this;
+ }
+
+ /**
+ * Set an HTTP header. Any previous setting is
+ * <p>
+ * Consider setting up an {@link HttpClient} if more complicated
setting to an HTTP
+ * request is required.
+ */
+ public RDFParserBuilder httpHeader(String header, String value) {
+ httpHeaders.put(header, value);
+ return this;
+ }
+
+ /** Set the HttpClient to use.
+ * This will override any HTTP header settings.
+ */
+ public RDFParserBuilder httpClient(HttpClient httpClient) {
+ this.httpClient = httpClient;
+ return this;
+ }
+
+ public RDFParserBuilder base(String base) { this.baseUri = base ;
return this; }
+
+ /**
+ * Set the {@link ErrorHandler} to use.
+ * This replaces any previous setting.
+ * The default is use slf4j logger "RIOT".
+ * @param handler
+ * @return this
+ */
+ public RDFParserBuilder errorHandler(ErrorHandler handler) {
+ this.errorHandler = handler;
+ return this;
+ }
+
+ /**
+ * Set the {@link FactoryRDF} to use. {@link FactoryRDF} control how
parser output is
+ * turned into {@code Node} and how {@code Triple}s and {@code Quad}s
are built. This
+ * replaces any previous setting.
+ * <br/>
+ * The default is use {@link RiotLib#factoryRDF()} which is provides
{@code Node}
+ * reuse.
+ * <br/>
+ * The {@code FactoryRDF} also determines how blank node labels in RDF
syntax are
+ * mapped to {@link BlankNodeId}. Use
+ * <pre>
+ * new Factory(myLabelToNode)
+ * </pre>
+ * to create an {@code FactoryRDF} and set the {@code LabelToNode}
step.
+ * @see #labelToNode
+ * @param factory
+ * @return this
+ */
+ public RDFParserBuilder factory(FactoryRDF factory) {
+ this.factory = factory;
+ return this;
+ }
+
+ /**
+ * Use the given {@link LabelToNode}, the policy for converting blank
node labels in
+ * RDF syntax to Jena's {@code Node} objects (usually a blank node).
+ * <br/>
+ * Only applies when the {@link FactoryRDF} is not set in the
+ * {@code RDFParserBuilder}, otherwise the {@link FactoryRDF} controls
the
+ * label-to-node process.
+ * <br/>
+ * {@link SyntaxLabels#createLabelToNode} is the default policy.
+ * <br>
+ * {@link LabelToNode#createUseLabelAsGiven()} uses the label in teh
RDF syntax directly.
--- End diff --
Thanks - I've fixed these in the latest push which includes deprecations in
`RDFDataMgr`.
> Provide detailed setup for RIOT parsing with a parser builder.
> --------------------------------------------------------------
>
> Key: JENA-1306
> URL: https://issues.apache.org/jira/browse/JENA-1306
> Project: Apache Jena
> Issue Type: New Feature
> Components: RIOT
> Affects Versions: Jena 3.2.0
> Reporter: Andy Seaborne
> Assignee: Andy Seaborne
>
> Provide a parser builder for detailed setup of RDFParser.
> This is a new low level interface to the parsing process. It replaces and
> extends the machinery hidden inside {{RDFDataMgr}} ({{process}} and
> {{getReader}}) and {{RDFParserRegistry.ReaderRIOTLang}}.
> It aligns with the changes to {{HttpOp}} to have a specific optional
> {{HttpClient}} (JENA-576 and related work) and so allows applications to
> control the HTTP setup without resorting to direct use of {{HttpOp}}.
> More detailed control can be exposed, including language specific and
> specialized needs, for example [PR#211 "preserve id of blanknodes in
> JSON-LD"|https://github.com/apache/jena/pull/211].
> {{RDFDataMgr}} functions involving a Context can be can be deprecated.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)