You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by st...@apache.org on 2018/02/28 23:54:56 UTC
[2/9] commons-rdf git commit: JenaParser implementation
JenaParser implementation
Project: http://git-wip-us.apache.org/repos/asf/commons-rdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-rdf/commit/1125dd8d
Tree: http://git-wip-us.apache.org/repos/asf/commons-rdf/tree/1125dd8d
Diff: http://git-wip-us.apache.org/repos/asf/commons-rdf/diff/1125dd8d
Branch: refs/heads/fluent-parser-impl
Commit: 1125dd8dda8c3de1cddfa6b0d8c85ef3d0dba4f6
Parents: 9be11ed
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Wed Feb 28 23:38:19 2018 +0000
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Wed Feb 28 23:38:19 2018 +0000
----------------------------------------------------------------------
.../org/apache/commons/rdf/jena/JenaRDF.java | 7 +
.../rdf/jena/experimental/JenaRDFParser.java | 106 ---------------
.../rdf/jena/experimental/package-info.java | 31 -----
.../commons/rdf/jena/impl/JenaParser.java | 135 +++++++++++++++++++
4 files changed, 142 insertions(+), 137 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/1125dd8d/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
----------------------------------------------------------------------
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
index 62327a8..30ead8c 100644
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/JenaRDF.java
@@ -34,7 +34,9 @@ import org.apache.commons.rdf.api.RDFTerm;
import org.apache.commons.rdf.api.RDF;
import org.apache.commons.rdf.api.Triple;
import org.apache.commons.rdf.api.TripleLike;
+import org.apache.commons.rdf.api.io.Parser;
import org.apache.commons.rdf.jena.impl.InternalJenaFactory;
+import org.apache.commons.rdf.jena.impl.JenaParser;
import org.apache.jena.datatypes.RDFDatatype;
import org.apache.jena.datatypes.xsd.XSDDatatype;
import org.apache.jena.graph.Node;
@@ -830,5 +832,10 @@ public final class JenaRDF implements RDF {
public UUID salt() {
return salt;
}
+
+ @Override
+ public Optional<Parser> parser(RDFSyntax syntax) {
+ return Optional.of(new JenaParser(syntax));
+ }
}
http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/1125dd8d/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/JenaRDFParser.java
----------------------------------------------------------------------
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/JenaRDFParser.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/JenaRDFParser.java
deleted file mode 100644
index 2513e82..0000000
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/JenaRDFParser.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * 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.commons.rdf.jena.experimental;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.util.function.Consumer;
-
-import org.apache.commons.rdf.api.IRI;
-import org.apache.commons.rdf.api.QuadLike;
-import org.apache.commons.rdf.api.RDF;
-import org.apache.commons.rdf.api.RDFTerm;
-import org.apache.commons.rdf.api.TripleLike;
-import org.apache.commons.rdf.jena.JenaGraph;
-import org.apache.commons.rdf.jena.JenaRDF;
-import org.apache.commons.rdf.simple.experimental.AbstractRDFParser;
-import org.apache.jena.graph.Graph;
-import org.apache.jena.riot.Lang;
-import org.apache.jena.riot.RDFParser;
-import org.apache.jena.riot.system.StreamRDF;
-import org.apache.jena.riot.system.StreamRDFLib;
-
-public class JenaRDFParser extends AbstractRDFParser<JenaRDFParser> {
-
- private Consumer<TripleLike> generalizedConsumerTriple;
- private Consumer<QuadLike<RDFTerm>> generalizedConsumerQuad;
-
- @Override
- protected RDF createRDFTermFactory() {
- return new JenaRDF();
- }
-
- public JenaRDFParser targetGeneralizedTriple(final Consumer<TripleLike> consumer) {
- final JenaRDFParser c = this.clone();
- c.resetTarget();
- c.generalizedConsumerTriple = consumer;
- return c;
- }
-
- public JenaRDFParser targetGeneralizedQuad(final Consumer<QuadLike<RDFTerm>> consumer) {
- final JenaRDFParser c = this.clone();
- c.resetTarget();
- c.generalizedConsumerQuad = consumer;
- return c;
- }
-
- @Override
- protected void resetTarget() {
- super.resetTarget();
- this.generalizedConsumerTriple = null;
- this.generalizedConsumerQuad = null;
- }
-
- @Override
- protected void parseSynchronusly() throws IOException {
- StreamRDF dest;
- final JenaRDF jenaRDF = getJenaFactory();
- if (getTargetGraph().isPresent() && getTargetGraph().get() instanceof JenaGraph) {
- final Graph jenaGraph = ((JenaGraph) getTargetGraph().get()).asJenaGraph();
- dest = StreamRDFLib.graph(jenaGraph);
- } else {
- if (generalizedConsumerQuad != null) {
- dest = jenaRDF.streamJenaToGeneralizedQuad(generalizedConsumerQuad);
- } else if (generalizedConsumerTriple != null) {
- dest = jenaRDF.streamJenaToGeneralizedTriple(generalizedConsumerTriple);
- } else {
- dest = JenaRDF.streamJenaToQuad(getRdfTermFactory().get(), getTarget());
- }
- }
-
- final Lang lang = getContentTypeSyntax().flatMap(jenaRDF::asJenaLang).orElse(null);
- final String baseStr = getBase().map(IRI::getIRIString).orElse(null);
-
- if (getSourceIri().isPresent()) {
- RDFParser.source(getSourceIri().get().toString()).base(baseStr).lang(lang).parse(dest);
- } else if (getSourceFile().isPresent()) {
- try (InputStream s = Files.newInputStream(getSourceFile().get())) {
- RDFParser.source(s).base(baseStr).lang(lang).parse(dest);
- }
- } else {
- RDFParser.source(getSourceInputStream().get()).base(baseStr).lang(lang).parse(dest);
- }
- }
-
- private JenaRDF getJenaFactory() {
- return (JenaRDF) getRdfTermFactory().filter(JenaRDF.class::isInstance).orElseGet(this::createRDFTermFactory);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/1125dd8d/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/package-info.java
----------------------------------------------------------------------
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/package-info.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/package-info.java
deleted file mode 100644
index 83252b0..0000000
--- a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/experimental/package-info.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.
- */
-/**
- * Experimental Commons RDF Jena implementations.
- * <p>
- * Classes in this package should be considered <strong>at risk</strong>; they
- * might change or be removed in the next minor update of Commons RDF.
- * <p>
- * When a class has stabilized, it will move to the
- * {@link org.apache.commons.rdf.jena} package.
- * <ul>
- * <li>{@link org.apache.commons.rdf.jena.experimental.JenaRDFParser} - a Jena-backed implementations of
- * {@link org.apache.commons.rdf.experimental.RDFParser}.</li>
- * </ul>
- */
-package org.apache.commons.rdf.jena.experimental;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/1125dd8d/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaParser.java
----------------------------------------------------------------------
diff --git a/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaParser.java b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaParser.java
new file mode 100644
index 0000000..6952083
--- /dev/null
+++ b/commons-rdf-jena/src/main/java/org/apache/commons/rdf/jena/impl/JenaParser.java
@@ -0,0 +1,135 @@
+/*
+ * 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.commons.rdf.jena.impl;
+
+import java.io.IOException;
+import java.nio.file.Path;
+
+import org.apache.commons.rdf.api.Dataset;
+import org.apache.commons.rdf.api.IRI;
+import org.apache.commons.rdf.api.RDF;
+import org.apache.commons.rdf.api.RDFSyntax;
+import org.apache.commons.rdf.api.io.Parsed;
+import org.apache.commons.rdf.api.io.Parser;
+import org.apache.commons.rdf.api.io.ParserConfig;
+import org.apache.commons.rdf.api.io.ParserConfig.ImmutableParserConfig;
+import org.apache.commons.rdf.api.io.ParserSource;
+import org.apache.commons.rdf.api.io.ParserTarget;
+import org.apache.commons.rdf.jena.JenaDataset;
+import org.apache.commons.rdf.jena.JenaGraph;
+import org.apache.commons.rdf.jena.JenaRDF;
+import org.apache.jena.riot.RDFParser;
+import org.apache.jena.riot.RDFParserBuilder;
+
+public class JenaParser implements Parser {
+
+ private final RDFSyntax defaultSyntax;
+
+ public JenaParser() {
+ defaultSyntax = null; // unspecified/guess
+ }
+
+ public JenaParser(RDFSyntax syntax) {
+ this.defaultSyntax = syntax;
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Parsed parse(ParserConfig config) throws IOException {
+ return parseImpl(completeConfig(config));
+ }
+
+ private ImmutableParserConfig completeConfig(ParserConfig config) {
+ ImmutableParserConfig completed = config.asImmutableConfig();
+ if (!completed.source().isPresent()) {
+ throw new IllegalStateException("source missing from ParserConfig");
+ }
+
+ if (!completed.syntax().isPresent()) {
+ // Might still be null
+ completed = completed.withSyntax(defaultSyntax);
+ }
+ if (!completed.rdf().isPresent()) {
+ completed = completed.withRDF(new JenaRDF());
+ }
+ RDF rdf = completed.rdf().get();
+ if (!completed.target().isPresent()) {
+ Dataset ds = rdf.createDataset();
+ completed = completed.withTarget(ParserTarget.toDataset(ds));
+ }
+ ParserSource<?> source = completed.source().get();
+ if (!completed.base().isPresent() && source.iri().isPresent()) {
+ // Use base from source.iri() - but only if it's from a source
+ // type Jena does not recognize
+ Object src = source.src();
+ if (!(src instanceof IRI) && !(src instanceof Path)) {
+ completed = completed.withBase(source.iri().get());
+ }
+ }
+ return completed;
+ }
+
+ @SuppressWarnings("rawtypes")
+ private Parsed parseImpl(ImmutableParserConfig config) throws IOException {
+ RDF rdf = config.rdf().get();
+ JenaRDF jenaRDF = jenaRDF(rdf);
+ ParserSource<?> source = config.source().get();
+ ParserTarget<?> target = config.target().get();
+ RDFParserBuilder jenaParser = RDFParser.create();
+
+ config.base().map(IRI::getIRIString).map(jenaParser::base);
+ config.syntax().flatMap(jenaRDF::asJenaLang).map(jenaParser::lang);
+
+ // Handle jena-supported sources first
+ if (source.src() instanceof Path) {
+ Path path = (Path) source.src();
+ jenaParser.source(path);
+ } else if (source.src() instanceof IRI) {
+ IRI iri = (IRI) source.src();
+ jenaParser.source(iri.getIRIString());
+ } else if (source.src() instanceof String) {
+ jenaParser.fromString(source.src().toString());
+ } else {
+ // This fallback should always work
+ jenaParser.source(source.inputStream());
+ }
+
+ // Handle jena implementations firsts
+ if (target.dest() instanceof JenaDataset) {
+ JenaDataset jenaDataset = (JenaDataset) target.dest();
+ jenaParser.parse(jenaDataset.asJenaDatasetGraph());
+ } else if (target.dest() instanceof JenaGraph) {
+ JenaGraph jenaGraph = (JenaGraph) target.dest();
+ jenaParser.parse(jenaGraph.asJenaGraph());
+ } else {
+ // General approach, stream to Quads
+ jenaParser.parse(JenaRDF.streamJenaToQuad(rdf, target));
+ }
+
+ // Parsing finished
+ return Parsed.from(source, target);
+ }
+
+ private JenaRDF jenaRDF(RDF rdf) {
+ if (rdf instanceof JenaRDF) {
+ return (JenaRDF) rdf;
+ } else {
+ return new JenaRDF();
+ }
+ }
+
+}