/*
 * Copyright (c) 2001, 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.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * 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.
 */

package com.sun.imageio.plugins.common;

import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadataFormatImpl;

public class StandardMetadataFormat extends IIOMetadataFormatImpl {

    // Utility method for nodes with a single atttribute named "value"
    private void addSingleAttributeElement(String elementName,
                                           String parentName,
                                           int dataType) {
        addElement(elementName, parentName, CHILD_POLICY_EMPTY);
        addAttribute(elementName, "value", dataType, true, null);
    }

    public StandardMetadataFormat() {
        super(standardMetadataFormatName, CHILD_POLICY_SOME);
        List values;

        // root -> Chroma
        addElement("Chroma", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Chroma -> ColorSpaceType
        addElement("ColorSpaceType", "Chroma",
                   CHILD_POLICY_EMPTY);

        values = new ArrayList();
        values.add("XYZ");
        values.add("Lab");
        values.add("Luv");
        values.add("YCbCr");
        values.add("Yxy");
        values.add("YCCK");
        values.add("PhotoYCC");
        values.add("RGB");
        values.add("GRAY");
        values.add("HSV");
        values.add("HLS");
        values.add("CMYK");
        values.add("CMY");
        values.add("2CLR");
        values.add("3CLR");
        values.add("4CLR");
        values.add("5CLR");
        values.add("6CLR");
        values.add("7CLR");
        values.add("8CLR");
        values.add("9CLR");
        values.add("ACLR");
        values.add("BCLR");
        values.add("CCLR");
        values.add("DCLR");
        values.add("ECLR");
        values.add("FCLR");
        addAttribute("ColorSpaceType",
                     "name",
                     DATATYPE_STRING,
                     true,
                     null,
                     values);

        // root -> Chroma -> NumChannels
        addElement("NumChannels", "Chroma",
                   CHILD_POLICY_EMPTY);
        addAttribute("NumChannels", "value",
                     DATATYPE_INTEGER,
                     true,
                     0, Integer.MAX_VALUE);

        // root -> Chroma -> Gamma
        addElement("Gamma", "Chroma", CHILD_POLICY_EMPTY);
        addAttribute("Gamma", "value",
                     DATATYPE_FLOAT, true, null);

        // root -> Chroma -> BlackIsZero
        addElement("BlackIsZero", "Chroma", CHILD_POLICY_EMPTY);
        addBooleanAttribute("BlackIsZero", "value", true, true);

        // root -> Chroma -> Palette
        addElement("Palette", "Chroma", 0, Integer.MAX_VALUE);

        // root -> Chroma -> PaletteEntry
        addElement("PaletteEntry", "Palette", CHILD_POLICY_EMPTY);
        addAttribute("PaletteEntry", "index", DATATYPE_INTEGER,
                     true, null);
        addAttribute("PaletteEntry", "red", DATATYPE_INTEGER,
                     true, null);
        addAttribute("PaletteEntry", "green", DATATYPE_INTEGER,
                     true, null);
        addAttribute("PaletteEntry", "blue", DATATYPE_INTEGER,
                     true, null);
        addAttribute("PaletteEntry", "alpha", DATATYPE_INTEGER,
                     false, "255");

        // root -> Chroma -> BackgroundIndex
        addElement("BackgroundIndex", "Chroma", CHILD_POLICY_EMPTY);
        addAttribute("BackgroundIndex", "value", DATATYPE_INTEGER,
                     true, null);

        // root -> Chroma -> BackgroundColor
        addElement("BackgroundColor", "Chroma", CHILD_POLICY_EMPTY);
        addAttribute("BackgroundColor", "red", DATATYPE_INTEGER,
                     true, null);
        addAttribute("BackgroundColor", "green", DATATYPE_INTEGER,
                     true, null);
        addAttribute("BackgroundColor", "blue", DATATYPE_INTEGER,
                     true, null);

        // root -> Compression
        addElement("Compression", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Compression -> CompressionTypeName
        addSingleAttributeElement("CompressionTypeName",
                                  "Compression",
                                  DATATYPE_STRING);

        // root -> Compression -> Lossless
        addElement("Lossless", "Compression", CHILD_POLICY_EMPTY);
        addBooleanAttribute("Lossless", "value", true, true);

        // root -> Compression -> NumProgressiveScans
        addSingleAttributeElement("NumProgressiveScans",
                                  "Compression",
                                  DATATYPE_INTEGER);

        // root -> Compression -> BitRate
        addSingleAttributeElement("BitRate",
                                  "Compression",
                                  DATATYPE_FLOAT);

        // root -> Data
        addElement("Data", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Data -> PlanarConfiguration
        addElement("PlanarConfiguration", "Data", CHILD_POLICY_EMPTY);

        values = new ArrayList();
        values.add("PixelInterleaved");
        values.add("PlaneInterleaved");
        values.add("LineInterleaved");
        values.add("TileInterleaved");
        addAttribute("PlanarConfiguration", "value",
                     DATATYPE_STRING,
                     true,
                     null,
                     values);

        // root -> Data -> SampleFormat
        addElement("SampleFormat", "Data", CHILD_POLICY_EMPTY);

        values = new ArrayList();
        values.add("SignedIntegral");
        values.add("UnsignedIntegral");
        values.add("Real");
        values.add("Index");
        addAttribute("SampleFormat", "value",
                     DATATYPE_STRING,
                     true,
                     null,
                     values);

        // root -> Data -> BitsPerSample
        addElement("BitsPerSample", "Data",
                   CHILD_POLICY_EMPTY);
        addAttribute("BitsPerSample", "value",
                     DATATYPE_INTEGER,
                     true,
                     1, Integer.MAX_VALUE);

        // root -> Data -> SignificantBitsPerSample
        addElement("SignificantBitsPerSample", "Data", CHILD_POLICY_EMPTY);
        addAttribute("SignificantBitsPerSample", "value",
                     DATATYPE_INTEGER,
                     true,
                     1, Integer.MAX_VALUE);

        // root -> Data -> SampleMSB
        addElement("SampleMSB", "Data",
                   CHILD_POLICY_EMPTY);
        addAttribute("SampleMSB", "value",
                     DATATYPE_INTEGER,
                     true,
                     1, Integer.MAX_VALUE);

        // root -> Dimension
        addElement("Dimension", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Dimension -> PixelAspectRatio
        addSingleAttributeElement("PixelAspectRatio",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> ImageOrientation
        addElement("ImageOrientation", "Dimension",
                   CHILD_POLICY_EMPTY);

        values = new ArrayList();
        values.add("Normal");
        values.add("Rotate90");
        values.add("Rotate180");
        values.add("Rotate270");
        values.add("FlipH");
        values.add("FlipV");
        values.add("FlipHRotate90");
        values.add("FlipVRotate90");
        addAttribute("ImageOrientation", "value",
                     DATATYPE_STRING,
                     true,
                     null,
                     values);

        // root -> Dimension -> HorizontalPixelSize
        addSingleAttributeElement("HorizontalPixelSize",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> VerticalPixelSize
        addSingleAttributeElement("VerticalPixelSize",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> HorizontalPhysicalPixelSpacing
        addSingleAttributeElement("HorizontalPhysicalPixelSpacing",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> VerticalPhysicalPixelSpacing
        addSingleAttributeElement("VerticalPhysicalPixelSpacing",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> HorizontalPosition
        addSingleAttributeElement("HorizontalPosition",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> VerticalPosition
        addSingleAttributeElement("VerticalPosition",
                                  "Dimension",
                                  DATATYPE_FLOAT);

        // root -> Dimension -> HorizontalPixelOffset
        addSingleAttributeElement("HorizontalPixelOffset",
                                  "Dimension",
                                  DATATYPE_INTEGER);

        // root -> Dimension -> VerticalPixelOffset
        addSingleAttributeElement("VerticalPixelOffset",
                                  "Dimension",
                                  DATATYPE_INTEGER);

        // root -> Dimension -> HorizontalScreenSize
        addSingleAttributeElement("HorizontalScreenSize",
                                  "Dimension",
                                  DATATYPE_INTEGER);

        // root -> Dimension -> VerticalScreenSize
        addSingleAttributeElement("VerticalScreenSize",
                                  "Dimension",
                                  DATATYPE_INTEGER);


        // root -> Document
        addElement("Document", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Document -> FormatVersion
        addElement("FormatVersion", "Document",
                   CHILD_POLICY_EMPTY);
        addAttribute("FormatVersion", "value",
                     DATATYPE_STRING,
                     true,
                     null);

        // root -> Document -> SubimageInterpretation
        addElement("SubimageInterpretation", "Document",
                   CHILD_POLICY_EMPTY);
        values = new ArrayList();
        values.add("Standalone");
        values.add("SinglePage");
        values.add("FullResolution");
        values.add("ReducedResolution");
        values.add("PyramidLayer");
        values.add("Preview");
        values.add("VolumeSlice");
        values.add("ObjectView");
        values.add("Panorama");
        values.add("AnimationFrame");
        values.add("TransparencyMask");
        values.add("CompositingLayer");
        values.add("SpectralSlice");
        values.add("Unknown");
        addAttribute("SubimageInterpretation", "value",
                     DATATYPE_STRING,
                     true,
                     null,
                     values);

        // root -> Document -> ImageCreationTime
        addElement("ImageCreationTime", "Document",
                   CHILD_POLICY_EMPTY);
        addAttribute("ImageCreationTime", "year",
                     DATATYPE_INTEGER,
                     true,
                     null);
        addAttribute("ImageCreationTime", "month",
                     DATATYPE_INTEGER,
                     true,
                     null,
                     "1", "12", true, true);
        addAttribute("ImageCreationTime", "day",
                     DATATYPE_INTEGER,
                     true,
                     null,
                     "1", "31", true, true);
        addAttribute("ImageCreationTime", "hour",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "23", true, true);
        addAttribute("ImageCreationTime", "minute",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "59", true, true);
        // second = 60 denotes leap second
        addAttribute("ImageCreationTime", "second",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "60", true, true);

        // root -> Document -> ImageModificationTime
        addElement("ImageModificationTime", "Document",
                   CHILD_POLICY_EMPTY);
        addAttribute("ImageModificationTime", "year",
                     DATATYPE_INTEGER,
                     true,
                     null);
        addAttribute("ImageModificationTime", "month",
                     DATATYPE_INTEGER,
                     true,
                     null,
                     "1", "12", true, true);
        addAttribute("ImageModificationTime", "day",
                     DATATYPE_INTEGER,
                     true,
                     null,
                     "1", "31", true, true);
        addAttribute("ImageModificationTime", "hour",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "23", true, true);
        addAttribute("ImageModificationTime", "minute",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "59", true, true);
        // second = 60 denotes leap second
        addAttribute("ImageModificationTime", "second",
                     DATATYPE_INTEGER,
                     false,
                     "0",
                     "0", "60", true, true);

        // root -> Text
        addElement("Text", standardMetadataFormatName,
                   0, Integer.MAX_VALUE);

        // root -> Text -> TextEntry
        addElement("TextEntry", "Text", CHILD_POLICY_EMPTY);
        addAttribute("TextEntry", "keyword",
                     DATATYPE_STRING,
                     false,
                     null);
        addAttribute("TextEntry", "value",
                     DATATYPE_STRING,
                     true,
                     null);
        addAttribute("TextEntry", "language",
                     DATATYPE_STRING,
                     false,
                     null);
        addAttribute("TextEntry", "encoding",
                     DATATYPE_STRING,
                     false,
                     null);

        values = new ArrayList();
        values.add("none");
        values.add("lzw");
        values.add("zip");
        values.add("bzip");
        values.add("other");
        addAttribute("TextEntry", "compression",
                     DATATYPE_STRING,
                     false,
                     "none",
                     values);

        // root -> Transparency
        addElement("Transparency", standardMetadataFormatName,
                   CHILD_POLICY_SOME);

        // root -> Transparency -> Alpha
        addElement("Alpha", "Transparency", CHILD_POLICY_EMPTY);

        values = new ArrayList();
        values.add("none");
        values.add("premultiplied");
        values.add("nonpremultiplied");
        addAttribute("Alpha", "value",
                     DATATYPE_STRING,
                     false,
                     "none",
                     values);

        // root -> Transparency -> TransparentIndex
        addSingleAttributeElement("TransparentIndex", "Transparency",
                                  DATATYPE_INTEGER);

        // root -> Transparency -> TransparentColor
        addElement("TransparentColor", "Transparency",
                   CHILD_POLICY_EMPTY);
        addAttribute("TransparentColor", "value",
                     DATATYPE_INTEGER,
                     true,
                     0, Integer.MAX_VALUE);

        // root -> Transparency -> TileTransparencies
        addElement("TileTransparencies", "Transparency",
                   0, Integer.MAX_VALUE);

        // root -> Transparency -> TileTransparencies -> TransparentTile
        addElement("TransparentTile", "TileTransparencies",
                   CHILD_POLICY_EMPTY);
        addAttribute("TransparentTile", "x",
                     DATATYPE_INTEGER,
                     true,
                     null);
        addAttribute("TransparentTile", "y",
                     DATATYPE_INTEGER,
                     true,
                     null);

        // root -> Transparency -> TileOpacities
        addElement("TileOpacities", "Transparency",
                   0, Integer.MAX_VALUE);

        // root -> Transparency -> TileOpacities -> OpaqueTile
        addElement("OpaqueTile", "TileOpacities",
                   CHILD_POLICY_EMPTY);
        addAttribute("OpaqueTile", "x",
                     DATATYPE_INTEGER,
                     true,
                     null);
        addAttribute("OpaqueTile", "y",
                     DATATYPE_INTEGER,
                     true,
                     null);
    }

    public boolean canNodeAppear(String elementName,
                                 ImageTypeSpecifier imageType) {
            return true;
    }
}
