983N/A/*
2362N/A * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
983N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
983N/A *
983N/A * This code is free software; you can redistribute it and/or modify it
983N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
983N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
983N/A *
983N/A * This code is distributed in the hope that it will be useful, but WITHOUT
983N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
983N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
983N/A * version 2 for more details (a copy is included in the LICENSE file that
983N/A * accompanied this code).
983N/A *
983N/A * You should have received a copy of the GNU General Public License version
983N/A * 2 along with this work; if not, write to the Free Software Foundation,
983N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
983N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
983N/A */
983N/A
983N/A/**
983N/A * @test
983N/A * @bug 5082756
983N/A * @summary ensure that boolean attributes follow ( "TRUE" | "FALSE" )
983N/A * including correct (i.e. upper) case
983N/A *
983N/A * @run main BooleanAttributes
983N/A */
983N/A
983N/Aimport java.awt.image.BufferedImage;
983N/Aimport java.io.ByteArrayInputStream;
983N/Aimport java.io.ByteArrayOutputStream;
983N/Aimport java.io.StringReader;
983N/Aimport java.util.Arrays;
983N/Aimport java.util.List;
983N/Aimport javax.imageio.IIOImage;
983N/Aimport javax.imageio.ImageIO;
983N/Aimport javax.imageio.ImageReader;
983N/Aimport javax.imageio.ImageTypeSpecifier;
983N/Aimport javax.imageio.ImageWriteParam;
983N/Aimport javax.imageio.ImageWriter;
983N/Aimport javax.imageio.metadata.IIOMetadata;
983N/Aimport javax.imageio.stream.ImageInputStream;
983N/Aimport javax.imageio.stream.ImageOutputStream;
983N/Aimport javax.imageio.stream.MemoryCacheImageInputStream;
983N/Aimport javax.imageio.stream.MemoryCacheImageOutputStream;
983N/Aimport javax.xml.transform.Result;
983N/Aimport javax.xml.transform.Source;
983N/Aimport javax.xml.transform.TransformerFactory;
983N/Aimport javax.xml.transform.dom.DOMResult;
983N/Aimport javax.xml.transform.stream.StreamSource;
983N/Aimport javax.xml.xpath.XPath;
983N/Aimport javax.xml.xpath.XPathConstants;
983N/Aimport javax.xml.xpath.XPathFactory;
983N/Aimport org.w3c.dom.Document;
983N/Aimport org.w3c.dom.Element;
983N/Aimport org.w3c.dom.Node;
983N/Aimport org.w3c.dom.NodeList;
983N/A
983N/Apublic class BooleanAttributes {
983N/A
983N/A private static TransformerFactory transformerFactory =
983N/A TransformerFactory.newInstance();
983N/A
983N/A private static XPath xpathEngine = XPathFactory.newInstance().newXPath();
983N/A
983N/A public static void main(String[] args) throws Exception {
983N/A test("image/png", false, "<javax_imageio_1.0 />",
983N/A "Chroma/BlackIsZero/@value",
983N/A "Compression/Lossless/@value");
983N/A
983N/A test("image/png", false,
983N/A "<javax_imageio_png_1.0>" +
983N/A "<iTXt><iTXtEntry keyword='Comment' compressionFlag='TRUE' " +
983N/A "compressionMethod='0' languageTag='en' " +
983N/A "translatedKeyword='comment' text='foo'/></iTXt>" +
983N/A "</javax_imageio_png_1.0>",
983N/A "iTXt/iTXtEntry/@compressionFlag");
983N/A
983N/A test("image/png", false,
983N/A "<javax_imageio_png_1.0>" +
983N/A "<iTXt><iTXtEntry keyword='Comment' compressionFlag='FALSE' " +
983N/A "compressionMethod='0' languageTag='en' " +
983N/A "translatedKeyword='comment' text='foo'/></iTXt>" +
983N/A "</javax_imageio_png_1.0>",
983N/A "iTXt/iTXtEntry/@compressionFlag");
983N/A
983N/A test("image/gif", false, "<javax_imageio_1.0 />",
983N/A "Chroma/BlackIsZero/@value",
983N/A "Compression/Lossless/@value");
983N/A
983N/A test("image/gif", false,
983N/A "<javax_imageio_gif_image_1.0>" +
983N/A "<ImageDescriptor imageLeftPosition='0' imageTopPosition='0' " +
983N/A "imageWidth='16' imageHeight='16' interlaceFlag='TRUE' />" +
983N/A "<LocalColorTable sizeOfLocalColorTable='2' " +
983N/A "backgroundColorIndex='1' sortFlag='TRUE'>" +
983N/A "<ColorTableEntry index='0' red='0' green='0' blue='0' />" +
983N/A "<ColorTableEntry index='1' red='255' green='255' blue='255' />" +
983N/A "</LocalColorTable>" +
983N/A "<GraphicControlExtension disposalMethod='doNotDispose' " +
983N/A "userInputFlag='FALSE' transparentColorFlag='TRUE' " +
983N/A "delayTime='100' transparentColorIndex='1' />" +
983N/A "</javax_imageio_gif_image_1.0>",
983N/A "ImageDescriptor/@interlaceFlag",
983N/A "LocalColorTable/@sortFlag",
983N/A "GraphicControlExtension/@userInputFlag",
983N/A "GraphicControlExtension/@transparentColorFlag");
983N/A
983N/A test("image/gif", true,
983N/A "<javax_imageio_gif_stream_1.0>" +
983N/A "<GlobalColorTable sizeOfGlobalColorTable='2' " +
983N/A "backgroundColorIndex='1' sortFlag='TRUE'>" +
983N/A "<ColorTableEntry index='0' red='0' green='0' blue='0' />" +
983N/A "<ColorTableEntry index='1' red='255' green='255' blue='255' />" +
983N/A "</GlobalColorTable>" +
983N/A "</javax_imageio_gif_stream_1.0>",
983N/A "GlobalColorTable/@sortFlag");
983N/A
983N/A test("image/jpeg", false, "<javax_imageio_1.0 />",
983N/A "Compression/Lossless/@value");
983N/A }
983N/A
983N/A private static void transform(Source src, Result dst)
983N/A throws Exception
983N/A {
983N/A transformerFactory.newTransformer().transform(src, dst);
983N/A }
983N/A
983N/A private static void verify(Node meta, String[] xpaths, boolean required)
983N/A throws Exception
983N/A {
983N/A for (String xpath: xpaths) {
983N/A NodeList list = (NodeList)
983N/A xpathEngine.evaluate(xpath, meta, XPathConstants.NODESET);
983N/A if (list.getLength() == 0 && required)
983N/A throw new AssertionError("Missing value: " + xpath);
983N/A for (int i = 0; i < list.getLength(); ++i) {
983N/A String value = list.item(i).getNodeValue();
983N/A if (!(value.equals("TRUE") || value.equals("FALSE")))
983N/A throw new AssertionError(xpath + " has value " + value);
983N/A }
983N/A }
983N/A }
983N/A
983N/A public static void test(String mimeType, boolean useStreamMeta,
983N/A String metaXml, String... boolXpaths)
983N/A throws Exception
983N/A {
983N/A BufferedImage img =
983N/A new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);
983N/A ImageWriter iw = ImageIO.getImageWritersByMIMEType(mimeType).next();
983N/A ByteArrayOutputStream os = new ByteArrayOutputStream();
983N/A ImageOutputStream ios = new MemoryCacheImageOutputStream(os);
983N/A iw.setOutput(ios);
983N/A ImageWriteParam param = null;
983N/A IIOMetadata streamMeta = iw.getDefaultStreamMetadata(param);
983N/A IIOMetadata imageMeta =
983N/A iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), param);
983N/A IIOMetadata meta = useStreamMeta ? streamMeta : imageMeta;
983N/A Source src = new StreamSource(new StringReader(metaXml));
983N/A DOMResult dst = new DOMResult();
983N/A transform(src, dst);
983N/A Document doc = (Document)dst.getNode();
983N/A Element node = doc.getDocumentElement();
983N/A String metaFormat = node.getNodeName();
983N/A
983N/A // Verify that the default metadata gets formatted correctly.
983N/A verify(meta.getAsTree(metaFormat), boolXpaths, false);
983N/A
983N/A meta.mergeTree(metaFormat, node);
983N/A
983N/A // Verify that the merged metadata gets formatte correctly.
983N/A verify(meta.getAsTree(metaFormat), boolXpaths, true);
983N/A
983N/A iw.write(streamMeta, new IIOImage(img, null, imageMeta), param);
983N/A iw.dispose();
983N/A ios.close();
983N/A ImageReader ir = ImageIO.getImageReader(iw);
983N/A byte[] bytes = os.toByteArray();
983N/A if (bytes.length == 0)
983N/A throw new AssertionError("Zero length image file");
983N/A ByteArrayInputStream is = new ByteArrayInputStream(bytes);
983N/A ImageInputStream iis = new MemoryCacheImageInputStream(is);
983N/A ir.setInput(iis);
983N/A if (useStreamMeta) meta = ir.getStreamMetadata();
983N/A else meta = ir.getImageMetadata(0);
983N/A
983N/A // Verify again after writing and re-reading the image
983N/A verify(meta.getAsTree(metaFormat), boolXpaths, true);
983N/A }
983N/A
983N/A public static void xtest(Object... eatAnyArguments) {
983N/A System.err.println("Disabled test! Change xtest back into test!");
983N/A }
983N/A
983N/A}