AbstractRDFParserBuilder generic

so that the build methods can return the correct subtype
of itself


Project: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/commit/0a5be9db
Tree: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/tree/0a5be9db
Diff: http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/diff/0a5be9db

Branch: refs/heads/master
Commit: 0a5be9dbb9634637e19aa3aaeb56e6865b702577
Parents: ddc545e
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Mon Jul 4 12:07:01 2016 +0100
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Mon Jul 4 12:07:01 2016 +0100

----------------------------------------------------------------------
 .../rdf/simple/AbstractRDFParserBuilder.java    | 111 +++++++++----------
 .../commons/rdf/simple/RDFParseException.java   |  50 +++++++++
 .../rdf/simple/DummyRDFParserBuilder.java       |   2 +-
 3 files changed, 102 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/0a5be9db/simple/src/main/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilder.java
----------------------------------------------------------------------
diff --git 
a/simple/src/main/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilder.java
 
b/simple/src/main/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilder.java
index cc5fad0..4a5b4d1 100644
--- 
a/simple/src/main/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilder.java
+++ 
b/simple/src/main/java/org/apache/commons/rdf/simple/AbstractRDFParserBuilder.java
@@ -33,6 +33,7 @@ import org.apache.commons.rdf.api.Graph;
 import org.apache.commons.rdf.api.IRI;
 import org.apache.commons.rdf.api.Quad;
 import org.apache.commons.rdf.api.RDFParserBuilder;
+import org.apache.commons.rdf.api.RDFParserBuilder.ParseResult;
 import org.apache.commons.rdf.api.RDFSyntax;
 import org.apache.commons.rdf.api.RDFTermFactory;
 
