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/15 01:55:08 UTC

[13/17] commons-rdf git commit: ParserConfig interface

ParserConfig interface


Project: http://git-wip-us.apache.org/repos/asf/commons-rdf/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-rdf/commit/fb9a60bc
Tree: http://git-wip-us.apache.org/repos/asf/commons-rdf/tree/fb9a60bc
Diff: http://git-wip-us.apache.org/repos/asf/commons-rdf/diff/fb9a60bc

Branch: refs/heads/fluent-parser
Commit: fb9a60bc8e5cea358982fd3833be6e150752314a
Parents: 5241e75
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Thu Feb 15 00:41:36 2018 +0000
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Thu Feb 15 00:41:36 2018 +0000

----------------------------------------------------------------------
 .../rdf/api/io/AbstractParserFactory.java       | 354 +++++++++++++++++++
 .../org/apache/commons/rdf/api/io/Parser.java   |  25 ++
 .../apache/commons/rdf/api/io/ParserConfig.java |  34 ++
 .../apache/commons/rdf/simple/SimpleRDF.java    |  14 +
 4 files changed, 427 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/fb9a60bc/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserFactory.java
----------------------------------------------------------------------
diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserFactory.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserFactory.java
new file mode 100644
index 0000000..2e37b81
--- /dev/null
+++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserFactory.java
@@ -0,0 +1,354 @@
+/*
+ * 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.api.io;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import org.apache.commons.rdf.api.Dataset;
+import org.apache.commons.rdf.api.Graph;
+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.fluentparser.Async;
+import org.apache.commons.rdf.api.fluentparser.NeedSourceBased;
+import org.apache.commons.rdf.api.fluentparser.NeedSourceOrBase;
+import org.apache.commons.rdf.api.fluentparser.NeedTargetOrRDF;
+import org.apache.commons.rdf.api.fluentparser.NeedTargetOrRDFOrSyntax;
+import org.apache.commons.rdf.api.fluentparser.OptionalTarget;
+import org.apache.commons.rdf.api.fluentparser.Sync;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public final class AbstractParserFactory implements 
+Cloneable, 
+Serializable, 
+NeedTargetOrRDF, 
+NeedTargetOrRDFOrSyntax, 
+NeedSourceOrBase,
+NeedSourceBased, 
+OptionalTarget, 
+Sync, 
+Async {
+
+	private static final long serialVersionUID = 1L;
+
+	@Override
+	public AbstractParserFactory clone() {
+		try {
+			AbstractParserFactory c = (AbstractParserFactory) super.clone();
+			c.config = (ParserConfigImpl) config.clone();
+			return c;
+		} catch (CloneNotSupportedException e) {
+			throw new IllegalStateException("AbstractParserFactory was not Cloneable", e);
+		}
+	}
+
+	static final class InputParserSource implements ParserSource {
+		private final InputStream is;
+
+		private InputParserSource(InputStream is) {
+			this.is = is;
+		}
+
+		@Override
+		public Object src() {
+			return is;
+		}
+
+		@Override
+		public InputStream inputStream() throws IOException {
+			return is;
+		}
+
+		@Override
+		public Optional iri() {
+			return Optional.empty();
+		}
+	}
+
+	private final class PathParserSource implements ParserSource<Path> {
+		private final Path path;
+
+		private PathParserSource(Path path) {
+			this.path = path;
+		}
+
+		@Override
+		public Path src() {
+			return path;
+		}
+
+		@Override
+		public InputStream inputStream() throws IOException {
+			return Files.newInputStream(path);
+		}
+
+		@Override
+		public Optional<IRI> iri() {
+			final String uri = path.toUri().toString();
+			return Optional.of(new IRIImpl(uri));
+		}
+	}
+
+	private final class IRIParserSource implements ParserSource<IRI> {
+		private final IRI iri;
+
+		private IRIParserSource(IRI iri) {
+			this.iri = iri;
+		}
+
+		@Override
+		public IRI src() {
+			return iri;
+		}
+
+		@Override
+		public InputStream inputStream() throws IOException {
+			return new URL(iri.getIRIString()).openStream();
+		}
+
+		@Override
+		public Optional<IRI> iri() {
+			return Optional.of(iri);
+		}
+	}
+
+	private final class IRIImpl implements IRI {
+		private final String uri;
+
+		private IRIImpl(String uri) {
+			this.uri = uri;
+		}
+
+		@Override
+		public String ntriplesString() {
+			return "<" + uri + ">";
+		}
+
+		@Override
+		public String getIRIString() {
+			return uri;
+		}
+
+		@Override
+		public boolean equals(Object obj) {
+			return (obj instanceof IRI) && ((IRI) obj).getIRIString().equals(uri);
+		}
+
+		@Override
+		public int hashCode() {
+			return uri.hashCode();
+		}
+	}
+
+	public static final class ParserConfigImpl implements Cloneable, Serializable, ParserConfig {
+		private static final long serialVersionUID = 1L;
+		private RDF rdf = null;
+		private RDFSyntax syntax = null;
+		private IRI base = null;
+		private ParserSource source = null;
+		private ParserTarget target = null;
+		final private  Map<Option, Object> options = new HashMap<>();
+
+		public ParserConfigImpl() {
+		}
+		
+		public ParserConfigImpl(ParserConfig old) {
+			rdf = old.rdf().orElse(null);
+			syntax = old.syntax().orElse(null);
+			base = old.base().orElse(null);
+			source = old.source().orElse(null);
+			target = old.target().orElse(null);
+			options.putAll(old.options());
+		}
+
+		@Override
+		protected Object clone() {
+			return new ParserConfigImpl(this);
+		}
+
+		@Override
+		public Optional<ParserSource> source() {
+			return Optional.of(source);
+		}
+
+		@Override
+		public Optional<IRI> base() {
+			return Optional.of(base);
+		}
+
+		@Override
+		public Optional<ParserTarget> target() {
+			return Optional.of(target);
+		}
+
+		@Override
+		public Optional<RDFSyntax> syntax() {
+			return Optional.of(syntax);
+		}
+
+		@Override
+		public Optional<RDF> rdf() {
+			return Optional.of(rdf);
+		}
+
+		@Override
+		public Map<Option, Object> options() {
+			return options;
+		}
+		
+		
+	}
+	private boolean mutable = false;
+	private ParserConfigImpl config = new ParserConfigImpl();
+
+	@Override
+	public NeedTargetOrRDF syntax(RDFSyntax syntax) {
+		AbstractParserFactory c = mutable();
+		c.config.syntax = syntax;
+		return c;
+	}
+
+	private AbstractParserFactory mutable(boolean mutable) {
+		if (this.mutable == mutable) {
+			return this;
+		} else {
+			AbstractParserFactory c = clone();
+			c.mutable = mutable;
+			return c;
+		}
+	}
+
+	private AbstractParserFactory mutable() {
+		return mutable(true);
+	}
+
+	@Override
+	public AbstractParserFactory build() {
+		return mutable(false);
+	}
+
+	@Override
+	public NeedSourceOrBase target(Dataset dataset) {
+		return target(dataset::add);
+
+	}
+
+	@Override
+	public NeedSourceOrBase<Graph> target(Graph graph) {
+		return target(q -> {
+			if (q.getGraphName().isPresent()) {
+				// Only add if q is in default graph
+				graph.add(q.asTriple());
+			}
+		});
+	}
+
+	@Override
+	public <T> NeedSourceOrBase<T> target(ParserTarget<T> target) {
+		AbstractParserFactory c = mutable();
+		c.config.target = target;
+		return c;
+	}
+
+	@Override
+	public NeedSourceBased base(IRI iri) {
+		AbstractParserFactory c = mutable();
+		c.config.base = iri;
+		return c;
+	}
+
+	@Override
+	public NeedSourceBased base(String iri) {
+		AbstractParserFactory c = mutable();
+		c.config.base = new IRIImpl(iri);
+		return c;
+	}
+
+	@Override
+	public Sync source(final IRI iri) {
+		return source(new IRIParserSource(iri));
+	}
+
+	public Sync source(Path path) {
+		return source(new PathParserSource(path));
+	}
+
+	@Override
+	public OptionalTarget<Dataset> rdf(RDF rdf) {
+		AbstractParserFactory c = mutable();
+		c.config.rdf = rdf;
+		return c;
+	}
+
+	@Override
+	public Sync source(ParserSource source) {
+		AbstractParserFactory c = mutable();
+		c.config.source = source;
+		return c;		
+	}
+
+	@Override
+	public Sync source(String iri) {
+		return source(new IRIImpl(iri));
+	}
+
+	@Override
+	public AbstractParserFactory option(Option option, Object value) {
+		AbstractParserFactory c = mutable();
+		c.config.options.put(option, value);
+		return c;		
+	}
+
+	@Override
+	public Future parseAsync() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Async async() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Async async(ExecutorService executor) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Parsed parse() {
+		return null;
+	}
+
+	@Override
+	public Sync source(InputStream is) {
+		return source(new InputParserSource(is));
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/fb9a60bc/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Parser.java
----------------------------------------------------------------------
diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Parser.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Parser.java
new file mode 100644
index 0000000..84ad2be
--- /dev/null
+++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Parser.java
@@ -0,0 +1,25 @@
+/*
+ * 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.api.io;
+
+import org.apache.commons.rdf.api.io.AbstractParserFactory.ParserConfig;
+
+public interface Parser {
+
+	Parsed parse(ParserConfig config);
+
+}

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/fb9a60bc/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfig.java
----------------------------------------------------------------------
diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfig.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfig.java
new file mode 100644
index 0000000..d18a268
--- /dev/null
+++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfig.java
@@ -0,0 +1,34 @@
+/*
+ * 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.api.io;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.apache.commons.rdf.api.IRI;
+import org.apache.commons.rdf.api.RDF;
+import org.apache.commons.rdf.api.RDFSyntax;
+
+public interface ParserConfig {
+	Optional<ParserSource> source();
+	Optional<IRI> base();
+	Optional<ParserTarget> target();
+	Optional<RDFSyntax> syntax();
+	Optional<RDF> rdf();
+	Map<Option, Object> options();
+	
+}

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/fb9a60bc/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/SimpleRDF.java
----------------------------------------------------------------------
diff --git a/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/SimpleRDF.java b/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/SimpleRDF.java
index 6f6b2a5..74d2378 100644
--- a/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/SimpleRDF.java
+++ b/commons-rdf-simple/src/main/java/org/apache/commons/rdf/simple/SimpleRDF.java
@@ -17,6 +17,7 @@
  */
 package org.apache.commons.rdf.simple;
 
+import java.util.Optional;
 import java.util.UUID;
 
 import org.apache.commons.rdf.api.BlankNode;
@@ -28,7 +29,10 @@ import org.apache.commons.rdf.api.Literal;
 import org.apache.commons.rdf.api.Quad;
 import org.apache.commons.rdf.api.RDFTerm;
 import org.apache.commons.rdf.api.RDF;
+import org.apache.commons.rdf.api.RDFSyntax;
 import org.apache.commons.rdf.api.Triple;
+import org.apache.commons.rdf.api.io.ParserBuilder;
+import org.apache.commons.rdf.api.io.ParserFactory;
 
 /**
  * Simple RDF implementation.
@@ -109,4 +113,14 @@ public class SimpleRDF implements RDF {
             throws IllegalArgumentException {
         return new QuadImpl(graphName, subject, predicate, object);
     }
+
+	@Override
+	public ParserFactory parserFactory() throws UnsupportedOperationException {
+		throw new UnsupportedOperationException("SimpleRDF does not support parsing");
+	}
+
+	@Override
+	public Optional<ParserBuilder> parser(RDFSyntax syntax) {
+		return Optional.empty();
+	}
 }