From 3b68d676f352e5c0013783e95ec551f20b2e66cb Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Thu, 30 Aug 2018 14:46:55 +0200 Subject: [PATCH] #439: Unclear exception message when passing image metadata as stream metadata (cherry picked from commit 6018093) --- .../imageio/AbstractMetadata.java | 2 +- .../plugins/tiff/TIFFStreamMetadata.java | 10 ++++++++- .../plugins/tiff/TIFFStreamMetadataTest.java | 22 ++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/AbstractMetadata.java b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/AbstractMetadata.java index c8752efb..1e8ba89c 100644 --- a/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/AbstractMetadata.java +++ b/imageio/imageio-core/src/main/java/com/twelvemonkeys/imageio/AbstractMetadata.java @@ -130,7 +130,7 @@ public abstract class AbstractMetadata extends IIOMetadata implements Cloneable } throw new IllegalArgumentException( - String.format("Bad format name: \"%s\". Expected one of %s", formatName, Arrays.toString(metadataFormatNames)) + String.format("Unsupported format name: \"%s\". Expected one of %s", formatName, Arrays.toString(metadataFormatNames)) ); } diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java index 5c4cc80a..5ac7df3f 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadata.java @@ -39,9 +39,12 @@ import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.ImageOutputStream; import java.nio.ByteOrder; +import java.util.Arrays; import static com.twelvemonkeys.lang.Validate.notNull; +import static java.lang.String.format; import static java.nio.ByteOrder.BIG_ENDIAN; +import static java.util.Arrays.asList; /** * TIFFStreamMetadata. @@ -113,7 +116,7 @@ public final class TIFFStreamMetadata extends IIOMetadata { } } - private ByteOrder getByteOrder(final String value) throws IIOInvalidTreeException { + private ByteOrder getByteOrder(final String value) { switch (value) { case "BIG_ENDIAN": return ByteOrder.BIG_ENDIAN; @@ -138,6 +141,11 @@ public final class TIFFStreamMetadata extends IIOMetadata { } else if (streamMetadata != null) { TIFFStreamMetadata metadata = new TIFFStreamMetadata(); + + Validate.isTrue(asList(streamMetadata.getMetadataFormatNames()).contains(metadata.nativeMetadataFormatName), + format("Unsupported stream metadata format, expected %s: %s", metadata.nativeMetadataFormatName, + Arrays.toString(streamMetadata.getMetadataFormatNames()))); + // Will throw exception if stream format differs from native metadata.mergeTree(metadata.nativeMetadataFormatName, streamMetadata.getAsTree(metadata.nativeMetadataFormatName)); imageOutput.setByteOrder(metadata.byteOrder); diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadataTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadataTest.java index 88400a42..304d856a 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadataTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFStreamMetadataTest.java @@ -40,6 +40,7 @@ import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.ImageOutputStream; import java.nio.ByteOrder; +import static com.twelvemonkeys.imageio.plugins.tiff.TIFFMedataFormat.SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME; import static com.twelvemonkeys.imageio.plugins.tiff.TIFFStreamMetadata.SUN_NATIVE_STREAM_METADATA_FORMAT_NAME; import static java.nio.ByteOrder.BIG_ENDIAN; import static java.nio.ByteOrder.LITTLE_ENDIAN; @@ -85,9 +86,10 @@ public class TIFFStreamMetadataTest { } @Test - public void testConfigureStreamForegin() throws IIOInvalidTreeException { + public void testConfigureStreamForeign() throws IIOInvalidTreeException { ImageOutputStream stream = mock(ImageOutputStream.class); IIOMetadata metadata = mock(IIOMetadata.class); + when(metadata.getMetadataFormatNames()).thenReturn(new String[]{SUN_NATIVE_STREAM_METADATA_FORMAT_NAME, "com_foo_supertiff_9.42"}); when(metadata.getAsTree(eq(SUN_NATIVE_STREAM_METADATA_FORMAT_NAME))).thenReturn(createForeignTree(LITTLE_ENDIAN)); TIFFStreamMetadata.configureStreamByteOrder(metadata, stream); @@ -95,6 +97,24 @@ public class TIFFStreamMetadataTest { verify(stream, only()).setByteOrder(LITTLE_ENDIAN); } + @Test + public void testConfigureStreamImageMetadata() throws IIOInvalidTreeException { + ImageOutputStream stream = mock(ImageOutputStream.class); + IIOMetadata metadata = mock(IIOMetadata.class); + when(metadata.getMetadataFormatNames()).thenReturn(new String[]{SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME}); + + try { + TIFFStreamMetadata.configureStreamByteOrder(metadata, stream); + fail("Expected IllegalArgumentException"); + } + catch (IllegalArgumentException expected) { + assertNotNull(expected.getMessage()); + assertTrue(expected.getMessage().toLowerCase().contains("unsupported stream metadata format")); + assertTrue(expected.getMessage().contains("expected " + SUN_NATIVE_STREAM_METADATA_FORMAT_NAME)); + assertTrue(expected.getMessage().contains(SUN_NATIVE_IMAGE_METADATA_FORMAT_NAME)); + } + } + private IIOMetadataNode createForeignTree(ByteOrder order) { IIOMetadataNode root = new IIOMetadataNode(SUN_NATIVE_STREAM_METADATA_FORMAT_NAME); IIOMetadataNode byteOrder = new IIOMetadataNode("ByteOrder");