This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new fb78f68f Add AbstractStreamBuilder.setOpenOptions(OpenOption...) fb78f68f is described below commit fb78f68fc4edae1290f609b9ade0cba0cee52d6f Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Fri May 19 17:28:39 2023 -0400 Add AbstractStreamBuilder.setOpenOptions(OpenOption...) --- src/changes/changes.xml | 3 + .../apache/commons/io/build/AbstractOrigin.java | 4 +- .../commons/io/build/AbstractStreamBuilder.java | 74 ++++++++++++++++++++++ .../apache/commons/io/input/BOMInputStream.java | 8 +-- .../input/MessageDigestCalculatingInputStream.java | 8 +-- .../commons/io/input/ReadAheadInputStream.java | 8 +-- .../io/input/UncheckedFilterInputStream.java | 8 +-- .../input/UnsynchronizedBufferedInputStream.java | 8 +-- .../io/input/UnsynchronizedFilterInputStream.java | 8 +-- .../apache/commons/io/input/XmlStreamReader.java | 10 ++- .../io/output/UncheckedFilterOutputStream.java | 8 +-- .../commons/io/output/UncheckedFilterWriter.java | 9 +-- .../commons/io/output/WriterOutputStream.java | 8 +-- .../apache/commons/io/output/XmlStreamWriter.java | 8 +-- .../input/BufferedFileChannelInputStreamTest.java | 4 +- .../io/input/RandomAccessFileInputStreamTest.java | 24 +++++-- .../commons/io/input/ReadAheadInputStreamTest.java | 4 +- .../commons/io/input/XmlStreamReaderTest.java | 11 ++++ .../commons/io/output/WriterOutputStreamTest.java | 2 + 19 files changed, 152 insertions(+), 65 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 02eb6b01..25df6a24 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -56,6 +56,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="fix" due-to="Gary Gregory"> Add CharSequenceInputStream.Builder. </action> + <action dev="ggregory" type="fix" due-to="Gary Gregory"> + Add AbstractStreamBuilder.setOpenOptions(OpenOption...). + </action> <!-- UPDATE --> </release> <release version="2.12.0" date="2023-05-13" description="Java 8 required."> diff --git a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java index eadbb246..d2749b0e 100644 --- a/src/main/java/org/apache/commons/io/build/AbstractOrigin.java +++ b/src/main/java/org/apache/commons/io/build/AbstractOrigin.java @@ -293,7 +293,7 @@ public abstract class AbstractOrigin<T, B extends AbstractOrigin<T, B>> extends * @throws UnsupportedOperationException if this method is not implemented in a concrete subclass. */ public File getFile() { - throw new UnsupportedOperationException(origin.toString()); + throw new UnsupportedOperationException("getFile() from " + origin.toString()); } /** @@ -327,7 +327,7 @@ public abstract class AbstractOrigin<T, B extends AbstractOrigin<T, B>> extends * @throws UnsupportedOperationException if this method is not implemented in a concrete subclass. */ public Path getPath() { - throw new UnsupportedOperationException(origin.toString()); + throw new UnsupportedOperationException("getPath() from " + origin.toString()); } /** diff --git a/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java b/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java index e938b7eb..3c34689f 100644 --- a/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java +++ b/src/main/java/org/apache/commons/io/build/AbstractStreamBuilder.java @@ -17,10 +17,16 @@ package org.apache.commons.io.build; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; import java.nio.charset.Charset; +import java.nio.file.OpenOption; import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.file.PathUtils; /** * Abstracts building a typed instance of {@code T}. @@ -31,6 +37,8 @@ import org.apache.commons.io.IOUtils; */ public abstract class AbstractStreamBuilder<T, B extends AbstractStreamBuilder<T, B>> extends AbstractOriginSupplier<T, B> { + private static final OpenOption[] DEFAULT_OPEN_OPTIONS = PathUtils.EMPTY_OPEN_OPTION_ARRAY; + /** * The buffer size, defaults to {@link IOUtils#DEFAULT_BUFFER_SIZE} ({@value IOUtils#DEFAULT_BUFFER_SIZE}). */ @@ -51,6 +59,8 @@ public abstract class AbstractStreamBuilder<T, B extends AbstractStreamBuilder<T */ private Charset charsetDefault = Charset.defaultCharset(); + private OpenOption[] openOptions = DEFAULT_OPEN_OPTIONS; + /** * Gets the buffer size, defaults to {@link IOUtils#DEFAULT_BUFFER_SIZE} ({@value IOUtils#DEFAULT_BUFFER_SIZE}). * @@ -87,6 +97,49 @@ public abstract class AbstractStreamBuilder<T, B extends AbstractStreamBuilder<T return charsetDefault; } + /** + * Gets an input stream from the origin with open options. + * + * @return An input stream + * @throws IOException if an I/O error occurs. + * @throws UnsupportedOperationException if the origin cannot be converted to an InputStream. + * @see AbstractOrigin#getInputStream(OpenOption...) + * @since 2.13.0 + */ + protected InputStream getInputStream() throws IOException { + return getOrigin().getInputStream(getOpenOptions()); + } + + protected OpenOption[] getOpenOptions() { + return openOptions; + } + + /** + * Gets an output stream from the origin with open options. + * + * @return An input stream + * @throws IOException if an I/O error occurs. + * @throws UnsupportedOperationException if the origin cannot be converted to an OututStream. + * @see AbstractOrigin#getOutputStream(OpenOption...) + * @since 2.13.0 + */ + protected OutputStream getOutputStream() throws IOException { + return getOrigin().getOutputStream(getOpenOptions()); + } + + /** + * Gets an writer from the origin with open options. + * + * @return An writer. + * @throws IOException if an I/O error occurs. + * @throws UnsupportedOperationException if the origin cannot be converted to a Writer. + * @see AbstractOrigin#getOutputStream(OpenOption...) + * @since 2.13.0 + */ + protected Writer getWriter() throws IOException { + return getOrigin().getWriter(getCharset(), getOpenOptions()); + } + /** * Sets the buffer size. * <p> @@ -169,4 +222,25 @@ public abstract class AbstractStreamBuilder<T, B extends AbstractStreamBuilder<T this.charsetDefault = defaultCharset; return asThis(); } + + /** + * Sets the OpenOption[]. + * <p> + * Normally used with InputStream, OutputStream, and Writer. + * </p> + * <p> + * Subclasses may ignore this setting. + * </p> + * + * @param openOptions the OpenOption[] name, null resets to the default. + * @return this. + * @since 2.13.0 + * @see #setInputStream(InputStream) + * @see #setOutputStream(OutputStream) + * @see #setWriter(Writer) + */ + public B setOpenOptions(final OpenOption... openOptions) { + this.openOptions = openOptions != null ? openOptions : DEFAULT_OPEN_OPTIONS; + return asThis(); + } } diff --git a/src/main/java/org/apache/commons/io/input/BOMInputStream.java b/src/main/java/org/apache/commons/io/input/BOMInputStream.java index d6dedd62..abc528ee 100644 --- a/src/main/java/org/apache/commons/io/input/BOMInputStream.java +++ b/src/main/java/org/apache/commons/io/input/BOMInputStream.java @@ -20,7 +20,6 @@ import static org.apache.commons.io.IOUtils.EOF; import java.io.IOException; import java.io.InputStream; -import java.nio.file.OpenOption; import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -28,7 +27,6 @@ import java.util.Objects; import org.apache.commons.io.ByteOrderMark; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; /** @@ -136,7 +134,7 @@ public class BOMInputStream extends ProxyInputStream { /** * Constructs a new instance. * <p> - * This builder use the aspects InputStream, include, and ByteOrderMark[]. + * This builder use the aspects InputStream, OpenOption[], include, and ByteOrderMark[]. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -145,12 +143,12 @@ public class BOMInputStream extends ProxyInputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") @Override public BOMInputStream get() throws IOException { - return new BOMInputStream(getOrigin().getInputStream(), include, byteOrderMarks); + return new BOMInputStream(getInputStream(), include, byteOrderMarks); } /** diff --git a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java index 581da635..0ee92f7c 100644 --- a/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java +++ b/src/main/java/org/apache/commons/io/input/MessageDigestCalculatingInputStream.java @@ -18,12 +18,10 @@ package org.apache.commons.io.input; import java.io.IOException; import java.io.InputStream; -import java.nio.file.OpenOption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Provider; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; /** @@ -75,7 +73,7 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream { /** * Constructs a new instance. * <p> - * This builder use the aspects InputStream and MessageDigest. + * This builder use the aspects InputStream, OpenOption[], and MessageDigest. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -84,12 +82,12 @@ public class MessageDigestCalculatingInputStream extends ObservableInputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") @Override public MessageDigestCalculatingInputStream get() throws IOException { - return new MessageDigestCalculatingInputStream(getOrigin().getInputStream(), messageDigest); + return new MessageDigestCalculatingInputStream(getInputStream(), messageDigest); } /** diff --git a/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java b/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java index bad740c3..d4790ba4 100644 --- a/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java +++ b/src/main/java/org/apache/commons/io/input/ReadAheadInputStream.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; import java.nio.ByteBuffer; -import java.nio.file.OpenOption; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -31,7 +30,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; /** @@ -71,7 +69,7 @@ public class ReadAheadInputStream extends FilterInputStream { /** * Constructs a new instance. * <p> - * This builder use the aspects InputStream, buffer size, ExecutorService. + * This builder use the aspects InputStream, OpenOption[], buffer size, ExecutorService. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -80,12 +78,12 @@ public class ReadAheadInputStream extends FilterInputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") @Override public ReadAheadInputStream get() throws IOException { - return new ReadAheadInputStream(getOrigin().getInputStream(), getBufferSize(), executorService != null ? executorService : newExecutorService(), + return new ReadAheadInputStream(getInputStream(), getBufferSize(), executorService != null ? executorService : newExecutorService(), executorService == null); } diff --git a/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java b/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java index 05414782..58609c10 100644 --- a/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java +++ b/src/main/java/org/apache/commons/io/input/UncheckedFilterInputStream.java @@ -22,9 +22,7 @@ import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; -import java.nio.file.OpenOption; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.function.Uncheck; @@ -65,7 +63,7 @@ public final class UncheckedFilterInputStream extends FilterInputStream { /** * Constructs a new instance. * <p> - * This builder use the aspect InputStream. + * This builder use the aspect InputStream and OpenOption[]. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -74,12 +72,12 @@ public final class UncheckedFilterInputStream extends FilterInputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @Override public UncheckedFilterInputStream get() { // This an unchecked class, so this method is as well. - return Uncheck.get(() -> new UncheckedFilterInputStream(getOrigin().getInputStream())); + return Uncheck.get(() -> new UncheckedFilterInputStream(getInputStream())); } } diff --git a/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java b/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java index 1034609c..ffd456df 100644 --- a/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java +++ b/src/main/java/org/apache/commons/io/input/UnsynchronizedBufferedInputStream.java @@ -20,10 +20,8 @@ package org.apache.commons.io.input; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.file.OpenOption; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; /** @@ -82,7 +80,7 @@ public final class UnsynchronizedBufferedInputStream extends UnsynchronizedFilte /** * Constructs a new instance. * <p> - * This builder use the aspects InputStream and buffer size. + * This builder use the aspects InputStream, OpenOption[] and buffer size. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -91,12 +89,12 @@ public final class UnsynchronizedBufferedInputStream extends UnsynchronizedFilte * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") // Caller closes. @Override public UnsynchronizedBufferedInputStream get() throws IOException { - return new UnsynchronizedBufferedInputStream(getOrigin().getInputStream(), getBufferSize()); + return new UnsynchronizedBufferedInputStream(getInputStream(), getBufferSize()); } } diff --git a/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java b/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java index 698f42d8..0465cd6b 100644 --- a/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java +++ b/src/main/java/org/apache/commons/io/input/UnsynchronizedFilterInputStream.java @@ -20,9 +20,7 @@ package org.apache.commons.io.input; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.file.OpenOption; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; /** @@ -69,7 +67,7 @@ public class UnsynchronizedFilterInputStream extends InputStream { /** * Constructs a new instance. * <p> - * This builder use the aspect InputStream. + * This builder use the aspect InputStream and OpenOption[]. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -78,12 +76,12 @@ public class UnsynchronizedFilterInputStream extends InputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an InputStream. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") // Caller closes. @Override public UnsynchronizedFilterInputStream get() throws IOException { - return new UnsynchronizedFilterInputStream(getOrigin().getInputStream()); + return new UnsynchronizedFilterInputStream(getInputStream()); } } diff --git a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java index 251375d9..2e2f0f42 100644 --- a/src/main/java/org/apache/commons/io/input/XmlStreamReader.java +++ b/src/main/java/org/apache/commons/io/input/XmlStreamReader.java @@ -30,7 +30,6 @@ import java.net.URLConnection; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.nio.file.OpenOption; import java.nio.file.Path; import java.text.MessageFormat; import java.util.Locale; @@ -41,7 +40,6 @@ import java.util.regex.Pattern; import org.apache.commons.io.ByteOrderMark; import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.function.IOConsumer; import org.apache.commons.io.output.XmlStreamWriter; @@ -123,7 +121,7 @@ public class XmlStreamReader extends Reader { /** * Constructs a new instance. * <p> - * This builder use the aspect InputStream, httpContentType, lenient, and defaultEncoding. + * This builder use the aspect InputStream, OpenOption[], httpContentType, lenient, and defaultEncoding. * </p> * <p> * You must provide an origin that can be converted to an InputStream by this builder, otherwise, this call will throw an @@ -134,7 +132,7 @@ public class XmlStreamReader extends Reader { * @throws UnsupportedOperationException if the origin cannot provide an InputStream. * @throws IOException thrown if there is a problem reading the stream. * @throws XmlStreamReaderException thrown if the charset encoding could not be determined according to the specification. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getInputStream() */ @SuppressWarnings("resource") @Override @@ -142,8 +140,8 @@ public class XmlStreamReader extends Reader { final String defaultEncoding = nullCharset ? null : getCharset().name(); // @formatter:off return httpContentType == null - ? new XmlStreamReader(getOrigin().getInputStream(), lenient, defaultEncoding) - : new XmlStreamReader(getOrigin().getInputStream(), httpContentType, lenient, defaultEncoding); + ? new XmlStreamReader(getInputStream(), lenient, defaultEncoding) + : new XmlStreamReader(getInputStream(), httpContentType, lenient, defaultEncoding); // @formatter:on } diff --git a/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java b/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java index 3a0978ca..c1e9b7ae 100644 --- a/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java +++ b/src/main/java/org/apache/commons/io/output/UncheckedFilterOutputStream.java @@ -21,9 +21,7 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UncheckedIOException; -import java.nio.file.OpenOption; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.function.Uncheck; @@ -64,7 +62,7 @@ public final class UncheckedFilterOutputStream extends FilterOutputStream { /** * Constructs a new instance. * <p> - * This builder use the aspect OutputStream. + * This builder use the aspect OutputStream and OpenOption[]. * </p> * <p> * You must provide an origin that can be converted to an OutputStream by this builder, otherwise, this call will throw an @@ -73,12 +71,12 @@ public final class UncheckedFilterOutputStream extends FilterOutputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an OutputStream. - * @see AbstractOrigin#getOutputStream(OpenOption...) + * @see #getOutputStream() */ @SuppressWarnings("resource") @Override public UncheckedFilterOutputStream get() throws IOException { - return new UncheckedFilterOutputStream(getOrigin().getOutputStream()); + return new UncheckedFilterOutputStream(getOutputStream()); } } diff --git a/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java b/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java index 45c7f83a..14a98226 100644 --- a/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java +++ b/src/main/java/org/apache/commons/io/output/UncheckedFilterWriter.java @@ -21,10 +21,7 @@ import java.io.FilterWriter; import java.io.IOException; import java.io.UncheckedIOException; import java.io.Writer; -import java.nio.charset.Charset; -import java.nio.file.OpenOption; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.function.Uncheck; @@ -65,7 +62,7 @@ public final class UncheckedFilterWriter extends FilterWriter { /** * Constructs a new instance. * <p> - * This builder use the aspects Writer and Charset. + * This builder use the aspects Writer, OpenOption[], and Charset. * </p> * <p> * You must provide an origin that can be converted to a Writer by this builder, otherwise, this call will throw an @@ -74,12 +71,12 @@ public final class UncheckedFilterWriter extends FilterWriter { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide a Writer. - * @see AbstractOrigin#getWriter(Charset, OpenOption...) + * @see #getWriter() */ @SuppressWarnings("resource") @Override public UncheckedFilterWriter get() throws IOException { - return new UncheckedFilterWriter(getOrigin().getWriter(getCharset())); + return new UncheckedFilterWriter(getWriter()); } } diff --git a/src/main/java/org/apache/commons/io/output/WriterOutputStream.java b/src/main/java/org/apache/commons/io/output/WriterOutputStream.java index c1456785..8e67fc96 100644 --- a/src/main/java/org/apache/commons/io/output/WriterOutputStream.java +++ b/src/main/java/org/apache/commons/io/output/WriterOutputStream.java @@ -26,11 +26,9 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CoderResult; import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; -import java.nio.file.OpenOption; import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.charset.CharsetDecoders; @@ -108,7 +106,7 @@ public class WriterOutputStream extends OutputStream { /** * Constructs a new instance. * <p> - * This builder use the aspect Writer, Charset, CharsetDecoder, buffer size and writeImmediately. + * This builder use the aspect Writer, OpenOption[], Charset, CharsetDecoder, buffer size and writeImmediately. * </p> * <p> * You must provide an origin that can be converted to a Writer by this builder, otherwise, this call will throw an @@ -117,12 +115,12 @@ public class WriterOutputStream extends OutputStream { * * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide a Writer. - * @see AbstractOrigin#getWriter(Charset, OpenOption...) + * @see #getWriter() */ @SuppressWarnings("resource") @Override public WriterOutputStream get() throws IOException { - return new WriterOutputStream(getOrigin().getWriter(getCharset()), charsetDecoder, getBufferSize(), writeImmediately); + return new WriterOutputStream(getWriter(), charsetDecoder, getBufferSize(), writeImmediately); } @Override diff --git a/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java b/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java index 462c6028..53509447 100644 --- a/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java +++ b/src/main/java/org/apache/commons/io/output/XmlStreamWriter.java @@ -26,14 +26,12 @@ import java.io.StringWriter; import java.io.Writer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.nio.file.OpenOption; import java.util.Locale; import java.util.Objects; import java.util.regex.Matcher; import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; -import org.apache.commons.io.build.AbstractOrigin; import org.apache.commons.io.build.AbstractStreamBuilder; import org.apache.commons.io.input.XmlStreamReader; @@ -72,7 +70,7 @@ public class XmlStreamWriter extends Writer { /** * Constructs a new instance. * <p> - * This builder use the aspect OutputStream and Charset. + * This builder use the aspect OutputStream, OpenOption[], and Charset. * </p> * <p> * You must provide an origin that can be converted to an OutputStream by this builder, otherwise, this call will throw an @@ -82,12 +80,12 @@ public class XmlStreamWriter extends Writer { * @return a new instance. * @throws UnsupportedOperationException if the origin cannot provide an OutputStream. * @throws IOException if an I/O error occurs. - * @see AbstractOrigin#getInputStream(OpenOption...) + * @see #getOutputStream() */ @SuppressWarnings("resource") @Override public XmlStreamWriter get() throws IOException { - return new XmlStreamWriter(getOrigin().getOutputStream(), getCharset()); + return new XmlStreamWriter(getOutputStream(), getCharset()); } } diff --git a/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java b/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java index 758d96c3..0a56ae8e 100644 --- a/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/BufferedFileChannelInputStreamTest.java @@ -18,6 +18,7 @@ package org.apache.commons.io.input; import java.io.IOException; import java.io.InputStream; +import java.nio.file.StandardOpenOption; import org.junit.jupiter.api.BeforeEach; @@ -40,7 +41,8 @@ public class BufferedFileChannelInputStreamTest extends AbstractInputStreamTest new BufferedFileChannelInputStream(inputFile, 123), // small, unaligned buffer size BufferedFileChannelInputStream.builder().setPath(inputFile).get(), // default BufferedFileChannelInputStream.builder().setPath(inputFile).setBufferSize(123).get(), // small, unaligned buffer size - BufferedFileChannelInputStream.builder().setURI(inputFile.toUri()).setBufferSize(1024).get() // URI and buffer size + BufferedFileChannelInputStream.builder().setURI(inputFile.toUri()).setBufferSize(1024).get(), // URI and buffer size + BufferedFileChannelInputStream.builder().setPath(inputFile).setOpenOptions(StandardOpenOption.READ).get(), // open options }; //@formatter:on } diff --git a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java index 51ab0409..80137c9d 100644 --- a/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/RandomAccessFileInputStreamTest.java @@ -29,18 +29,21 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import org.apache.commons.io.RandomAccessFileMode; import org.junit.jupiter.api.Test; public class RandomAccessFileInputStreamTest { - private static final String DATA_FILE = "src/test/resources/org/apache/commons/io/test-file-iso8859-1.bin"; + private static final String DATA_FILE_NAME = "src/test/resources/org/apache/commons/io/test-file-iso8859-1.bin"; + private static final Path DATA_PATH = Paths.get(DATA_FILE_NAME); private static final int DATA_FILE_LEN = 1430; private RandomAccessFile createRandomAccessFile() throws FileNotFoundException { - return RandomAccessFileMode.READ_ONLY.create(DATA_FILE); + return RandomAccessFileMode.READ_ONLY.create(DATA_FILE_NAME); } @Test @@ -63,7 +66,7 @@ public class RandomAccessFileInputStreamTest { @Test public void testBuilderFile() throws IOException { try (RandomAccessFile file = createRandomAccessFile()) { - try (RandomAccessFileInputStream inputStream = RandomAccessFileInputStream.builder().setFile(new File(DATA_FILE)).get()) { + try (RandomAccessFileInputStream inputStream = RandomAccessFileInputStream.builder().setFile(new File(DATA_FILE_NAME)).get()) { assertFalse(inputStream.isCloseOnClose()); assertNotEquals(-1, inputStream.getRandomAccessFile().read()); } @@ -75,7 +78,20 @@ public class RandomAccessFileInputStreamTest { @Test public void testBuilderPath() throws IOException { try (RandomAccessFile file = createRandomAccessFile()) { - try (RandomAccessFileInputStream inputStream = RandomAccessFileInputStream.builder().setPath(Paths.get(DATA_FILE)).get()) { + try (RandomAccessFileInputStream inputStream = RandomAccessFileInputStream.builder().setPath(DATA_PATH).get()) { + assertFalse(inputStream.isCloseOnClose()); + assertNotEquals(-1, inputStream.getRandomAccessFile().read()); + } + file.read(); + } + } + + @SuppressWarnings("resource") // instance variable access + @Test + public void testBuilderPathOpenOptions() throws IOException { + try (RandomAccessFile file = createRandomAccessFile()) { + try (RandomAccessFileInputStream inputStream = RandomAccessFileInputStream.builder().setPath(DATA_PATH).setOpenOptions(StandardOpenOption.READ) + .get()) { assertFalse(inputStream.isCloseOnClose()); assertNotEquals(-1, inputStream.getRandomAccessFile().read()); } diff --git a/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java index 125a8681..959932cb 100644 --- a/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/ReadAheadInputStreamTest.java @@ -18,6 +18,7 @@ package org.apache.commons.io.input; import java.io.IOException; import java.io.InputStream; +import java.nio.file.StandardOpenOption; import org.junit.jupiter.api.BeforeEach; @@ -54,6 +55,7 @@ public class ReadAheadInputStreamTest extends AbstractInputStreamTest { // Tests unaligned buffers, wrapped bigger than outer. ReadAheadInputStream.builder().setInputStream(new BufferedFileChannelInputStream(inputFile, 321)).setBufferSize(123).get(), // Tests unaligned buffers, wrapped smaller than outer. - ReadAheadInputStream.builder().setInputStream(new BufferedFileChannelInputStream(inputFile, 123)).setBufferSize(321).get() }; + ReadAheadInputStream.builder().setInputStream(new BufferedFileChannelInputStream(inputFile, 123)).setBufferSize(321).get(), + ReadAheadInputStream.builder().setPath(inputFile).setOpenOptions(StandardOpenOption.READ).get() }; } } diff --git a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java index 8af91b01..e57da885 100644 --- a/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java +++ b/src/test/java/org/apache/commons/io/input/XmlStreamReaderTest.java @@ -34,6 +34,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.text.MessageFormat; import java.util.HashMap; import java.util.Map; @@ -204,6 +205,16 @@ public class XmlStreamReaderTest { } } + @Test + protected void testConstructorFileInputOpenOptions() throws IOException { + try (XmlStreamReader reader = new XmlStreamReader(new File("pom.xml"))) { + // do nothing + } + try (XmlStreamReader reader = XmlStreamReader.builder().setFile("pom.xml").setOpenOptions(StandardOpenOption.READ).get()) { + // do nothing + } + } + @Test protected void testConstructorFileInputNull() { assertThrows(NullPointerException.class, () -> new XmlStreamReader((File) null)); diff --git a/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java b/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java index 8125fed4..10aad5f0 100644 --- a/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java +++ b/src/test/java/org/apache/commons/io/output/WriterOutputStreamTest.java @@ -24,6 +24,7 @@ import java.io.StringWriter; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.StandardCharsets; +import java.nio.file.StandardOpenOption; import java.util.Random; import org.apache.commons.io.Charsets; @@ -219,6 +220,7 @@ public class WriterOutputStreamTest { .setCharset("us-ascii") .setBufferSize(1024) .setWriteImmediately(true) + .setOpenOptions(StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE) .get()) { // @formatter:on out.write("abc".getBytes(StandardCharsets.US_ASCII));