#439: Unclear exception message when passing image metadata as stream metadata

(cherry picked from commit 6018093)
This commit is contained in:
Harald Kuhr 2018-08-30 14:46:55 +02:00
parent 83adf121e2
commit 3b68d676f3
3 changed files with 31 additions and 3 deletions

View File

@ -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))
);
}

View File

@ -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);

View File

@ -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");