@@ -53,28 +54,10 @@ import org.apache.commons.rdf.api.RDFTermFactory;
  * multiple {@link #parse()} calls are thread-safe. The default {@link 
#parse()}
  * uses a thread pool in {@link #threadGroup} - but implementations can 
override
  * {@link #parse()} (e.g. because it has its own threading model or use
- * asynchronou  remote execution).
+ * asynchronous remote execution).
  */
-public abstract class AbstractRDFParserBuilder implements RDFParserBuilder, 
Cloneable {
-
-       public class RDFParseException extends Exception {              
-               private static final long serialVersionUID = 
5427752643780702976L;
-               public RDFParseException() {
-                       super();
-               }
-               public RDFParseException(String message, Throwable cause) {
-                       super(message, cause);
-               }
-               public RDFParseException(String message) {
-                       super(message);
-               }
-               public RDFParseException(Throwable cause) {
-                       super(cause);
-               }
-               public RDFParserBuilder getRDFParserBuilder() {
-                       return AbstractRDFParserBuilder.this;
-               }
-       }
+public abstract class AbstractRDFParserBuilder<T extends 
AbstractRDFParserBuilder<T>> 
+       implements RDFParserBuilder, Cloneable {
        
        public static final ThreadGroup threadGroup = new ThreadGroup("Commons 
RDF parsers");
        private static final ExecutorService threadpool = 
Executors.newCachedThreadPool(r -> new Thread(threadGroup, r));
@@ -212,79 +195,85 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
        private Optional<Dataset> targetDataset;
        private Optional<Graph> targetGraph;
 
+       @SuppressWarnings("unchecked")
        @Override
-       public AbstractRDFParserBuilder clone() {
+       public T clone() {
                try {
-                       return (AbstractRDFParserBuilder) super.clone();
+                       return (T) super.clone();
                } catch (CloneNotSupportedException e) {
                        throw new RuntimeException(e);
                }
        }
 
+       @SuppressWarnings("unchecked")
+       protected T asT() { 
+               return (T) this;
+       }
+       
        @Override
-       public RDFParserBuilder rdfTermFactory(RDFTermFactory rdfTermFactory) {
-               AbstractRDFParserBuilder c = clone();
+       public T rdfTermFactory(RDFTermFactory rdfTermFactory) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.rdfTermFactory = Optional.ofNullable(rdfTermFactory);
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder contentType(RDFSyntax rdfSyntax) throws 
IllegalArgumentException {
-               AbstractRDFParserBuilder c = clone();
+       public T contentType(RDFSyntax rdfSyntax) throws 
IllegalArgumentException {
+               AbstractRDFParserBuilder<T> c = clone();
                c.contentTypeSyntax = Optional.ofNullable(rdfSyntax);
                c.contentType = c.contentTypeSyntax.map(syntax -> 
syntax.mediaType);
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder contentType(String contentType) throws 
IllegalArgumentException {
-               AbstractRDFParserBuilder c = clone();
+       public T contentType(String contentType) throws 
IllegalArgumentException {
+               AbstractRDFParserBuilder<T> c = clone();
                c.contentType = Optional.ofNullable(contentType);
                c.contentTypeSyntax = 
c.contentType.flatMap(RDFSyntax::byMediaType);
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder base(IRI base) {
-               AbstractRDFParserBuilder c = clone();
+       public T base(IRI base) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.base = Optional.ofNullable(base);
                c.base.ifPresent(i -> checkIsAbsolute(i));
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder base(String base) throws 
IllegalArgumentException {
+       public T base(String base) throws IllegalArgumentException {
                return base(internalRdfTermFactory.createIRI(base));
        }
 
        @Override
-       public RDFParserBuilder source(InputStream inputStream) {
-               AbstractRDFParserBuilder c = clone();
+       public T source(InputStream inputStream) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.resetSource();
                c.sourceInputStream = Optional.ofNullable(inputStream);
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder source(Path file) {
-               AbstractRDFParserBuilder c = clone();
+       public T source(Path file) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.resetSource();
                c.sourceFile = Optional.ofNullable(file);
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder source(IRI iri) {
-               AbstractRDFParserBuilder c = clone();
+       public T source(IRI iri) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.resetSource();
                c.sourceIri = Optional.ofNullable(iri);
                c.sourceIri.ifPresent(i -> checkIsAbsolute(i));
-               return c;
+               return c.asT();
        }
 
        @Override
-       public RDFParserBuilder source(String iri) throws 
IllegalArgumentException {
-               AbstractRDFParserBuilder c = clone();
+       public T source(String iri) throws IllegalArgumentException {
+               AbstractRDFParserBuilder<T> c = clone();
                c.resetSource();
                c.sourceIri = 
Optional.ofNullable(iri).map(internalRdfTermFactory::createIRI);
                c.sourceIri.ifPresent(i -> checkIsAbsolute(i));
@@ -407,7 +396,7 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
         * @throws IOException If the source was not accessible (e.g. a file 
was not found)
         * @throws IllegalStateException If the parser was not in a compatible 
setting (e.g. contentType was an invalid string) 
         */
-       protected AbstractRDFParserBuilder prepareForParsing() throws 
IOException, IllegalStateException {
+       protected T prepareForParsing() throws IOException, 
IllegalStateException {
                checkSource();
                checkBaseRequired();            
                checkContentType();
@@ -415,7 +404,7 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
 
                // We'll make a clone of our current state which will be passed 
to
                // parseSynchronously()
-               AbstractRDFParserBuilder c = clone();
+               AbstractRDFParserBuilder<T> c = clone();
 
                // Use a fresh SimpleRDFTermFactory for each parse
                if (!c.rdfTermFactory.isPresent()) {
@@ -428,7 +417,7 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
                        c.base = 
Optional.of(internalRdfTermFactory.createIRI(baseUri.toString()));
                }
 
-               return c;
+               return c.asT();
        }
        
        /**
@@ -519,7 +508,7 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
 
        @Override
        public Future<ParseResult> parse() throws IOException, 
IllegalStateException {
-               final AbstractRDFParserBuilder c = prepareForParsing();
+               final AbstractRDFParserBuilder<T> c = prepareForParsing();
                return threadpool.submit(() -> {
                        c.parseSynchronusly();
                        return null;
@@ -527,27 +516,29 @@ public abstract class AbstractRDFParserBuilder implements 
RDFParserBuilder, Clon
        }
 
        @Override
-       public RDFParserBuilder target(Consumer<Quad> consumer) {
-               AbstractRDFParserBuilder c = clone();
+       public T target(Consumer<Quad> consumer) {
+               AbstractRDFParserBuilder<T> c = clone();
                c.resetTarget();
                c.target = consumer;
-               return c;
+               return c.asT();
        }
        
        @Override
-       public RDFParserBuilder target(Dataset dataset) {
-               AbstractRDFParserBuilder c = (AbstractRDFParserBuilder) 
RDFParserBuilder.super.target(dataset);
+       public T target(Dataset dataset) {
+               @SuppressWarnings({ "rawtypes", "unchecked" })
+               AbstractRDFParserBuilder<T> c = (AbstractRDFParserBuilder) 
RDFParserBuilder.super.target(dataset);
                c.resetTarget();
                c.targetDataset = Optional.of(dataset);
-               return c;
+               return c.asT();
        }
        
        @Override
-       public RDFParserBuilder target(Graph graph) {
-               AbstractRDFParserBuilder c = (AbstractRDFParserBuilder) 
RDFParserBuilder.super.target(graph);
+       public T target(Graph graph) {
+               @SuppressWarnings({ "rawtypes", "unchecked" }) // super calls 
our .clone()
+               AbstractRDFParserBuilder<T> c = (AbstractRDFParserBuilder) 
RDFParserBuilder.super.target(graph);
                c.resetTarget();
                c.targetGraph = Optional.of(graph);
-               return c;
+               return c.asT();
        }
        
 

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/0a5be9db/simple/src/main/java/org/apache/commons/rdf/simple/RDFParseException.java
----------------------------------------------------------------------
diff --git 
a/simple/src/main/java/org/apache/commons/rdf/simple/RDFParseException.java 
b/simple/src/main/java/org/apache/commons/rdf/simple/RDFParseException.java
new file mode 100644
index 0000000..ed16bb2
--- /dev/null
+++ b/simple/src/main/java/org/apache/commons/rdf/simple/RDFParseException.java
@@ -0,0 +1,50 @@
+/**
+ * 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.simple;
+
+import org.apache.commons.rdf.api.RDFParserBuilder;
+
+public class RDFParseException extends Exception {
+       private static final long serialVersionUID = 5427752643780702976L;
+       private RDFParserBuilder builder;
+
+       public RDFParseException(RDFParserBuilder builder) {
+               super();
+               this.builder = builder;
+       }
+
+       public RDFParseException(RDFParserBuilder builder, String message, 
Throwable cause) {
+               super(message, cause);
+               this.builder = builder;
+       }
+
+       public RDFParseException(RDFParserBuilder builder, String message) {
+               super(message);
+               this.builder = builder;
+       }
+
+       public RDFParseException(RDFParserBuilder builder, Throwable cause) {
+               super(cause);
+               this.builder = builder;
+       }
+
+       public RDFParserBuilder getRDFParserBuilder() {
+               return builder;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-commonsrdf/blob/0a5be9db/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
----------------------------------------------------------------------
diff --git 
a/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java 
b/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
index 0cb7093..baf9768 100644
--- 
a/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
+++ 
b/simple/src/test/java/org/apache/commons/rdf/simple/DummyRDFParserBuilder.java
@@ -43,7 +43,7 @@ import org.apache.commons.rdf.api.RDFTermFactory;
  * 
  *
  */
-public class DummyRDFParserBuilder extends AbstractRDFParserBuilder {
+public class DummyRDFParserBuilder extends 
AbstractRDFParserBuilder<DummyRDFParserBuilder> {
        
        @Override
        protected void parseSynchronusly() throws IOException, 
IllegalStateException, RDFParseException {               

Reply via email to