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(); + } + +}