equivalent WriterConfig
Project: http://git-wip-us.apache.org/repos/asf/commons-rdf/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-rdf/commit/5f1c7814 Tree: http://git-wip-us.apache.org/repos/asf/commons-rdf/tree/5f1c7814 Diff: http://git-wip-us.apache.org/repos/asf/commons-rdf/diff/5f1c7814 Branch: refs/heads/fluent-parser Commit: 5f1c781491734c4ef71bec9ad6393b50e09062b4 Parents: 6c9cc64 Author: Stian Soiland-Reyes <st...@apache.org> Authored: Tue Feb 20 10:43:50 2018 +0000 Committer: Stian Soiland-Reyes <st...@apache.org> Committed: Tue Feb 20 10:45:57 2018 +0000 ---------------------------------------------------------------------- .../java/org/apache/commons/rdf/api/RDF.java | 17 ++ .../commons/rdf/api/fluentwriter/Async.java | 2 +- .../commons/rdf/api/fluentwriter/Buildable.java | 49 ++++ .../rdf/api/fluentwriter/NeedSource.java | 2 +- .../rdf/api/fluentwriter/NeedTarget.java | 2 +- .../commons/rdf/api/fluentwriter/Sync.java | 2 +- .../rdf/api/fluentwriter/_Buildable.java | 49 ---- .../commons/rdf/api/io/MutableWriterConfig.java | 103 ++++++++ .../commons/rdf/api/io/NullWriterConfig.java | 252 +++++++++++++++++++ .../org/apache/commons/rdf/api/io/Writer.java | 54 ++++ .../apache/commons/rdf/api/io/WriterConfig.java | 68 +++++ 11 files changed, 547 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/RDF.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/RDF.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/RDF.java index 8fab94f..46f7499 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/RDF.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/RDF.java @@ -28,6 +28,7 @@ import org.apache.commons.rdf.api.fluentparser.Sync; import org.apache.commons.rdf.api.io.Parsed; import org.apache.commons.rdf.api.io.Parser; import org.apache.commons.rdf.api.io.ParserBuilder; +import org.apache.commons.rdf.api.io.Writer; /** * A RDF implementation. @@ -328,4 +329,20 @@ public interface RDF { */ public Optional<Parser> parser(RDFSyntax syntax); + /** + * Return a writer for the given RDF syntax. + * <p> + * If the syntax is not supported/recognised by this RDF implementation, + * return {@link Optional#empty()}, otherwise return an {@link Optional} + * containing an {@link Writer} for that syntax. + * <p> + * If the provided syntax is <code>null</code>, + * return a generic {@link Writer} that can detect the syntax + * (e.g. from WriterConfig), or {@link Optional#empty()} if this feature is not supported. + * + * @param syntax RDF Syntax to write, or <code>null</code> for syntax to be configured later. + * @return A {@link Writer}, or {@link Optional#empty()} if the + * syntax is not supported. + */ + public Optional<Writer> writer(RDFSyntax syntax); } http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Async.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Async.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Async.java index e7edcf4..99982eb 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Async.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Async.java @@ -5,7 +5,7 @@ import java.util.concurrent.Future; import org.apache.commons.rdf.api.io.Option; import org.apache.commons.rdf.api.io.Written; -public interface Async extends _Buildable { +public interface Async extends Buildable { Async build(); <V> Async option(Option<V> option, V value); http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Buildable.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Buildable.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Buildable.java new file mode 100644 index 0000000..bd6aeab --- /dev/null +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Buildable.java @@ -0,0 +1,49 @@ +/** + * 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.fluentwriter; + +import org.apache.commons.rdf.api.io.Option; +import org.apache.commons.rdf.api.io.Option.RequiredOption; + +public interface Buildable { + /** + * Return an immutable builder at the current state. The returned builder + * can be re-used multiple times in a thread-safe way. + * + * @return An immutable builder + */ + Buildable build(); + + /** + * Return a builder with the given option set. + * <p> + * Note that implementations of {@link Writer} may support different + * vendor-specific {@link Option} types, and are free to ignore the set + * option (unless it is a {@link RequiredOption}). + * <p> + * It is undefined if setting multiple values for the same (equal) option + * are accumulative or overriding. + * + * @param <V> The type of the {@link Option} value + * @param option Option to set + * @param value Value to set for option + * @return A builder with the given option set + */ + <V> Buildable option(Option<V> option, V value); + +} http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedSource.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedSource.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedSource.java index 3070427..007777e 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedSource.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedSource.java @@ -8,7 +8,7 @@ import org.apache.commons.rdf.api.TripleLike; import org.apache.commons.rdf.api.io.Option; import org.apache.commons.rdf.api.io.WriterSource; -public interface NeedSource extends _Buildable { +public interface NeedSource extends Buildable { NeedSource build(); <V> NeedSource option(Option<V> option, V value); http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedTarget.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedTarget.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedTarget.java index 2148b54..2f245d8 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedTarget.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/NeedTarget.java @@ -23,7 +23,7 @@ import java.nio.file.Path; import org.apache.commons.rdf.api.io.Option; import org.apache.commons.rdf.api.io.WriterTarget; -public interface NeedTarget extends _Buildable { +public interface NeedTarget extends Buildable { @Override NeedTarget build(); <V> NeedTarget option(Option<V> option, V value); http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Sync.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Sync.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Sync.java index f6d8afc..af2ba05 100644 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Sync.java +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/Sync.java @@ -5,7 +5,7 @@ import java.util.concurrent.ExecutorService; import org.apache.commons.rdf.api.io.Option; import org.apache.commons.rdf.api.io.Written; -public interface Sync extends _Buildable { +public interface Sync extends Buildable { Sync build(); <V> Sync option(Option<V> option, V value); http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/_Buildable.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/_Buildable.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/_Buildable.java deleted file mode 100644 index 95c4c7b..0000000 --- a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/fluentwriter/_Buildable.java +++ /dev/null @@ -1,49 +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.fluentwriter; - -import org.apache.commons.rdf.api.io.Option; -import org.apache.commons.rdf.api.io.Option.RequiredOption; - -interface _Buildable { - /** - * Return an immutable builder at the current state. The returned builder - * can be re-used multiple times in a thread-safe way. - * - * @return An immutable builder - */ - _Buildable build(); - - /** - * Return a builder with the given option set. - * <p> - * Note that implementations of {@link Writer} may support different - * vendor-specific {@link Option} types, and are free to ignore the set - * option (unless it is a {@link RequiredOption}). - * <p> - * It is undefined if setting multiple values for the same (equal) option - * are accumulative or overriding. - * - * @param <V> The type of the {@link Option} value - * @param option Option to set - * @param value Value to set for option - * @return A builder with the given option set - */ - <V> _Buildable option(Option<V> option, V value); - -} http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/MutableWriterConfig.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/MutableWriterConfig.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/MutableWriterConfig.java new file mode 100644 index 0000000..96df0ee --- /dev/null +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/MutableWriterConfig.java @@ -0,0 +1,103 @@ +/* + * 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.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.rdf.api.RDF; +import org.apache.commons.rdf.api.RDFSyntax; + +final class MutableWriterConfig implements Cloneable, Serializable, WriterConfig { + private static final long serialVersionUID = 1L; + private RDF rdf = null; + private RDFSyntax syntax = null; + private WriterSource source = null; + private WriterTarget target = null; + @SuppressWarnings("rawtypes") + private final Map<Option, Object> options = new HashMap<>(); + + public MutableWriterConfig() { + } + + public MutableWriterConfig(WriterConfig old) { + rdf = old.rdf().orElse(null); + syntax = old.syntax().orElse(null); + source = old.source().orElse(null); + target = old.target().orElse(null); + options.putAll(old.options()); + } + + @Override + protected Object clone() { + return new MutableWriterConfig(this); + } + + @Override + public Optional<WriterSource> source() { + return Optional.ofNullable(source); + } + + @Override + public Optional<WriterTarget> target() { + return Optional.ofNullable(target); + } + + @Override + public Optional<RDFSyntax> syntax() { + return Optional.ofNullable(syntax); + } + + @Override + public Optional<RDF> rdf() { + return Optional.ofNullable(rdf); + } + + @SuppressWarnings("rawtypes") + @Override + public Map<Option, Object> options() { + return options; + } + + public WriterConfig withSyntax(RDFSyntax syntax) { + this.syntax = syntax; + return this; + } + + public WriterConfig withSource(WriterSource source) { + this.source = source; + return this; + } + + public WriterConfig withTarget(WriterTarget target) { + this.target = target; + return this; + } + + public WriterConfig withRDF(RDF rdf) { + this.rdf = rdf; + return this; + } + + public <V> WriterConfig withOption(Option<V> o, V v) { + this.options.put(o, v); + return this; + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/NullWriterConfig.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/NullWriterConfig.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/NullWriterConfig.java new file mode 100644 index 0000000..e26cfaf --- /dev/null +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/NullWriterConfig.java @@ -0,0 +1,252 @@ +/* + * 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.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutorService; + +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.WriterConfig.ImmutableWriterConfig; + +class NullWriterConfig implements ImmutableWriterConfig, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public Optional<WriterSource> source() { + return Optional.empty(); + } + + @Override + public Optional<WriterTarget> target() { + return Optional.empty(); + } + + @Override + public Optional<RDFSyntax> syntax() { + return Optional.empty(); + } + + @Override + public Optional<RDF> rdf() { + return Optional.empty(); + } + + @SuppressWarnings("rawtypes") + @Override + public Map<Option, Object> options() { + return Collections.emptyMap(); + } + + @Override + public WriterConfig withSyntax(RDFSyntax syntax) { + return new WithSyntax(this, syntax); + } + + @Override + public WriterConfig withSource(WriterSource source) { + return new WithSource(this, source); + } + + @Override + public WriterConfig withTarget(WriterTarget target) { + return new WithTarget(this, target); + } + + @Override + public WriterConfig withRDF(RDF rdf) { + return new WithRDF(this, rdf); + } + + @Override + public <V> WriterConfig withOption(Option<V> o, V v) { + return new WithOption(this, o, v); + } + + static class WithParent extends NullWriterConfig implements ImmutableWriterConfig { + private final ImmutableWriterConfig parent; + + WithParent(ImmutableWriterConfig parent) { + this.parent = parent; + } + + @Override + public Optional<WriterSource> source() { + return parent.source(); + } + + @Override + public Optional<WriterTarget> target() { + return parent.target(); + } + + @Override + public Optional<RDFSyntax> syntax() { + return parent.syntax(); + } + + @Override + public Optional<RDF> rdf() { + return parent.rdf(); + } + + @Override + public Map<Option, Object> options() { + return parent.options(); + } + } + + static final class WithSyntax extends WithParent implements WriterConfig { + private final RDFSyntax syntax; + + public WithSyntax(ImmutableWriterConfig parent, RDFSyntax syntax) { + super(parent); + this.syntax = syntax; + } + + @Override + public Optional<RDFSyntax> syntax() { + return Optional.ofNullable(syntax); + } + } + + static final class WithSource extends WithParent implements WriterConfig { + private final WriterSource source; + + public WithSource(ImmutableWriterConfig parent, WriterSource source) { + super(parent); + this.source = source; + } + + @Override + public Optional<WriterSource> source() { + return Optional.ofNullable(source); + } + } + + static class WithTarget extends WithParent implements WriterConfig { + private final WriterTarget target; + + public WithTarget(ImmutableWriterConfig parent, WriterTarget target) { + super(parent); + this.target = target; + } + + @Override + public Optional<WriterTarget> target() { + return Optional.ofNullable(target); + } + } + + static class WithRDF extends WithParent implements WriterConfig { + private final RDF rdf; + + public WithRDF(ImmutableWriterConfig parent, RDF rdf) { + super(parent); + this.rdf = rdf; + } + @Override + public Optional<RDF> rdf() { + return Optional.ofNullable(rdf); + } + + } + + static class WithOption extends WithParent implements WriterConfig { + private Option o; + private Object v; + public <V> WithOption(ImmutableWriterConfig parent, Option<V> o, V v) { + super(parent); + this.o = o; + this.v = v; + } + @Override + public Map<Option, Object> options() { + // Add to parent options + Map<Option, Object> options = super.options(); + if (v == null) { + options.remove(o); + } else { + options.put(o, v); + } + return options; + } + } + + @SuppressWarnings("rawtypes") + final static class SnapshotWriterConfig extends NullWriterConfig { + private static final long serialVersionUID = 1L; + private final RDF rdf; + private final RDFSyntax syntax; + private final WriterSource source; + private final WriterTarget target; + private final Map<Option, Object> options; + + SnapshotWriterConfig(WriterConfig old) { + this( + old.rdf().orElse(null), + old.syntax().orElse(null), + old.source().orElse(null), + old.target().orElse(null), + old.options(), + null); + } + + SnapshotWriterConfig(RDF rdf, RDFSyntax syntax, WriterSource source, WriterTarget target, Map<Option, Object> options, + ExecutorService executor) { + this.rdf = rdf; + this.syntax = syntax; + this.source = source; + this.target = target; + // We'll make a copy + this.options = Collections.unmodifiableMap(new HashMap<Option, Object>(options)); + } + + @Override + public Optional<WriterSource> source() { + return Optional.ofNullable(source); + } + + @Override + public Optional<WriterTarget> target() { + return Optional.ofNullable(target); + } + + @Override + public Optional<RDFSyntax> syntax() { + return Optional.ofNullable(syntax); + } + + @Override + public Optional<RDF> rdf() { + return Optional.ofNullable(rdf); + } + + @Override + public Map<Option, Object> options() { + // return a mutable copy so our children can build on it + return new HashMap<Option,Object>(options); + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Writer.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Writer.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Writer.java new file mode 100644 index 0000000..5267e97 --- /dev/null +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/Writer.java @@ -0,0 +1,54 @@ +/* + * 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.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public interface Writer { + + @SuppressWarnings("rawtypes") + Written write(WriterConfig config); + +// @SuppressWarnings("rawtypes") +// default Future<Parsed> writeAsync(ParserConfig config) { +// return new DefaultAsyncWriter(this, config).submit(); +// } + +// class DefaultAsyncParser { +// private static final ThreadGroup THEAD_GROUP = new ThreadGroup("Commons RDF async writer"); +// private static final ExecutorService DEFAULT_EXECUTOR = Executors +// .newCachedThreadPool(r -> new Thread(THEAD_GROUP, r)); +// +// private final Writer syncWriter; +// private final WriterConfig config; +// +// DefaultAsyncParser(Writer writer, WriterConfig config) { +// this.syncWriter = writer; +// this.config = config.asImmutableConfig(); +// } +// +// Written write() { +// return syncWriter.write(config); +// } +// +// Future<Parsed> submit() { +// return DEFAULT_EXECUTOR.submit(this::write); +// } +// } +} http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/5f1c7814/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/WriterConfig.java ---------------------------------------------------------------------- diff --git a/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/WriterConfig.java b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/WriterConfig.java new file mode 100644 index 0000000..bbe781f --- /dev/null +++ b/commons-rdf-api/src/main/java/org/apache/commons/rdf/api/io/WriterConfig.java @@ -0,0 +1,68 @@ +/* + * 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.Serializable; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.rdf.api.RDF; +import org.apache.commons.rdf.api.RDFSyntax; +import org.apache.commons.rdf.api.io.NullWriterConfig.SnapshotWriterConfig; + +@SuppressWarnings("rawtypes") +public interface WriterConfig { + Optional<WriterSource> source(); + Optional<WriterTarget> target(); + Optional<RDFSyntax> syntax(); + Optional<RDF> rdf(); + Map<Option, Object> options(); + + WriterConfig withSyntax(RDFSyntax syntax); + WriterConfig withSource(WriterSource source); + WriterConfig withTarget(WriterTarget target); + WriterConfig withRDF(RDF rdf); + + <V> WriterConfig withOption(Option<V> o, V v); + + static WriterConfig immutable() { + return new NullWriterConfig(); + } + + static WriterConfig mutable() { + return new MutableWriterConfig(); + } + + default WriterConfig asMutableConfig() { + if (this instanceof MutableWriterConfig) { + return this; + } else { + return new MutableWriterConfig(this); + } + } + + default ImmutableWriterConfig asImmutableConfig() { + if (this instanceof ImmutableWriterConfig) { + return (ImmutableWriterConfig) this; + } else { + return new SnapshotWriterConfig(this); + } + } + + interface ImmutableWriterConfig extends WriterConfig, Serializable {} + +}