Builder uses Immutable/Mutable config

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

Branch: refs/heads/fluent-parser
Commit: 2dfd491432407a1dfca018b89bb353dce58b2d9d
Parents: 648f18b
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Mon Feb 19 09:08:59 2018 +0000
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Mon Feb 19 09:08:59 2018 +0000

----------------------------------------------------------------------
 .../rdf/api/io/AbstractParserBuilder.java       | 214 -------------------
 .../apache/commons/rdf/api/io/ParserConfig.java |   4 +-
 .../commons/rdf/api/io/ParserConfigBuilder.java | 150 +++++++++++++
 3 files changed, 152 insertions(+), 216 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/2dfd4914/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserBuilder.java
----------------------------------------------------------------------
diff --git 
a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserBuilder.java
 
b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserBuilder.java
deleted file mode 100644
index 03c6b93..0000000
--- 
a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/AbstractParserBuilder.java
+++ /dev/null
@@ -1,214 +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.api.io;
-
-import java.io.InputStream;
-import java.io.Serializable;
-import java.nio.file.Path;
-import java.util.Optional;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-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 AbstractParserBuilder implements Cloneable, Serializable, 
NeedTargetOrRDF, NeedTargetOrRDFOrSyntax,
-               NeedSourceOrBase, NeedSourceBased, OptionalTarget, Sync, Async {
-
-       private static final long serialVersionUID = 1L;
-
-
-    private static final ThreadGroup THEAD_GROUP = new ThreadGroup("Commons 
RDF parsers");
-    private static final ExecutorService DEFAULT_EXECUTOR = 
Executors.newCachedThreadPool(r -> new Thread(THEAD_GROUP, r));
-       
-       public AbstractParserBuilder(RDF rdf) {
-               this.config = ParserConfig.mutable().withRDF(rdf);
-       }
-       
-       @Override
-       public AbstractParserBuilder clone() {          
-               try {
-                       AbstractParserBuilder c = (AbstractParserBuilder) 
super.clone();
-                       c.config = (MutableParserConfig) config.clone();
-                       return c;
-               } catch (CloneNotSupportedException e) {
-                       throw new IllegalStateException("AbstractParserBuilder 
was not Cloneable", e);
-               }
-       }
-
-       private boolean mutable = false;
-       private ParserConfig config;
-       private ExecutorService executor = DEFAULT_EXECUTOR;
-
-       @Override
-       public NeedTargetOrRDF syntax(RDFSyntax syntax) {
-               AbstractParserBuilder c = mutable();
-               c.config.withSyntax(syntax);
-               return c;
-       }
-
-       private AbstractParserBuilder mutable(boolean mutable) {
-               if (this.mutable == mutable) {
-                       return this;
-               } else {
-                       AbstractParserBuilder c = clone();
-                       c.mutable = mutable;
-                       return c;
-               }
-       }
-
-       private AbstractParserBuilder mutable() {
-               return mutable(true);
-       }
-
-       @Override
-       public AbstractParserBuilder 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) {
-               AbstractParserBuilder c = mutable();
-               c.config.withTarget(target);
-               return c;
-       }
-
-       @Override
-       public NeedSourceBased base(IRI iri) {
-               AbstractParserBuilder c = mutable();
-               c.config.withBase(iri);
-               return c;
-       }
-
-       @Override
-       public NeedSourceBased base(String iri) {
-               AbstractParserBuilder c = mutable();
-               c.config.withBase(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) {
-               AbstractParserBuilder c = mutable();
-               c.config.withRDF(rdf);
-               return c;
-       }
-
-       @Override
-       public Sync source(ParserSource source) {
-               AbstractParserBuilder c = mutable();
-               c.config.withSource(source);
-               return c;
-       }
-
-       @Override
-       public Sync source(String iri) {
-               return source(new IRIImpl(iri));
-       }
-
-       @Override
-       public AbstractParserBuilder option(Option option, Object value) {
-               AbstractParserBuilder c = mutable();
-               c.config.withOption(option, value);
-               return c;
-       }
-
-       @Override
-       public Future<Parsed> parseAsync() {
-               // Ensure immutable
-               AbstractParserBuilder frozen = mutable(false);
-               Parser parser = getParserOrFail(frozen.config);         
-               return frozen.executor.submit(() -> 
parser.parse(frozen.config));
-       }
-
-       @Override
-       public Async async() {
-               AbstractParserBuilder c = mutable();
-               c.executor = DEFAULT_EXECUTOR;
-               return c;
-       }
-
-       @Override
-       public Async async(ExecutorService executor) {
-               AbstractParserBuilder c = mutable();
-               c.executor = executor;
-               return c;
-       }
-
-       @Override
-       public Sync source(InputStream is) {
-               return source(new InputParserSource(is));
-       }
-
-       @Override
-       public Parsed parse() {
-               // ensure immutable copy of config
-               MutableParserConfig c = mutable(false).config;
-               Parser parser = getParserOrFail(c);
-               return parser.parse(c);
-       }
-
-       private Parser getParserOrFail(MutableParserConfig c) {
-               if (! c.rdf().isPresent()) {
-                       throw new IllegalStateException("ParserState has no RDF 
instance configured");
-               }
-               Optional<Parser> parser = 
c.rdf().get().parser(c.syntax().orElse(null));
-               if (! parser.isPresent()) { 
-                       throw new IllegalStateException("Unsupported RDF syntax 
" 
-                                       + c.syntax().map(t -> t.name() 
).orElse("(guess)"));
-               }
-               return parser.get();
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/2dfd4914/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
index b767dcc..bb7f7c5 100644
--- 
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
@@ -62,9 +62,9 @@ interface ParserConfig {
                }
        }
        
-       default ParserConfig asImmutableConfig() {
+       default ImmutableParserConfig asImmutableConfig() {
                if (this instanceof ImmutableParserConfig) {
-                       return this;
+                       return (ImmutableParserConfig) this;
                } else {
                        return new SnapshotParserConfig(this);
                }

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/2dfd4914/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfigBuilder.java
----------------------------------------------------------------------
diff --git 
a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfigBuilder.java
 
b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfigBuilder.java
new file mode 100644
index 0000000..3409173
--- /dev/null
+++ 
b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/ParserConfigBuilder.java
@@ -0,0 +1,150 @@
+/*
+ * 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.InputStream;
+import java.io.Serializable;
+import java.nio.file.Path;
+import java.util.Optional;
+
+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;
+import org.apache.commons.rdf.api.io.ParserConfig.ImmutableParserConfig;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public final class ParserConfigBuilder implements Serializable, 
NeedTargetOrRDF, NeedTargetOrRDFOrSyntax,
+               NeedSourceOrBase, NeedSourceBased, OptionalTarget, Sync, Async {
+
+       private static final long serialVersionUID = 1L;
+
+       public ParserConfigBuilder(ParserConfig mutated) {
+               this.config = mutated;
+       }       
+       private final ParserConfig config;
+       private ParserConfigBuilder mutate(ParserConfig mutated) {
+               if (mutated == config) {
+                       // We're mutable (or nothing changed)
+                       return this;
+               } else {
+                       return new ParserConfigBuilder(mutated);
+               }
+       }
+       
+       @Override
+       public NeedTargetOrRDF syntax(RDFSyntax syntax) {
+               return mutate(config.withSyntax(syntax));
+       }
+
+       public ParserConfig buildConfig() {
+               return config.asImmutableConfig();
+       }
+
+       @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) {
+               return mutate(config.withTarget(target));
+       }
+
+       @Override
+       public NeedSourceBased base(IRI iri) {
+               return mutate(config.withBase(iri));
+       }
+
+       @Override
+       public NeedSourceBased base(String iriStr) {
+               return base(new IRIImpl(iriStr));
+       }
+
+       @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) {
+               return mutate(config.withRDF(rdf));
+       }
+
+       @Override
+       public Sync source(ParserSource source) {
+               return mutate(config.withSource(source));
+       }
+
+       @Override
+       public Sync source(String iri) {
+               return source(new IRIImpl(iri));
+       }
+
+       @Override
+       public ParserConfigBuilder option(Option option, Object value) {
+               return mutate(config.withOption(option, value));
+       }
+
+       @Override
+       public Sync source(InputStream is) {
+               return source(new InputParserSource(is));
+       }
+
+       @Override
+       public Parsed parse() {
+               ImmutableParserConfig c = config.asImmutableConfig();
+               Parser parser = getParserOrFail(c);
+               return parser.parse(c);
+       }
+
+       private static Parser getParserOrFail(ImmutableParserConfig c) {
+               if (! c.rdf().isPresent()) {
+                       throw new IllegalStateException("ParserState has no RDF 
instance configured");
+               }
+               Optional<Parser> parser = 
c.rdf().get().parser(c.syntax().orElse(null));
+               if (! parser.isPresent()) { 
+                       throw new IllegalStateException("Unsupported RDF syntax 
" 
+                                       + c.syntax().map(t -> t.name() 
).orElse("(guess)"));
+               }
+               return parser.get();
+       }
+
+}

Reply via email to