/* * Copyright (c) 2000, 2013, 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 javax.imageio.metadata; import java.util.Locale; import javax.imageio.ImageTypeSpecifier; /** * An object describing the structure of metadata documents returned * from IIOMetadata.getAsTree and passed to * IIOMetadata.setFromTree and mergeTree. * Document structures are described by a set of constraints on the * type and number of child elements that may belong to a given parent * element type, the names, types, and values of attributes that may * belong to an element, and the type and values of * Object reference that may be stored at a node. * *

N.B: classes that implement this interface should contain a * method declared as public static getInstance() which * returns an instance of the class. Commonly, an implementation will * construct only a single instance and cache it for future * invocations of getInstance. * *

The structures that may be described by this class are a subset * of those expressible using XML document type definitions (DTDs), * with the addition of some basic information on the datatypes of * attributes and the ability to store an Object * reference within a node. In the future, XML Schemas could be used * to represent these structures, and many others. * *

The differences between * IIOMetadataFormat-described structures and DTDs are as * follows: * *

* */ public interface IIOMetadataFormat { // Child policies /** * A constant returned by getChildPolicy to indicate * that an element may not have any children. In other words, it * is required to be a leaf node. */ int CHILD_POLICY_EMPTY = 0; /** * A constant returned by getChildPolicy to indicate * that an element must have a single instance of each of its * legal child elements, in order. In DTD terms, the contents of * the element are defined by a sequence a,b,c,d,.... */ int CHILD_POLICY_ALL = 1; /** * A constant returned by getChildPolicy to indicate * that an element must have zero or one instance of each of its * legal child elements, in order. In DTD terms, the contents of * the element are defined by a sequence * a?,b?,c?,d?,.... */ int CHILD_POLICY_SOME = 2; /** * A constant returned by getChildPolicy to indicate * that an element must have zero or one children, selected from * among its legal child elements. In DTD terms, the contents of * the element are defined by a selection * a|b|c|d|.... */ int CHILD_POLICY_CHOICE = 3; /** * A constant returned by getChildPolicy to indicate * that an element must have a sequence of instances of any of its * legal child elements. In DTD terms, the contents of the * element are defined by a sequence (a|b|c|d|...)*. */ int CHILD_POLICY_SEQUENCE = 4; /** * A constant returned by getChildPolicy to indicate * that an element must have zero or more instances of its unique * legal child element. In DTD terms, the contents of the element * are defined by a starred expression a*. */ int CHILD_POLICY_REPEAT = 5; /** * The largest valid CHILD_POLICY_* constant, * to be used for range checks. */ int CHILD_POLICY_MAX = CHILD_POLICY_REPEAT; /** * A constant returned by getObjectValueType to * indicate the absence of a user object. */ int VALUE_NONE = 0; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set a single, arbitrary value. */ int VALUE_ARBITRARY = 1; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set a range of values. Both the minimum * and maximum values of the range are exclusive. It is * recommended that ranges of integers be inclusive on both ends, * and that exclusive ranges be used only for floating-point data. * * @see #VALUE_RANGE_MIN_MAX_INCLUSIVE */ int VALUE_RANGE = 2; /** * A value that may be or'ed with VALUE_RANGE to * obtain VALUE_RANGE_MIN_INCLUSIVE, and with * VALUE_RANGE_MAX_INCLUSIVE to obtain * VALUE_RANGE_MIN_MAX_INCLUSIVE. * *

Similarly, the value may be and'ed with the value of * getAttributeValueTypeor * getObjectValueType to determine if the minimum * value of the range is inclusive. */ int VALUE_RANGE_MIN_INCLUSIVE_MASK = 4; /** * A value that may be or'ed with VALUE_RANGE to * obtain VALUE_RANGE_MAX_INCLUSIVE, and with * VALUE_RANGE_MIN_INCLUSIVE to obtain * VALUE_RANGE_MIN_MAX_INCLUSIVE. * *

Similarly, the value may be and'ed with the value of * getAttributeValueTypeor * getObjectValueType to determine if the maximum * value of the range is inclusive. */ int VALUE_RANGE_MAX_INCLUSIVE_MASK = 8; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set to a range of values. The minimum * (but not the maximum) value of the range is inclusive. */ int VALUE_RANGE_MIN_INCLUSIVE = VALUE_RANGE | VALUE_RANGE_MIN_INCLUSIVE_MASK; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set to a range of values. The maximum * (but not the minimum) value of the range is inclusive. */ int VALUE_RANGE_MAX_INCLUSIVE = VALUE_RANGE | VALUE_RANGE_MAX_INCLUSIVE_MASK; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set a range of values. Both the minimum * and maximum values of the range are inclusive. It is * recommended that ranges of integers be inclusive on both ends, * and that exclusive ranges be used only for floating-point data. */ int VALUE_RANGE_MIN_MAX_INCLUSIVE = VALUE_RANGE | VALUE_RANGE_MIN_INCLUSIVE_MASK | VALUE_RANGE_MAX_INCLUSIVE_MASK; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set one of a number of enumerated values. * In the case of attributes, these values are * Strings; for objects, they are * Objects implementing a given class or interface. * *

Attribute values of type DATATYPE_BOOLEAN * should be marked as enumerations. */ int VALUE_ENUMERATION = 16; /** * A constant returned by getAttributeValueType and * getObjectValueType to indicate that the attribute * or user object may be set to a list or array of values. In the * case of attributes, the list will consist of * whitespace-separated values within a String; for * objects, an array will be used. */ int VALUE_LIST = 32; /** * A constant returned by getAttributeDataType * indicating that the value of an attribute is a general Unicode * string. */ int DATATYPE_STRING = 0; /** * A constant returned by getAttributeDataType * indicating that the value of an attribute is one of the boolean * values 'true' or 'false'. * Attribute values of type DATATYPE_BOOLEAN should be marked as * enumerations, and the permitted values should be the string * literal values "TRUE" or "FALSE", although a plugin may also * recognise lower or mixed case equivalents. */ int DATATYPE_BOOLEAN = 1; /** * A constant returned by getAttributeDataType * indicating that the value of an attribute is a string * representation of an integer. */ int DATATYPE_INTEGER = 2; /** * A constant returned by getAttributeDataType * indicating that the value of an attribute is a string * representation of a decimal floating-point number. */ int DATATYPE_FLOAT = 3; /** * A constant returned by getAttributeDataType * indicating that the value of an attribute is a string * representation of a double-precision decimal floating-point * number. */ int DATATYPE_DOUBLE = 4; // Root /** * Returns the name of the root element of the format. * * @return a String. */ String getRootName(); // Multiplicity /** * Returns true if the element (and the subtree below * it) is allowed to appear in a metadata document for an image of * the given type, defined by an ImageTypeSpecifier. * For example, a metadata document format might contain an * element that describes the primary colors of the image, which * would not be allowed when writing a grayscale image. * * @param elementName the name of the element being queried. * @param imageType an ImageTypeSpecifier indicating * the type of the image that will be associated with the * metadata. * * @return true if the node is meaningful for images * of the given type. */ boolean canNodeAppear(String elementName, ImageTypeSpecifier imageType); /** * Returns the minimum number of children of the named element * with child policy CHILD_POLICY_REPEAT. For * example, an element representing color primary information * might be required to have at least 3 children, one for each * primary. * * @param elementName the name of the element being queried. * * @return an int. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element does * not have a child policy of CHILD_POLICY_REPEAT. */ int getElementMinChildren(String elementName); /** * Returns the maximum number of children of the named element * with child policy CHILD_POLICY_REPEAT. For * example, an element representing an entry in an 8-bit color * palette might be allowed to repeat up to 256 times. A value of * Integer.MAX_VALUE may be used to specify that * there is no upper bound. * * @param elementName the name of the element being queried. * * @return an int. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element does * not have a child policy of CHILD_POLICY_REPEAT. */ int getElementMaxChildren(String elementName); /** * Returns a String containing a description of the * named element, or null. The description will be * localized for the supplied Locale if possible. * *

If locale is null, the current * default Locale returned by Locale.getLocale * will be used. * * @param elementName the name of the element. * @param locale the Locale for which localization * will be attempted. * * @return the element description. * * @exception IllegalArgumentException if elementName * is null, or is not a legal element name for this format. */ String getElementDescription(String elementName, Locale locale); // Children /** * Returns one of the constants starting with * CHILD_POLICY_, indicating the legal pattern of * children for the named element. * * @param elementName the name of the element being queried. * * @return one of the CHILD_POLICY_* constants. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. */ int getChildPolicy(String elementName); /** * Returns an array of Strings indicating the names * of the element which are allowed to be children of the named * element, in the order in which they should appear. If the * element cannot have children, null is returned. * * @param elementName the name of the element being queried. * * @return an array of Strings, or null. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. */ String[] getChildNames(String elementName); // Attributes /** * Returns an array of Strings listing the names of * the attributes that may be associated with the named element. * * @param elementName the name of the element being queried. * * @return an array of Strings. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. */ String[] getAttributeNames(String elementName); /** * Returns one of the constants starting with VALUE_, * indicating whether the values of the given attribute within the * named element are arbitrary, constrained to lie within a * specified range, constrained to be one of a set of enumerated * values, or are a whitespace-separated list of arbitrary values. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return one of the VALUE_* constants. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. */ int getAttributeValueType(String elementName, String attrName); /** * Returns one of the constants starting with * DATATYPE_, indicating the format and * interpretation of the value of the given attribute within the * named element. If getAttributeValueType returns * VALUE_LIST, then the legal value is a * whitespace-spearated list of values of the returned datatype. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return one of the DATATYPE_* constants. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. */ int getAttributeDataType(String elementName, String attrName); /** * Returns true if the named attribute must be * present within the named element. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return true if the attribute must be present. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. */ boolean isAttributeRequired(String elementName, String attrName); /** * Returns the default value of the named attribute, if it is not * explicitly present within the named element, as a * String, or null if no default value * is available. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return a String containing the default value, or * null. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. */ String getAttributeDefaultValue(String elementName, String attrName); /** * Returns an array of Strings containing the legal * enumerated values for the given attribute within the named * element. This method should only be called if * getAttributeValueType returns * VALUE_ENUMERATION. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return an array of Strings. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. * @exception IllegalArgumentException if the given attribute is * not defined as an enumeration. */ String[] getAttributeEnumerations(String elementName, String attrName); /** * Returns the minimum legal value for the attribute. Whether * this value is inclusive or exclusive may be determined by the * value of getAttributeValueType. The value is * returned as a String; its interpretation is * dependent on the value of getAttributeDataType. * This method should only be called if * getAttributeValueType returns * VALUE_RANGE_*. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return a String containing the smallest legal * value for the attribute. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. * @exception IllegalArgumentException if the given attribute is * not defined as a range. */ String getAttributeMinValue(String elementName, String attrName); /** * Returns the maximum legal value for the attribute. Whether * this value is inclusive or exclusive may be determined by the * value of getAttributeValueType. The value is * returned as a String; its interpretation is * dependent on the value of getAttributeDataType. * This method should only be called if * getAttributeValueType returns * VALUE_RANGE_*. * * @param elementName the name of the element being queried, as a * String. * @param attrName the name of the attribute being queried. * * @return a String containing the largest legal * value for the attribute. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. * @exception IllegalArgumentException if the given attribute is * not defined as a range. */ String getAttributeMaxValue(String elementName, String attrName); /** * Returns the minimum number of list items that may be used to * define this attribute. The attribute itself is defined as a * String containing multiple whitespace-separated * items. This method should only be called if * getAttributeValueType returns * VALUE_LIST. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return the smallest legal number of list items for the * attribute. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. * @exception IllegalArgumentException if the given attribute is * not defined as a list. */ int getAttributeListMinLength(String elementName, String attrName); /** * Returns the maximum number of list items that may be used to * define this attribute. A value of * Integer.MAX_VALUE may be used to specify that * there is no upper bound. The attribute itself is defined as a * String containing multiple whitespace-separated * items. This method should only be called if * getAttributeValueType returns * VALUE_LIST. * * @param elementName the name of the element being queried. * @param attrName the name of the attribute being queried. * * @return the largest legal number of list items for the * attribute. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. * @exception IllegalArgumentException if the given attribute is * not defined as a list. */ int getAttributeListMaxLength(String elementName, String attrName); /** * Returns a String containing a description of the * named attribute, or null. The description will be * localized for the supplied Locale if possible. * *

If locale is null, the current * default Locale returned by Locale.getLocale * will be used. * * @param elementName the name of the element. * @param attrName the name of the attribute. * @param locale the Locale for which localization * will be attempted. * * @return the attribute description. * * @exception IllegalArgumentException if elementName * is null, or is not a legal element name for this format. * @exception IllegalArgumentException if attrName is * null or is not a legal attribute name for this * element. */ String getAttributeDescription(String elementName, String attrName, Locale locale); // Object value /** * Returns one of the enumerated values starting with * VALUE_, indicating the type of values * (enumeration, range, or array) that are allowed for the * Object reference. If no object value can be * stored within the given element, the result of this method will * be VALUE_NONE. * *

Object references whose legal values are * defined as a range must implement the Comparable * interface. * * @param elementName the name of the element being queried. * * @return one of the VALUE_* constants. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * * @see Comparable */ int getObjectValueType(String elementName); /** * Returns the Class type of the Object * reference stored within the element. If this element may not * contain an Object reference, an * IllegalArgumentException will be thrown. If the * class type is an array, this field indicates the underlying * class type (e.g, for an array of ints, this * method would return int.class). * *

Object references whose legal values are * defined as a range must implement the Comparable * interface. * * @param elementName the name of the element being queried. * * @return a Class object. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). */ Class getObjectClass(String elementName); /** * Returns an Objects containing the default * value for the Object reference within * the named element. * * @param elementName the name of the element being queried. * * @return an Object. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). */ Object getObjectDefaultValue(String elementName); /** * Returns an array of Objects containing the legal * enumerated values for the Object reference within * the named element. This method should only be called if * getObjectValueType returns * VALUE_ENUMERATION. * *

The Object associated with a node that accepts * enumerated values must be equal to one of the values returned by * this method, as defined by the == operator (as * opposed to the Object.equals method). * * @param elementName the name of the element being queried. * * @return an array of Objects. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). * @exception IllegalArgumentException if the Object * is not defined as an enumeration. */ Object[] getObjectEnumerations(String elementName); /** * Returns the minimum legal value for the Object * reference within the named element. Whether this value is * inclusive or exclusive may be determined by the value of * getObjectValueType. This method should only be * called if getObjectValueType returns one of the * constants starting with VALUE_RANGE. * * @param elementName the name of the element being queried. * * @return the smallest legal value for the attribute. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). * @exception IllegalArgumentException if the Object * is not defined as a range. */ Comparable getObjectMinValue(String elementName); /** * Returns the maximum legal value for the Object * reference within the named element. Whether this value is * inclusive or exclusive may be determined by the value of * getObjectValueType. This method should only be * called if getObjectValueType returns one of the * constants starting with VALUE_RANGE. * * @return the smallest legal value for the attribute. * * @param elementName the name of the element being queried. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). * @exception IllegalArgumentException if the Object * is not defined as a range. */ Comparable getObjectMaxValue(String elementName); /** * Returns the minimum number of array elements that may be used * to define the Object reference within the named * element. This method should only be called if * getObjectValueType returns * VALUE_LIST. * * @param elementName the name of the element being queried. * * @return the smallest valid array length for the * Object reference. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). * @exception IllegalArgumentException if the Object is not * an array. */ int getObjectArrayMinLength(String elementName); /** * Returns the maximum number of array elements that may be used * to define the Object reference within the named * element. A value of Integer.MAX_VALUE may be used * to specify that there is no upper bound. This method should * only be called if getObjectValueType returns * VALUE_LIST. * * @param elementName the name of the element being queried. * * @return the largest valid array length for the * Object reference. * * @exception IllegalArgumentException if elementName * is null or is not a legal element name for this * format. * @exception IllegalArgumentException if the named element cannot * contain an object value (i.e., if * getObjectValueType(elementName) == VALUE_NONE). * @exception IllegalArgumentException if the Object is not * an array. */ int getObjectArrayMaxLength(String elementName); }