/* * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /** * @test * @bug 8154058 * @author a.stepanov * @summary Some checks for ignoring metadata * @run main ReadParamTest */ import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.*; import javax.imageio.metadata.*; import javax.imageio.stream.*; import javax.imageio.plugins.tiff.*; public class ReadParamTest { private final static int SZ = 50; private final static Color C = Color.RED; private final static int DESCRIPTION_TAG = BaselineTIFFTagSet.TAG_IMAGE_DESCRIPTION; private final static String DESCRIPTION = "A Test Image"; private final static int FAX_TAG = FaxTIFFTagSet.TAG_CLEAN_FAX_DATA; private final static short FAX_DATA = FaxTIFFTagSet.CLEAN_FAX_DATA_ERRORS_UNCORRECTED; private final boolean ignoreMetadata; private final boolean readUnknownTags; public ReadParamTest(boolean ignoreMetadata, boolean readUnknownTags) { this.ignoreMetadata = ignoreMetadata; this.readUnknownTags = readUnknownTags; } private ImageWriter getTIFFWriter() { java.util.Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); if (!writers.hasNext()) { throw new RuntimeException("No writers available for TIFF format"); } return writers.next(); } private ImageReader getTIFFReader() { java.util.Iterator readers = ImageIO.getImageReadersByFormatName("TIFF"); if (!readers.hasNext()) { throw new RuntimeException("No readers available for TIFF format"); } return readers.next(); } private void writeImage() throws Exception { String fn = "test-" + ignoreMetadata + ".tiff"; OutputStream s = new BufferedOutputStream(new FileOutputStream(fn)); try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) { ImageWriter writer = getTIFFWriter(); writer.setOutput(ios); BufferedImage img = new BufferedImage(SZ, SZ, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); g.setColor(C); g.fillRect(0, 0, SZ, SZ); g.dispose(); ImageWriteParam param = writer.getDefaultWriteParam(); IIOMetadata md = writer.getDefaultImageMetadata( new ImageTypeSpecifier(img), param); TIFFDirectory dir = TIFFDirectory.createFromMetadata(md); TIFFTag descTag = BaselineTIFFTagSet.getInstance().getTag(DESCRIPTION_TAG); dir.addTIFFField(new TIFFField(descTag, TIFFTag.TIFF_ASCII, 1, new String[] {DESCRIPTION})); TIFFTag faxTag = FaxTIFFTagSet.getInstance().getTag(FAX_TAG); dir.addTIFFField(new TIFFField(faxTag, FAX_DATA)); writer.write(new IIOImage(img, null, dir.getAsMetadata())); ios.flush(); writer.dispose(); } s.close(); } private void readAndCheckImage() throws Exception { ImageReader reader = getTIFFReader(); String fn = "test-" + ignoreMetadata + ".tiff"; ImageInputStream s = ImageIO.createImageInputStream(new File(fn)); reader.setInput(s, false, ignoreMetadata); int ni = reader.getNumImages(true); check(ni == 1, "invalid number of images"); TIFFImageReadParam param = new TIFFImageReadParam(); // fax data are allowed by default param.removeAllowedTagSet(FaxTIFFTagSet.getInstance()); // readUnknownTags setting if (param.getReadUnknownTags()) { throw new RuntimeException("Default readUnknownTags is not false"); } param.setReadUnknownTags(readUnknownTags); if (param.getReadUnknownTags() != readUnknownTags) { throw new RuntimeException("Incorrect readUnknownTags setting " + "\"" + readUnknownTags + "\""); } // read images and metadata IIOImage i = reader.readAll(0, param); BufferedImage bi = (BufferedImage) i.getRenderedImage(); check(bi.getWidth() == SZ, "invalid width"); check(bi.getHeight() == SZ, "invalid height"); Color c = new Color(bi.getRGB(SZ / 2, SZ / 2)); check(c.equals(C), "invalid color"); IIOMetadata metadata = i.getMetadata(); // // Verify presence of image metadata // if (metadata == null) { throw new RuntimeException("No image metadata retrieved"); } TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata); // // Verify presence of essential ImageWidth field regardless of // settings of ignoreMetadata and readUnknownTags // int failures = 0; if (!dir.containsTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH)) { System.err.println("Metadata is missing essential ImageWidth tag"); failures++; } else { TIFFField widthField = dir.getTIFFField(BaselineTIFFTagSet.TAG_IMAGE_WIDTH); System.out.printf("ImageWidth: %d%n", widthField.getAsLong(0)); } // // Verify presence of non-essential baseline ImageDescription field // if and only if ignoreMetadata == false // boolean hasDescription = dir.containsTIFFField(DESCRIPTION_TAG); System.out.println("ImageDescription (" + !ignoreMetadata + "): " + hasDescription); if (ignoreMetadata && hasDescription) { System.err.println ("Description metadata present despite ignoreMetadata"); failures++; } else if (!ignoreMetadata && !hasDescription) { System.err.println ("Description metadata absent despite !ignoreMetadata"); failures++; } // // Verify presence of CleanFaxData field if and only if // ignoreMetadata == false and readUnknownTags == true // boolean shouldHaveFaxField = !ignoreMetadata && readUnknownTags; boolean hasFaxField = dir.containsTIFFField(FAX_TAG); System.out.println("CleanFaxData (" + shouldHaveFaxField + "): " + hasFaxField); if (ignoreMetadata) { if (hasFaxField) { System.err.println ("Fax metadata present despite ignoreMetadata"); failures++; } } else { // !ignoreMetadata if (!readUnknownTags && hasFaxField) { System.err.println ("Fax metadata present despite !readUnknownTags"); failures++; } else if (readUnknownTags && !hasFaxField) { System.err.println ("Fax metadata absent despite readUnknownTags"); failures++; } } if (failures > 0) { throw new RuntimeException("Test failed for ignoreMetadata " + ignoreMetadata + " and readUnknownTags " + readUnknownTags); } } public void run() { try { writeImage(); readAndCheckImage(); } catch (Exception e) { throw new RuntimeException(e); } } private void check(boolean ok, String msg) { if (!ok) { throw new RuntimeException(msg); } } public static void main(String[] args) { int failures = 0; System.out.println(); for (boolean ignoreMetadata : new boolean[] {false, true}) { for (boolean readUnknownTags : new boolean[] {false, true}) { try { System.out.printf ("ignoreMetadata: %s, readUnknownTags: %s%n", ignoreMetadata, readUnknownTags); (new ReadParamTest(ignoreMetadata, readUnknownTags)).run(); } catch (Exception e) { e.printStackTrace(); failures++; } finally { System.out.println(); } } } } }