This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit a5cb0d05680cd62201d58669e8460b1b6d1d6595 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Sun Sep 17 16:32:14 2023 +0200 `ChannelDataOutput` implements `DataOutput` for allowing `instanceof` checks against a public interface. --- .../apache/sis/io/stream/ChannelDataOutput.java | 114 +++++++++++++++++++-- .../sis/io/stream/ChannelImageOutputStream.java | 85 +-------------- .../org/apache/sis/storage/StorageConnector.java | 14 +-- .../sis/io/stream/ChannelDataOutputTest.java | 91 +++++----------- .../io/stream/ChannelImageOutputStreamTest.java | 18 +--- 5 files changed, 142 insertions(+), 180 deletions(-) diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelDataOutput.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelDataOutput.java index 31e17058bb..ccf2e6701e 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelDataOutput.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelDataOutput.java @@ -17,10 +17,12 @@ package org.apache.sis.io.stream; import java.util.Arrays; +import java.io.DataOutput; import java.io.Flushable; import java.io.IOException; import java.nio.Buffer; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.CharBuffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; @@ -29,6 +31,7 @@ import java.nio.LongBuffer; import java.nio.ShortBuffer; import java.nio.channels.SeekableByteChannel; import java.nio.channels.WritableByteChannel; +import java.nio.charset.StandardCharsets; import org.apache.sis.util.internal.Numerics; import org.apache.sis.storage.internal.Resources; @@ -50,18 +53,15 @@ import static org.apache.sis.util.ArgumentChecks.ensureBetween; * <p>Since this class is only a helper tool, it does not "own" the channel and consequently does not provide * {@code close()} method. It is users responsibility to close the channel after usage.</p> * - * <h2>Relationship with {@code DataOutput}</h2> - * This class API is compatibly with the {@link java.io.DataOutput} interface, so subclasses can implement that - * interface if they wish. This class does not implement {@code DataOutput} itself because it is not needed for - * SIS purposes. - * However, the {@link ChannelImageOutputStream} class implements the {@code DataOutput} interface, together with - * the {@link javax.imageio.stream.ImageOutputStream} one, mostly for situations when inter-operability with - * {@link javax.imageio} is needed. + * <h2>Relationship with {@code ImageOutputStream}</h2> + * This class API is compatibly with the {@link javax.imageio.stream.ImageOutputStream} interface, so subclasses + * can implement that interface if they wish. This class does not implement {@code ImageOutputStream} because it + * is not needed for SIS purposes. * * @author Rémi Maréchal (Geomatys) * @author Martin Desruisseaux (Geomatys) */ -public class ChannelDataOutput extends ChannelData implements Flushable { +public class ChannelDataOutput extends ChannelData implements DataOutput, Flushable { /** * The channel where data are written. * This is supplied at construction time. @@ -151,6 +151,8 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * * @param bit the bit to write (rightmost bit). * @throws IOException if an error occurred while creating the data output. + * + * @see #writeBoolean(boolean) */ public final void writeBit(final int bit) throws IOException { writeBits(bit, 1); @@ -207,6 +209,38 @@ public class ChannelDataOutput extends ChannelData implements Flushable { } } + /** + * Writes boolean value (8 bits) into the steam. This method delegates to {@linkplain #writeByte(int)}. + * If boolean {@code v} is {@code true} the byte value 1 is written whereas if boolean is {@code false} + * zero is written. + * + * <p>For writing a single bit, see {@link #writeBit(int)} instead. + * + * @param v boolean to be written. + * @throws IOException if some I/O exception occurs during writing. + * + * @see #writeBit(int) + */ + @Override + public final void writeBoolean(final boolean v) throws IOException { + writeByte(v ? 1 : 0); + } + + /** + * Writes a single byte to the stream at the current position. + * The 24 high-order bits of {@code v} are ignored. + * + * @param v an integer whose lower 8 bits are to be written. + * @throws IOException if some I/O exception occurs during writing. + * + * @deprecated Prefer {@link #writeByte(int)} for readability. + */ + @Override + @Deprecated + public final void write(final int v) throws IOException { + writeByte(v); + } + /** * Writes the 8 low-order bits of {@code v} to the stream. * The 24 high-order bits of {@code v} are ignored. @@ -216,6 +250,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value byte to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeByte(final int value) throws IOException { ensureBufferAccepts(Byte.BYTES); buffer.put((byte) value); @@ -230,6 +265,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value short integer to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeShort(final int value) throws IOException { ensureBufferAccepts(Short.BYTES); buffer.putShort((short) value); @@ -243,6 +279,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value character to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeChar(final int value) throws IOException { ensureBufferAccepts(Character.BYTES); buffer.putChar((char) value); @@ -256,6 +293,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value integer to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeInt(final int value) throws IOException { ensureBufferAccepts(Integer.BYTES); buffer.putInt(value); @@ -269,6 +307,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value long integer to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeLong(final long value) throws IOException { ensureBufferAccepts(Long.BYTES); buffer.putLong(value); @@ -282,6 +321,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value floating point value to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeFloat(final float value) throws IOException { ensureBufferAccepts(Float.BYTES); buffer.putFloat(value); @@ -295,6 +335,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param value double precision floating point value to be written. * @throws IOException if some I/O exception occurs during writing. */ + @Override public final void writeDouble(final double value) throws IOException { ensureBufferAccepts(Double.BYTES); buffer.putDouble(value); @@ -311,6 +352,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param src an array of bytes to be written into stream. * @throws IOException if an error occurred while writing the stream. */ + @Override public final void write(final byte[] src) throws IOException { write(src, 0, src.length); } @@ -413,6 +455,7 @@ public class ChannelDataOutput extends ChannelData implements Flushable { * @param length the number of bytes to write. * @throws IOException if an error occurred while writing the stream. */ + @Override public final void write(final byte[] src, int offset, int length) throws IOException { if (length != 0) { do { @@ -585,6 +628,61 @@ public class ChannelDataOutput extends ChannelData implements Flushable { }.writeFully(Double.BYTES, offset, length); } + /** + * Writes the lower-order byte of each character. The high-order eight bits of each character + * in the string are ignored - this method does <strong>not</strong> applies any encoding. + * + * <p>This method is provided because required by the {@link DataOutput} interface, + * but its usage should generally be avoided.</p> + * + * @param ascii the string to be written. + * @throws IOException if an error occurred while writing the stream. + */ + @Override + public void writeBytes(final String ascii) throws IOException { + final byte[] data = new byte[ascii.length()]; + for (int i=0; i<data.length; i++) { + data[i] = (byte) ascii.charAt(i); + } + write(data); + } + + /** + * Writes all characters from the given text into the stream. + * + * @param text the characters to be written into the stream. + * @throws IOException if an error occurred while writing the stream. + */ + @Override + public final void writeChars(final String text) throws IOException { + writeChars(text.toCharArray()); + } + + /** + * Writes two bytes of length information to the output stream, followed by the modified UTF-8 representation + * of every character in the {@code str} string. Each character is converted to a group of one, two, or three + * bytes, depending on the character code point value. + * + * @param s the string to be written. + * @throws IOException if an error occurred while writing the stream. + */ + @Override + public void writeUTF(final String s) throws IOException { + byte[] data = s.getBytes(StandardCharsets.UTF_8); + if (data.length > Short.MAX_VALUE) { + throw new IllegalArgumentException(Resources.format( + Resources.Keys.ExcessiveStringSize_3, filename, Short.MAX_VALUE, data.length)); + } + final ByteOrder oldOrder = buffer.order(); + buffer.order(ByteOrder.BIG_ENDIAN); + try { + writeShort(data.length); + write(data); + } finally { + buffer.order(oldOrder); + } + } + /** * Repeats the same byte many times. * This method can be used for filling a region of the output stream. diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java index 60061cb5e7..a46152ca96 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java @@ -20,10 +20,8 @@ import java.io.Closeable; import java.io.DataOutput; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.nio.channels.WritableByteChannel; import javax.imageio.stream.ImageOutputStream; -import org.apache.sis.storage.internal.Resources; /** @@ -36,8 +34,7 @@ import org.apache.sis.storage.internal.Resources; * separated. Despite that, the name of this {@code ChannelImageOutputStream} anticipates a future version * which would implement the image I/O interface.</p> * - * <p>{@code DataOutput} methods are defined in this separated class rather than in the parent class - * because some methods are Java 1.0 legacy and should be avoided (e.g. {@link #writeBytes(String)}).</p> + * <p>This class is a place-holder for future development.</p> * * @author Rémi Maréchal (Geomatys) * @author Martin Desruisseaux (Geomatys) @@ -69,86 +66,6 @@ public class ChannelImageOutputStream extends ChannelDataOutput implements DataO super(output.filename, output.channel, output.buffer); } - /** - * Writes a single byte to the stream at the current position. - * The 24 high-order bits of {@code v} are ignored. - * - * @param v an integer whose lower 8 bits are to be written. - * @throws IOException if some I/O exception occurs during writing. - */ - @Override - public final void write(final int v) throws IOException { - writeByte(v); - } - - /** - * Writes boolean value (8 bits) into the steam. This method delegates to {@linkplain #writeByte(int)}. - * If boolean {@code v} is {@code true} the byte value 1 is written whereas if boolean is {@code false} - * zero is written. - * - * @param v boolean to be written. - * @throws IOException if some I/O exception occurs during writing. - */ - @Override - public final void writeBoolean(final boolean v) throws IOException { - writeByte(v ? 1 : 0); - } - - /** - * Writes the lower-order byte of each character. The high-order eight bits of each character - * in the string are ignored - this method does <strong>not</strong> applies any encoding. - * - * <p>This method is provided because required by the {@link DataOutput} interface, but its - * usage should generally be avoided.</p> - * - * @param s the string to be written. - * @throws IOException if an error occurred while writing the stream. - */ - @Override - public void writeBytes(final String s) throws IOException { - final byte[] data = new byte[s.length()]; - for (int i=0; i<data.length; i++) { - data[i] = (byte) s.charAt(i); - } - write(data); - } - - /** - * Writes all characters from the source into the stream. - * - * @param s a String consider as an array of characters to be written into stream. - * @throws IOException if an error occurred while writing the stream. - */ - @Override - public final void writeChars(final String s) throws IOException { - writeChars(s.toCharArray()); - } - - /** - * Writes two bytes of length information to the output stream, followed by the modified UTF-8 representation - * of every character in the {@code str} string. Each character is converted to a group of one, two, or three - * bytes, depending on the character code point value. - * - * @param s the string to be written. - * @throws IOException if an error occurred while writing the stream. - */ - @Override - public void writeUTF(final String s) throws IOException { - byte[] data = s.getBytes("UTF-8"); - if (data.length > Short.MAX_VALUE) { - throw new IllegalArgumentException(Resources.format( - Resources.Keys.ExcessiveStringSize_3, filename, Short.MAX_VALUE, data.length)); - } - final ByteOrder oldOrder = buffer.order(); - buffer.order(ByteOrder.BIG_ENDIAN); - try { - writeShort(data.length); - write(data); - } finally { - buffer.order(oldOrder); - } - } - /** * Closes the {@linkplain #channel}. * diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java index 0be3ca9ad4..eb2f6d4628 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java @@ -67,7 +67,6 @@ import org.apache.sis.io.stream.ChannelFactory; import org.apache.sis.io.stream.ChannelDataInput; import org.apache.sis.io.stream.ChannelDataOutput; import org.apache.sis.io.stream.ChannelImageInputStream; -import org.apache.sis.io.stream.ChannelImageOutputStream; import org.apache.sis.io.stream.InputStreamAdapter; import org.apache.sis.io.stream.RewindableLineReader; import org.apache.sis.io.stream.InternalOptionKey; @@ -1475,18 +1474,13 @@ public class StorageConnector implements Serializable { if (reset(c)) { out = (ChannelDataOutput) c.view; } else { - out = createChannelDataOutput(); // May be null. + out = createChannelDataOutput(); // May be null. This method should not have been invoked before. } final DataOutput asDataOutput; if (out != null) { - c = getView(ChannelDataOutput.class); // May have been added by createChannelDataOutput(…). - if (out instanceof DataOutput) { - asDataOutput = (DataOutput) out; - } else { - asDataOutput = new ChannelImageOutputStream(out); // Upgrade existing instance. - c.view = asDataOutput; - } - views.put(DataOutput.class, c); // Share the same Coupled instance. + asDataOutput = out; + c = getView(ChannelDataOutput.class); // Refresh because may have been added by createChannelDataInput(). + views.put(DataOutput.class, c); // Share the same `Coupled` instance. } else { reset(); try { diff --git a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelDataOutputTest.java b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelDataOutputTest.java index f6ec9c2e12..a7fe682c7c 100644 --- a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelDataOutputTest.java +++ b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelDataOutputTest.java @@ -18,9 +18,7 @@ package org.apache.sis.io.stream; import java.util.Arrays; import java.io.ByteArrayOutputStream; -import java.io.Closeable; import java.io.DataOutput; -import java.io.DataOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; @@ -52,7 +50,7 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { * A stream to use as a reference implementation. Any data written in {@link #testedStream} * will also be written in {@code referenceStream}, for later comparison. */ - DataOutput referenceStream; + ImageOutputStream referenceStream; /** * Byte array which is filled by the {@linkplain #testedStream} implementation during write operations. @@ -65,7 +63,7 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { * <b>Do not write to this stream</b> - this field is kept only for invocation of * {@link ByteArrayOutputStream#toByteArray()}. */ - ByteArrayOutputStream expectedData; + private ByteArrayOutputStream expectedData; /** * Creates a new test case. @@ -83,7 +81,7 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { */ void initialize(final String testName, final int streamLength, final int bufferLength) throws IOException { expectedData = new ByteArrayOutputStream(streamLength); - referenceStream = new DataOutputStream(expectedData); + referenceStream = new MemoryCacheImageOutputStream(expectedData); testedStreamBackingArray = new byte[streamLength]; testedStream = new ChannelDataOutput(testName, new ByteArrayChannel(testedStreamBackingArray, false), ByteBuffer.allocate(bufferLength)); @@ -123,7 +121,7 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { */ final void assertStreamContentEquals() throws IOException { testedStream.flush(); - ((Closeable) referenceStream).close(); + referenceStream.close(); final byte[] expectedArray = expectedData.toByteArray(); assertArrayEquals(expectedArray, Arrays.copyOf(testedStreamBackingArray, expectedArray.length)); } @@ -138,7 +136,7 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { public void testWriteAndSeek() throws IOException { initialize("testWriteAndSeek", STREAM_LENGTH, randomBufferCapacity()); writeInStreams(); - ((Closeable) referenceStream).close(); + referenceStream.close(); final byte[] expectedArray = expectedData.toByteArray(); final int seekRange = expectedArray.length - Long.BYTES; final ByteBuffer arrayView = ByteBuffer.wrap(expectedArray); @@ -238,17 +236,18 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { * @throws IOException should never happen since we read and write in memory only. */ private void writeInStreams() throws IOException { - transferRandomData(testedStream, testedStreamBackingArray.length - ARRAY_MAX_LENGTH, - (testedStream instanceof DataOutput) ? 21 : 14); + transferRandomData(testedStream, testedStreamBackingArray.length - ARRAY_MAX_LENGTH, 21); } /** * Writes a random unit of data using a method selected randomly. * This method is invoked (indirectly) by {@link #writeInStreams()}. + * + * @param operation numerical identifier of the operation to test. */ @Override final void transferRandomData(final int operation) throws IOException { - final DataOutput r = this.referenceStream; + final ImageOutputStream r = this.referenceStream; final ChannelDataOutput t = this.testedStream; switch (operation) { case 0: { @@ -304,13 +303,8 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final char[] tmp = new char[random.nextInt(ARRAY_MAX_LENGTH / Character.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = (char) random.nextInt(1 << Character.SIZE); - if (!(r instanceof ImageOutputStream)) { - r.writeChar(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeChars(tmp, 0, tmp.length); } + r.writeChars(tmp, 0, tmp.length); t.writeChars(tmp); break; } @@ -318,13 +312,8 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final short[] tmp = new short[random.nextInt(ARRAY_MAX_LENGTH / Short.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = (short) random.nextInt(1 << Short.SIZE); - if (!(r instanceof ImageOutputStream)) { - r.writeShort(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeShorts(tmp, 0, tmp.length); } + r.writeShorts(tmp, 0, tmp.length); t.writeShorts(tmp); break; } @@ -332,13 +321,8 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final int[] tmp = new int[random.nextInt(ARRAY_MAX_LENGTH / Integer.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = random.nextInt(); - if (!(r instanceof ImageOutputStream)) { - r.writeInt(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeInts(tmp, 0, tmp.length); } + r.writeInts(tmp, 0, tmp.length); t.writeInts(tmp); break; } @@ -346,13 +330,8 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final long[] tmp = new long[random.nextInt(ARRAY_MAX_LENGTH / Long.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = random.nextLong(); - if (!(r instanceof ImageOutputStream)) { - r.writeLong(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeLongs(tmp, 0, tmp.length); } + r.writeLongs(tmp, 0, tmp.length); t.writeLongs(tmp); break; } @@ -360,13 +339,8 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final float[] tmp = new float[random.nextInt(ARRAY_MAX_LENGTH / Float.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = random.nextFloat(); - if (!(r instanceof ImageOutputStream)) { - r.writeFloat(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeFloats(tmp, 0, tmp.length); } + r.writeFloats(tmp, 0, tmp.length); t.writeFloats(tmp); break; } @@ -374,42 +348,34 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final double[] tmp = new double[random.nextInt(ARRAY_MAX_LENGTH / Double.BYTES)]; for (int i=0; i<tmp.length; i++) { tmp[i] = random.nextDouble(); - if (!(r instanceof ImageOutputStream)) { - r.writeDouble(tmp[i]); - } - } - if (r instanceof ImageOutputStream) { - ((ImageOutputStream) r).writeDoubles(tmp, 0, tmp.length); } + r.writeDoubles(tmp, 0, tmp.length); t.writeDoubles(tmp); break; } - /* - * Cases below this point are executed only by ChannelImageOutputStreamTest. - */ case 14: { final long v = random.nextLong(); final int numBits = random.nextInt(Byte.SIZE); - ((ImageOutputStream) r).writeBits(v, numBits); + r.writeBits(v, numBits); t.writeBits(v, numBits); break; } case 15: { final boolean v = random.nextBoolean(); r.writeBoolean(v); - ((DataOutput) t).writeBoolean(v); + t.writeBoolean(v); break; } case 16: { final String s = "Byte sequence"; r.writeBytes(s); - ((DataOutput) t).writeBytes(s); + t.writeBytes(s); break; } case 17: { final String s = "Character sequence"; r.writeChars(s); - ((DataOutput) t).writeChars(s); + t.writeChars(s); break; } case 18: { @@ -417,27 +383,24 @@ public class ChannelDataOutputTest extends ChannelDataTestCase { final byte[] array = s.getBytes("UTF-8"); assertEquals(s.length() * 3, array.length); // Sanity check. r.writeUTF(s); - ((DataOutput) t).writeUTF(s); + t.writeUTF(s); break; } case 19: { - final ImageOutputStream ir = (ImageOutputStream) r; - long flushedPosition = StrictMath.max(ir.getFlushedPosition(), t.getFlushedPosition()); - flushedPosition += random.nextInt(1 + (int) (ir.getStreamPosition() - flushedPosition)); - ir.flushBefore(flushedPosition); - t .flushBefore(flushedPosition); + long flushedPosition = StrictMath.max(r.getFlushedPosition(), t.getFlushedPosition()); + flushedPosition += random.nextInt(1 + (int) (r.getStreamPosition() - flushedPosition)); + r.flushBefore(flushedPosition); + t.flushBefore(flushedPosition); break; } case 20: { - ((ImageOutputStream) r).flush(); + r.flush(); t.flush(); break; } default: throw new AssertionError(operation); } - if (r instanceof ImageOutputStream) { - assertEquals("getBitOffset()", ((ImageOutputStream) r).getBitOffset(), t.getBitOffset()); - assertEquals("getStreamPosition()", ((ImageOutputStream) r).getStreamPosition(), t.getStreamPosition()); - } + assertEquals("getBitOffset()", r.getBitOffset(), t.getBitOffset()); + assertEquals("getStreamPosition()", r.getStreamPosition(), t.getStreamPosition()); } } diff --git a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelImageOutputStreamTest.java b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelImageOutputStreamTest.java index 5d0d024761..9fe710f87d 100644 --- a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelImageOutputStreamTest.java +++ b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/ChannelImageOutputStreamTest.java @@ -17,9 +17,6 @@ package org.apache.sis.io.stream; import java.io.IOException; -import java.io.ByteArrayOutputStream; -import java.nio.ByteBuffer; -import javax.imageio.stream.ImageOutputStream; // Test dependencies import org.junit.Test; @@ -47,12 +44,9 @@ public final class ChannelImageOutputStreamTest extends ChannelDataOutputTest { * Initializes all non-final fields before to execute a test. */ @Override - void initialize(final String fileName, final int streamLength, final int bufferLength) throws IOException { - expectedData = new ByteArrayOutputStream(streamLength); - referenceStream = new MemoryCacheImageOutputStream(expectedData); - testedStreamBackingArray = new byte[streamLength]; - testedStream = new ChannelImageOutputStream(fileName, - new ByteArrayChannel(testedStreamBackingArray, false), ByteBuffer.allocate(bufferLength)); + void initialize(final String testName, final int streamLength, final int bufferLength) throws IOException { + super.initialize(testName, streamLength, bufferLength); + testedStream = new ChannelImageOutputStream(testedStream); } /** @@ -63,8 +57,7 @@ public final class ChannelImageOutputStreamTest extends ChannelDataOutputTest { @Test public void testWriteBits() throws IOException { initialize("testWriteBits", STREAM_LENGTH, randomBufferCapacity()); - final ImageOutputStream referenceStream = (ImageOutputStream) this.referenceStream; - final int length = testedStreamBackingArray.length - ARRAY_MAX_LENGTH; // Keep a margin against buffer underflow. + final int length = testedStreamBackingArray.length - ARRAY_MAX_LENGTH; // Keep a margin against buffer underflow. while (testedStream.getStreamPosition() < length) { final long v = random.nextLong(); final int numBits = random.nextInt(Byte.SIZE); @@ -92,7 +85,6 @@ public final class ChannelImageOutputStreamTest extends ChannelDataOutputTest { @Test public void testMarkAndReset() throws IOException { initialize("testMarkAndReset", STREAM_LENGTH, 1000); // We need a larger buffer for this test. - final ImageOutputStream referenceStream = (ImageOutputStream) this.referenceStream; /* * Fill both streams with random data. * During this process, randomly takes mark. @@ -117,7 +109,6 @@ public final class ChannelImageOutputStreamTest extends ChannelDataOutputTest { * stream content. */ private void compareMarks(int nbMarks) throws IOException { - final ImageOutputStream referenceStream = (ImageOutputStream) this.referenceStream; while (--nbMarks >= 0) { referenceStream.reset(); testedStream.reset(); @@ -150,7 +141,6 @@ public final class ChannelImageOutputStreamTest extends ChannelDataOutputTest { public void testFlushBefore() throws IOException { final int N = 50; // Number of long values to write. initialize("testFlushBefore", N*Long.BYTES, 200); - final ImageOutputStream referenceStream = (ImageOutputStream) this.referenceStream; for (int i=0; i<N; i++) { switch (i) { case 20: