XGC-112: TIFF resolution wrong on Java 10

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/commons/trunk@1833700 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java b/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
index e800f47..801ab61 100644
--- a/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
+++ b/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
@@ -46,8 +46,12 @@
 
     private static final String SUN_TIFF_NATIVE_FORMAT
             = "com_sun_media_imageio_plugins_tiff_image_1.0";
+    private static final String JAVA_TIFF_NATIVE_FORMAT
+            = "javax_imageio_tiff_image_1.0";
     private static final String SUN_TIFF_NATIVE_STREAM_FORMAT
             = "com_sun_media_imageio_plugins_tiff_stream_1.0";
+    private static final String JAVA_TIFF_NATIVE_STREAM_FORMAT
+            = "javax_imageio_tiff_stream_1.0";
 
     /**
      * Main constructor.
@@ -65,14 +69,12 @@
         //it doesn't work properly through the standard metadata. Haven't figured out why
         //that happens.
         if (params.getResolution() != null) {
-            if (SUN_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())) {
-                //IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(SUN_TIFF_NATIVE_FORMAT);
-                IIOMetadataNode root = new IIOMetadataNode(SUN_TIFF_NATIVE_FORMAT);
+            if (SUN_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())
+                    || JAVA_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())) {
+                IIOMetadataNode root = new IIOMetadataNode(meta.getNativeMetadataFormatName());
                 IIOMetadataNode ifd = getChildNode(root, "TIFFIFD");
                 if (ifd == null) {
                     ifd = new IIOMetadataNode("TIFFIFD");
-                    ifd.setAttribute("tagSets",
-                                "com.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet");
                     root.appendChild(ifd);
                 }
                 ifd.appendChild(createResolutionUnitField(params));
@@ -85,7 +87,7 @@
                         "RowsPerStrip", Integer.toString(rows)));
 
                 try {
-                    meta.mergeTree(SUN_TIFF_NATIVE_FORMAT, root);
+                    meta.mergeTree(meta.getNativeMetadataFormatName(), root);
                 } catch (IIOInvalidTreeException e) {
                     throw new RuntimeException("Cannot update image metadata: "
                                 + e.getMessage(), e);
@@ -221,20 +223,27 @@
 
         //Try changing the Byte Order
         IIOMetadata streamMetadata = writer.getDefaultStreamMetadata(writeParam);
-        Set<String> names = new java.util.HashSet<String>(
-                Arrays.asList(streamMetadata.getMetadataFormatNames()));
-        if (names.contains(SUN_TIFF_NATIVE_STREAM_FORMAT)) {
-            Node root = streamMetadata.getAsTree(SUN_TIFF_NATIVE_STREAM_FORMAT);
+        if (streamMetadata != null) {
+            Set<String> names = new java.util.HashSet<String>(
+                    Arrays.asList(streamMetadata.getMetadataFormatNames()));
+            setFromTree(names, streamMetadata, endian, SUN_TIFF_NATIVE_STREAM_FORMAT);
+            setFromTree(names, streamMetadata, endian, JAVA_TIFF_NATIVE_STREAM_FORMAT);
+        }
+        return streamMetadata;
+    }
+
+    private void setFromTree(Set<String> names, IIOMetadata streamMetadata, Endianness endian, String format) {
+        if (names.contains(format)) {
+            Node root = streamMetadata.getAsTree(format);
             root.getFirstChild().getAttributes().item(0).setNodeValue(endian.toString());
             try {
-                streamMetadata.setFromTree(SUN_TIFF_NATIVE_STREAM_FORMAT, root);
+                streamMetadata.setFromTree(format, root);
             } catch (IIOInvalidTreeException e) {
                 //This should not happen since we check if the format is supported.
                 throw new IllegalStateException(
                         "Could not replace TIFF stream metadata: " + e.getMessage(), e);
             }
         }
-        return streamMetadata;
     }
 
 }
diff --git a/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java b/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
index a825988..95287d4 100644
--- a/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
+++ b/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
@@ -27,9 +27,14 @@
 import java.awt.image.BufferedImage;
 import java.io.IOException;
 
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataNode;
+
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.w3c.dom.Node;
+
 import org.apache.commons.io.output.ByteArrayOutputStream;
 
 import org.apache.xmlgraphics.image.loader.ImageSize;
@@ -126,7 +131,7 @@
         ByteArrayOutputStream getByteArrayOutput();
     }
 
-    private class TestImageWriter implements ImageWriterHelper {
+    private static class TestImageWriter implements ImageWriterHelper {
         private ImageWriter writer;
         private ByteArrayOutputStream baout;
 
@@ -149,7 +154,7 @@
         }
     }
 
-    private class TestMultiImageWriter implements ImageWriterHelper {
+    private static class TestMultiImageWriter implements ImageWriterHelper {
         private MultiImageWriter writer;
         private ByteArrayOutputStream baout;
 
@@ -176,4 +181,32 @@
         }
     }
 
+    @Test
+    public void testNewMetadataFormat() {
+        ImageWriterParams params = new ImageWriterParams();
+        params.setResolution(92);
+        MyIIOMetadata metadata = new MyIIOMetadata();
+        new ImageIOTIFFImageWriter().updateMetadata(null, metadata, params);
+        Assert.assertEquals(metadata.mergeNode, "javax_imageio_tiff_image_1.0");
+    }
+
+    static class MyIIOMetadata extends IIOMetadata {
+        String mergeNode;
+        MyIIOMetadata() {
+            super(true, "javax_imageio_tiff_image_1.0", null, null, null);
+        }
+        public boolean isReadOnly() {
+            return false;
+        }
+        public Node getAsTree(String formatName) {
+            IIOMetadataNode node = new IIOMetadataNode();
+            node.appendChild(new IIOMetadataNode("Dimension"));
+            return node;
+        }
+        public void mergeTree(String formatName, Node root) {
+            mergeNode = root.getNodeName();
+        }
+        public void reset() {
+        }
+    };
 }