1057 lines
33 KiB
Java
1057 lines
33 KiB
Java
|
/*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
* contributor license agreements. See the NOTICE file distributed with
|
||
|
* this work for additional information regarding copyright ownership.
|
||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||
|
* (the "License"); you may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package javax.imageio.metadata;
|
||
|
|
||
|
import javax.imageio.ImageTypeSpecifier;
|
||
|
import java.util.*;
|
||
|
import java.security.AccessController;
|
||
|
import java.security.PrivilegedAction;
|
||
|
|
||
|
/**
|
||
|
* The IIOMetadataFormatImpl class provides an implementation of the
|
||
|
* IIOMetadataFormat interface.
|
||
|
*
|
||
|
* @since Android 1.0
|
||
|
*/
|
||
|
public abstract class IIOMetadataFormatImpl implements IIOMetadataFormat {
|
||
|
|
||
|
/**
|
||
|
* The Constant standardMetadataFormatName.
|
||
|
*/
|
||
|
@SuppressWarnings( {
|
||
|
"ConstantDeclaredInAbstractClass"
|
||
|
})
|
||
|
public static final String standardMetadataFormatName = "javax_imageio_1.0";
|
||
|
|
||
|
/**
|
||
|
* The standard format.
|
||
|
*/
|
||
|
@SuppressWarnings( {
|
||
|
"StaticNonFinalField"
|
||
|
})
|
||
|
private static IIOMetadataFormatImpl standardFormat;
|
||
|
|
||
|
/**
|
||
|
* The root name.
|
||
|
*/
|
||
|
private String rootName;
|
||
|
|
||
|
/**
|
||
|
* The element hash.
|
||
|
*/
|
||
|
private HashMap<String, Element> elementHash = new HashMap<String, Element>();
|
||
|
|
||
|
/**
|
||
|
* The resource base name.
|
||
|
*/
|
||
|
private String resourceBaseName = getClass().getName() + "Resources";
|
||
|
|
||
|
/**
|
||
|
* Instantiates an IIOMetadataFormatImpl with the specified root name and
|
||
|
* child policy (not CHILD_POLICY_REPEAT).
|
||
|
*
|
||
|
* @param rootName
|
||
|
* the name of root element.
|
||
|
* @param childPolicy
|
||
|
* the child policy defined by one of the CHILD_POLICY_*
|
||
|
* constants (except CHILD_POLICY_REPEAT).
|
||
|
*/
|
||
|
public IIOMetadataFormatImpl(String rootName, int childPolicy) {
|
||
|
if (rootName == null) {
|
||
|
throw new IllegalArgumentException("rootName is null");
|
||
|
}
|
||
|
if (childPolicy < CHILD_POLICY_EMPTY || childPolicy > CHILD_POLICY_MAX
|
||
|
|| childPolicy == CHILD_POLICY_REPEAT) {
|
||
|
throw new IllegalArgumentException("childPolicy is not one of the predefined constants");
|
||
|
}
|
||
|
|
||
|
this.rootName = rootName;
|
||
|
Element root = new Element();
|
||
|
root.name = rootName;
|
||
|
root.childPolicy = childPolicy;
|
||
|
elementHash.put(rootName, root);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Instantiates an IIOMetadataFormatImpl with the specified root name and
|
||
|
* CHILD_POLICY_REPEAT child policy.
|
||
|
*
|
||
|
* @param rootName
|
||
|
* the name of root element.
|
||
|
* @param minChildren
|
||
|
* the minimum number of children.
|
||
|
* @param maxChildren
|
||
|
* the maximum number of children
|
||
|
*/
|
||
|
public IIOMetadataFormatImpl(String rootName, int minChildren, int maxChildren) {
|
||
|
if (rootName == null) {
|
||
|
throw new IllegalArgumentException("rootName is null");
|
||
|
}
|
||
|
if (minChildren < 0) {
|
||
|
throw new IllegalArgumentException("minChildren < 0!");
|
||
|
}
|
||
|
if (minChildren > maxChildren) {
|
||
|
throw new IllegalArgumentException("minChildren > maxChildren!");
|
||
|
}
|
||
|
|
||
|
this.rootName = rootName;
|
||
|
Element root = new Element();
|
||
|
root.name = rootName;
|
||
|
root.minChildren = minChildren;
|
||
|
root.maxChildren = maxChildren;
|
||
|
root.childPolicy = CHILD_POLICY_REPEAT;
|
||
|
elementHash.put(rootName, root);
|
||
|
}
|
||
|
|
||
|
@SuppressWarnings( {
|
||
|
"AbstractMethodOverridesAbstractMethod"
|
||
|
})
|
||
|
public abstract boolean canNodeAppear(String elementName, ImageTypeSpecifier imageType);
|
||
|
|
||
|
/**
|
||
|
* Adds a new attribute to an existing element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to which the new attribute will be
|
||
|
* added.
|
||
|
* @param attrName
|
||
|
* the attribute name.
|
||
|
* @param dataType
|
||
|
* the data type of the new attribute.
|
||
|
* @param required
|
||
|
* the flag which indicates whether this attribute must be
|
||
|
* present.
|
||
|
* @param listMinLength
|
||
|
* the minimum legal number of list items.
|
||
|
* @param listMaxLength
|
||
|
* the the maximum legal number of list items.
|
||
|
*/
|
||
|
protected void addAttribute(String elementName, String attrName, int dataType,
|
||
|
boolean required, int listMinLength, int listMaxLength) {
|
||
|
if (attrName == null) {
|
||
|
throw new IllegalArgumentException("attrName == null!");
|
||
|
}
|
||
|
if (dataType < DATATYPE_STRING || dataType > DATATYPE_DOUBLE) {
|
||
|
throw new IllegalArgumentException("Invalid value for dataType!");
|
||
|
}
|
||
|
if (listMinLength < 0 || listMinLength > listMaxLength) {
|
||
|
throw new IllegalArgumentException("Invalid list bounds!");
|
||
|
}
|
||
|
|
||
|
Element element = findElement(elementName);
|
||
|
Attlist attr = new Attlist();
|
||
|
attr.name = attrName;
|
||
|
attr.dataType = dataType;
|
||
|
attr.required = required;
|
||
|
attr.listMinLength = listMinLength;
|
||
|
attr.listMaxLength = listMaxLength;
|
||
|
attr.valueType = VALUE_LIST;
|
||
|
|
||
|
element.attributes.put(attrName, attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new attribute to an existing element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to which the new attribute will be
|
||
|
* added.
|
||
|
* @param attrName
|
||
|
* the attribute name.
|
||
|
* @param dataType
|
||
|
* the data type of the new attribute.
|
||
|
* @param required
|
||
|
* the flag which indicates whether this attribute must be
|
||
|
* present.
|
||
|
* @param defaultValue
|
||
|
* the default value of the attribute.
|
||
|
*/
|
||
|
protected void addAttribute(String elementName, String attrName, int dataType,
|
||
|
boolean required, String defaultValue) {
|
||
|
if (attrName == null) {
|
||
|
throw new IllegalArgumentException("attrName == null!");
|
||
|
}
|
||
|
if (dataType < DATATYPE_STRING || dataType > DATATYPE_DOUBLE) {
|
||
|
throw new IllegalArgumentException("Invalid value for dataType!");
|
||
|
}
|
||
|
|
||
|
Element element = findElement(elementName);
|
||
|
Attlist attr = new Attlist();
|
||
|
attr.name = attrName;
|
||
|
attr.dataType = dataType;
|
||
|
attr.required = required;
|
||
|
attr.defaultValue = defaultValue;
|
||
|
attr.valueType = VALUE_ARBITRARY;
|
||
|
|
||
|
element.attributes.put(attrName, attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new attribute to an existing element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to which the new attribute will be
|
||
|
* added.
|
||
|
* @param attrName
|
||
|
* the attribute name.
|
||
|
* @param dataType
|
||
|
* the data type of the new attribute.
|
||
|
* @param required
|
||
|
* the flag which indicates whether this attribute must be
|
||
|
* present.
|
||
|
* @param defaultValue
|
||
|
* the default value of the attribute.
|
||
|
* @param enumeratedValues
|
||
|
* the legal values for the attribute as a list of strings.
|
||
|
*/
|
||
|
protected void addAttribute(String elementName, String attrName, int dataType,
|
||
|
boolean required, String defaultValue, List<String> enumeratedValues) {
|
||
|
if (attrName == null) {
|
||
|
throw new IllegalArgumentException("attrName == null!");
|
||
|
}
|
||
|
if (dataType < DATATYPE_STRING || dataType > DATATYPE_DOUBLE) {
|
||
|
throw new IllegalArgumentException("Invalid value for dataType!");
|
||
|
}
|
||
|
if (enumeratedValues == null || enumeratedValues.isEmpty()) {
|
||
|
throw new IllegalArgumentException("enumeratedValues is empty or null");
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
for (String enumeratedValue : enumeratedValues) {
|
||
|
if (enumeratedValue == null) {
|
||
|
throw new IllegalArgumentException("enumeratedValues contains a null!");
|
||
|
}
|
||
|
}
|
||
|
} catch (ClassCastException e) {
|
||
|
throw new IllegalArgumentException("enumeratedValues contains a non-String value!");
|
||
|
}
|
||
|
|
||
|
Element element = findElement(elementName);
|
||
|
Attlist attr = new Attlist();
|
||
|
attr.name = attrName;
|
||
|
attr.dataType = dataType;
|
||
|
attr.required = required;
|
||
|
attr.defaultValue = defaultValue;
|
||
|
attr.enumeratedValues = enumeratedValues;
|
||
|
attr.valueType = VALUE_ENUMERATION;
|
||
|
|
||
|
element.attributes.put(attrName, attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new attribute to an existing element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to which the new attribute will be
|
||
|
* added.
|
||
|
* @param attrName
|
||
|
* the attribute name.
|
||
|
* @param dataType
|
||
|
* the data type of the new attribute.
|
||
|
* @param required
|
||
|
* the flag which indicates whether this attribute must be
|
||
|
* present.
|
||
|
* @param defaultValue
|
||
|
* the default value of attribute.
|
||
|
* @param minValue
|
||
|
* the minimum legal value of an attribute.
|
||
|
* @param maxValue
|
||
|
* the maximum legal value of an attribute.
|
||
|
* @param minInclusive
|
||
|
* the flag which indicates whether the minValue is inclusive.
|
||
|
* @param maxInclusive
|
||
|
* the flag which indicates whether the maxValue is inclusive.
|
||
|
*/
|
||
|
protected void addAttribute(String elementName, String attrName, int dataType,
|
||
|
boolean required, String defaultValue, String minValue, String maxValue,
|
||
|
boolean minInclusive, boolean maxInclusive) {
|
||
|
if (attrName == null) {
|
||
|
throw new IllegalArgumentException("attrName == null!");
|
||
|
}
|
||
|
if (dataType < DATATYPE_STRING || dataType > DATATYPE_DOUBLE) {
|
||
|
throw new IllegalArgumentException("Invalid value for dataType!");
|
||
|
}
|
||
|
|
||
|
Element element = findElement(elementName);
|
||
|
Attlist attr = new Attlist();
|
||
|
attr.name = attrName;
|
||
|
attr.dataType = dataType;
|
||
|
attr.required = required;
|
||
|
attr.defaultValue = defaultValue;
|
||
|
attr.minValue = minValue;
|
||
|
attr.maxValue = maxValue;
|
||
|
attr.minInclusive = minInclusive;
|
||
|
attr.maxInclusive = maxInclusive;
|
||
|
|
||
|
attr.valueType = VALUE_RANGE;
|
||
|
attr.valueType |= minInclusive ? VALUE_RANGE_MIN_INCLUSIVE_MASK : 0;
|
||
|
attr.valueType |= maxInclusive ? VALUE_RANGE_MAX_INCLUSIVE_MASK : 0;
|
||
|
|
||
|
element.attributes.put(attrName, attr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new attribute with boolean data type to an existing element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to which the new attribute will be
|
||
|
* added.
|
||
|
* @param attrName
|
||
|
* the attribute name.
|
||
|
* @param hasDefaultValue
|
||
|
* the flag which indicates whether this attribute must have a
|
||
|
* default value.
|
||
|
* @param defaultValue
|
||
|
* the default value.
|
||
|
*/
|
||
|
protected void addBooleanAttribute(String elementName, String attrName,
|
||
|
boolean hasDefaultValue, boolean defaultValue) {
|
||
|
String defaultVal = hasDefaultValue ? (defaultValue ? "TRUE" : "FALSE") : null;
|
||
|
ArrayList<String> values = new ArrayList<String>(2);
|
||
|
values.add("TRUE");
|
||
|
values.add("FALSE");
|
||
|
|
||
|
addAttribute(elementName, attrName, DATATYPE_BOOLEAN, true, defaultVal, values);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an existing element to the list of child elements of the specified
|
||
|
* parent element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to be added.
|
||
|
* @param parentName
|
||
|
* the parent element name.
|
||
|
*/
|
||
|
protected void addChildElement(String elementName, String parentName) {
|
||
|
Element parent = findElement(parentName);
|
||
|
Element element = findElement(elementName);
|
||
|
parent.children.add(element.name);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new element type to this IIOMetadataFormat with a child policy (if
|
||
|
* policy is not CHILD_POLICY_REPEAT).
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the name of the element to be added.
|
||
|
* @param parentName
|
||
|
* the parent element name.
|
||
|
* @param childPolicy
|
||
|
* one of the CHILD_POLICY_* constants defined by
|
||
|
* IIOMetadataFormat.
|
||
|
*/
|
||
|
protected void addElement(String elementName, String parentName, int childPolicy) {
|
||
|
if (childPolicy < CHILD_POLICY_EMPTY || childPolicy > CHILD_POLICY_MAX
|
||
|
|| childPolicy == CHILD_POLICY_REPEAT) {
|
||
|
throw new IllegalArgumentException("childPolicy is not one of the predefined constants");
|
||
|
}
|
||
|
|
||
|
Element parent = findElement(parentName);
|
||
|
Element element = new Element();
|
||
|
element.name = elementName;
|
||
|
element.childPolicy = childPolicy;
|
||
|
elementHash.put(elementName, element);
|
||
|
parent.children.add(elementName);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds a new element type to this IIOMetadataFormat with
|
||
|
* CHILD_POLICY_REPEAT and the specified minimum and maximum number of child
|
||
|
* elements.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name to be added.
|
||
|
* @param parentName
|
||
|
* the parent element name.
|
||
|
* @param minChildren
|
||
|
* the minimum number of child elements.
|
||
|
* @param maxChildren
|
||
|
* the maximum number of child elements.
|
||
|
*/
|
||
|
protected void addElement(String elementName, String parentName, int minChildren,
|
||
|
int maxChildren) {
|
||
|
if (minChildren < 0) {
|
||
|
throw new IllegalArgumentException("minChildren < 0!");
|
||
|
}
|
||
|
if (minChildren > maxChildren) {
|
||
|
throw new IllegalArgumentException("minChildren > maxChildren!");
|
||
|
}
|
||
|
|
||
|
Element parent = findElement(parentName);
|
||
|
Element element = new Element();
|
||
|
element.name = elementName;
|
||
|
element.childPolicy = CHILD_POLICY_REPEAT;
|
||
|
element.minChildren = minChildren;
|
||
|
element.maxChildren = maxChildren;
|
||
|
elementHash.put(elementName, element);
|
||
|
parent.children.add(elementName);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an Object reference with the specified class type to be stored as
|
||
|
* element's value.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @param classType
|
||
|
* the class indicates the legal types for the object's value.
|
||
|
* @param arrayMinLength
|
||
|
* the minimum legal length for the array.
|
||
|
* @param arrayMaxLength
|
||
|
* the maximum legal length for the array.
|
||
|
*/
|
||
|
protected void addObjectValue(String elementName, Class<?> classType, int arrayMinLength,
|
||
|
int arrayMaxLength) {
|
||
|
Element element = findElement(elementName);
|
||
|
|
||
|
ObjectValue objVal = new ObjectValue();
|
||
|
objVal.classType = classType;
|
||
|
objVal.arrayMaxLength = arrayMaxLength;
|
||
|
objVal.arrayMinLength = arrayMinLength;
|
||
|
objVal.valueType = VALUE_LIST;
|
||
|
|
||
|
element.objectValue = objVal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an Object reference with the specified class type to be stored as an
|
||
|
* element's value.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @param classType
|
||
|
* the class indicates the legal types for the object's value.
|
||
|
* @param required
|
||
|
* a flag indicated that this object value must be present.
|
||
|
* @param defaultValue
|
||
|
* the default value, or null.
|
||
|
*/
|
||
|
protected <T> void addObjectValue(String elementName, Class<T> classType, boolean required,
|
||
|
T defaultValue) {
|
||
|
// note: reqired is an unused parameter
|
||
|
Element element = findElement(elementName);
|
||
|
|
||
|
ObjectValue<T> objVal = new ObjectValue<T>();
|
||
|
objVal.classType = classType;
|
||
|
objVal.defaultValue = defaultValue;
|
||
|
objVal.valueType = VALUE_ARBITRARY;
|
||
|
|
||
|
element.objectValue = objVal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an Object reference with the specified class type to be stored as
|
||
|
* the element's value.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @param classType
|
||
|
* the class indicates the legal types for the object value.
|
||
|
* @param required
|
||
|
* a flag indicated that this object value must be present.
|
||
|
* @param defaultValue
|
||
|
* the default value, or null.
|
||
|
* @param enumeratedValues
|
||
|
* the list of legal values for the object.
|
||
|
*/
|
||
|
protected <T> void addObjectValue(String elementName, Class<T> classType, boolean required,
|
||
|
T defaultValue, List<? extends T> enumeratedValues) {
|
||
|
// note: reqired is an unused parameter
|
||
|
if (enumeratedValues == null || enumeratedValues.isEmpty()) {
|
||
|
throw new IllegalArgumentException("enumeratedValues is empty or null");
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
for (T enumeratedValue : enumeratedValues) {
|
||
|
if (enumeratedValue == null) {
|
||
|
throw new IllegalArgumentException("enumeratedValues contains a null!");
|
||
|
}
|
||
|
}
|
||
|
} catch (ClassCastException e) {
|
||
|
throw new IllegalArgumentException(
|
||
|
"enumeratedValues contains a value not of class classType!");
|
||
|
}
|
||
|
|
||
|
Element element = findElement(elementName);
|
||
|
|
||
|
ObjectValue<T> objVal = new ObjectValue<T>();
|
||
|
objVal.classType = classType;
|
||
|
objVal.defaultValue = defaultValue;
|
||
|
objVal.enumeratedValues = enumeratedValues;
|
||
|
objVal.valueType = VALUE_ENUMERATION;
|
||
|
|
||
|
element.objectValue = objVal;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an Object reference with the specified class type to be stored as
|
||
|
* the element's value.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @param classType
|
||
|
* the class indicates the legal types for the object value.
|
||
|
* @param defaultValue
|
||
|
* the default value, or null.
|
||
|
* @param minValue
|
||
|
* the minimum legal value for the object value.
|
||
|
* @param maxValue
|
||
|
* the maximum legal value for the object value.
|
||
|
* @param minInclusive
|
||
|
* the flag which indicates whether the minValue is inclusive.
|
||
|
* @param maxInclusive
|
||
|
* the flag which indicates whether the maxValue is inclusive.
|
||
|
*/
|
||
|
protected <T extends Object & Comparable<? super T>> void addObjectValue(String elementName,
|
||
|
Class<T> classType, T defaultValue, Comparable<? super T> minValue,
|
||
|
Comparable<? super T> maxValue, boolean minInclusive, boolean maxInclusive) {
|
||
|
Element element = findElement(elementName);
|
||
|
|
||
|
ObjectValue<T> objVal = new ObjectValue<T>();
|
||
|
objVal.classType = classType;
|
||
|
objVal.defaultValue = defaultValue;
|
||
|
objVal.minValue = minValue;
|
||
|
objVal.maxValue = maxValue;
|
||
|
objVal.minInclusive = minInclusive;
|
||
|
objVal.maxInclusive = maxInclusive;
|
||
|
|
||
|
objVal.valueType = VALUE_RANGE;
|
||
|
objVal.valueType |= minInclusive ? VALUE_RANGE_MIN_INCLUSIVE_MASK : 0;
|
||
|
objVal.valueType |= maxInclusive ? VALUE_RANGE_MAX_INCLUSIVE_MASK : 0;
|
||
|
|
||
|
element.objectValue = objVal;
|
||
|
}
|
||
|
|
||
|
public int getAttributeDataType(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
return attr.dataType;
|
||
|
}
|
||
|
|
||
|
public String getAttributeDefaultValue(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
return attr.defaultValue;
|
||
|
}
|
||
|
|
||
|
public String getAttributeDescription(String elementName, String attrName, Locale locale) {
|
||
|
findAttribute(elementName, attrName);
|
||
|
return getResourceString(elementName + "/" + attrName, locale);
|
||
|
}
|
||
|
|
||
|
public String[] getAttributeEnumerations(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
if (attr.valueType != VALUE_ENUMERATION) {
|
||
|
throw new IllegalArgumentException("Attribute is not an enumeration!");
|
||
|
}
|
||
|
|
||
|
return attr.enumeratedValues.toArray(new String[attr.enumeratedValues.size()]);
|
||
|
}
|
||
|
|
||
|
public int getAttributeListMaxLength(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
if (attr.valueType != VALUE_LIST) {
|
||
|
throw new IllegalArgumentException("Attribute is not a list!");
|
||
|
}
|
||
|
return attr.listMaxLength;
|
||
|
}
|
||
|
|
||
|
public int getAttributeListMinLength(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
if (attr.valueType != VALUE_LIST) {
|
||
|
throw new IllegalArgumentException("Attribute is not a list!");
|
||
|
}
|
||
|
return attr.listMinLength;
|
||
|
}
|
||
|
|
||
|
public String getAttributeMaxValue(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
if ((attr.valueType & VALUE_RANGE) == 0) {
|
||
|
throw new IllegalArgumentException("Attribute is not a range!");
|
||
|
}
|
||
|
return attr.maxValue;
|
||
|
}
|
||
|
|
||
|
public String getAttributeMinValue(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
if ((attr.valueType & VALUE_RANGE) == 0) {
|
||
|
throw new IllegalArgumentException("Attribute is not a range!");
|
||
|
}
|
||
|
return attr.minValue;
|
||
|
}
|
||
|
|
||
|
public String[] getAttributeNames(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
return element.attributes.keySet().toArray(new String[element.attributes.size()]);
|
||
|
}
|
||
|
|
||
|
public int getAttributeValueType(String elementName, String attrName) {
|
||
|
Attlist attr = findAttribute(elementName, attrName);
|
||
|
return attr.valueType;
|
||
|
}
|
||
|
|
||
|
public String[] getChildNames(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
if (element.childPolicy == CHILD_POLICY_EMPTY) { // Element cannot have
|
||
|
// children
|
||
|
return null;
|
||
|
}
|
||
|
return element.children.toArray(new String[element.children.size()]);
|
||
|
}
|
||
|
|
||
|
public int getChildPolicy(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
return element.childPolicy;
|
||
|
}
|
||
|
|
||
|
public String getElementDescription(String elementName, Locale locale) {
|
||
|
findElement(elementName); // Check if there is such element
|
||
|
return getResourceString(elementName, locale);
|
||
|
}
|
||
|
|
||
|
public int getElementMaxChildren(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
if (element.childPolicy != CHILD_POLICY_REPEAT) {
|
||
|
throw new IllegalArgumentException("Child policy is not CHILD_POLICY_REPEAT!");
|
||
|
}
|
||
|
return element.maxChildren;
|
||
|
}
|
||
|
|
||
|
public int getElementMinChildren(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
if (element.childPolicy != CHILD_POLICY_REPEAT) {
|
||
|
throw new IllegalArgumentException("Child policy is not CHILD_POLICY_REPEAT!");
|
||
|
}
|
||
|
return element.minChildren;
|
||
|
}
|
||
|
|
||
|
public int getObjectArrayMaxLength(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null || v.valueType != VALUE_LIST) {
|
||
|
throw new IllegalArgumentException("Not a list!");
|
||
|
}
|
||
|
return v.arrayMaxLength;
|
||
|
}
|
||
|
|
||
|
public int getObjectArrayMinLength(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null || v.valueType != VALUE_LIST) {
|
||
|
throw new IllegalArgumentException("Not a list!");
|
||
|
}
|
||
|
return v.arrayMinLength;
|
||
|
}
|
||
|
|
||
|
public Class<?> getObjectClass(String elementName) {
|
||
|
ObjectValue v = findObjectValue(elementName);
|
||
|
return v.classType;
|
||
|
}
|
||
|
|
||
|
public Object getObjectDefaultValue(String elementName) {
|
||
|
ObjectValue v = findObjectValue(elementName);
|
||
|
return v.defaultValue;
|
||
|
}
|
||
|
|
||
|
public Object[] getObjectEnumerations(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null || v.valueType != VALUE_ENUMERATION) {
|
||
|
throw new IllegalArgumentException("Not an enumeration!");
|
||
|
}
|
||
|
return v.enumeratedValues.toArray();
|
||
|
}
|
||
|
|
||
|
public Comparable<?> getObjectMaxValue(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null || (v.valueType & VALUE_RANGE) == 0) {
|
||
|
throw new IllegalArgumentException("Not a range!");
|
||
|
}
|
||
|
return v.maxValue;
|
||
|
}
|
||
|
|
||
|
public Comparable<?> getObjectMinValue(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null || (v.valueType & VALUE_RANGE) == 0) {
|
||
|
throw new IllegalArgumentException("Not a range!");
|
||
|
}
|
||
|
return v.minValue;
|
||
|
}
|
||
|
|
||
|
public int getObjectValueType(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
if (element.objectValue == null) {
|
||
|
return VALUE_NONE;
|
||
|
}
|
||
|
return element.objectValue.valueType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the resource base name for locating ResourceBundles.
|
||
|
*
|
||
|
* @return the current resource base name.
|
||
|
*/
|
||
|
protected String getResourceBaseName() {
|
||
|
return resourceBaseName;
|
||
|
}
|
||
|
|
||
|
public String getRootName() {
|
||
|
return rootName;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the standard format instance.
|
||
|
*
|
||
|
* @return the IIOMetadataFormat instance.
|
||
|
*/
|
||
|
public static IIOMetadataFormat getStandardFormatInstance() {
|
||
|
if (standardFormat == null) {
|
||
|
standardFormat = new IIOStandardMetadataFormat();
|
||
|
}
|
||
|
|
||
|
return standardFormat;
|
||
|
}
|
||
|
|
||
|
public boolean isAttributeRequired(String elementName, String attrName) {
|
||
|
return findAttribute(elementName, attrName).required;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the specified attribute from the specified element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the specified element name.
|
||
|
* @param attrName
|
||
|
* the specified attribute name.
|
||
|
*/
|
||
|
protected void removeAttribute(String elementName, String attrName) {
|
||
|
Element element = findElement(elementName);
|
||
|
element.attributes.remove(attrName);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the specified element from this format.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the specified element name.
|
||
|
*/
|
||
|
protected void removeElement(String elementName) {
|
||
|
Element element;
|
||
|
if ((element = elementHash.get(elementName)) != null) {
|
||
|
elementHash.remove(elementName);
|
||
|
for (Element e : elementHash.values()) {
|
||
|
e.children.remove(element.name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the object value from the specified element.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
*/
|
||
|
protected void removeObjectValue(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
element.objectValue = null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a new base name for ResourceBundles containing descriptions of
|
||
|
* elements and attributes for this format.
|
||
|
*
|
||
|
* @param resourceBaseName
|
||
|
* the new resource base name.
|
||
|
*/
|
||
|
protected void setResourceBaseName(String resourceBaseName) {
|
||
|
if (resourceBaseName == null) {
|
||
|
throw new IllegalArgumentException("resourceBaseName == null!");
|
||
|
}
|
||
|
this.resourceBaseName = resourceBaseName;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The Class Element.
|
||
|
*/
|
||
|
@SuppressWarnings( {
|
||
|
"ClassWithoutConstructor"
|
||
|
})
|
||
|
private class Element {
|
||
|
|
||
|
/**
|
||
|
* The name.
|
||
|
*/
|
||
|
String name;
|
||
|
|
||
|
/**
|
||
|
* The children.
|
||
|
*/
|
||
|
ArrayList<String> children = new ArrayList<String>();
|
||
|
|
||
|
/**
|
||
|
* The attributes.
|
||
|
*/
|
||
|
HashMap<String, Attlist> attributes = new HashMap<String, Attlist>();
|
||
|
|
||
|
/**
|
||
|
* The min children.
|
||
|
*/
|
||
|
int minChildren;
|
||
|
|
||
|
/**
|
||
|
* The max children.
|
||
|
*/
|
||
|
int maxChildren;
|
||
|
|
||
|
/**
|
||
|
* The child policy.
|
||
|
*/
|
||
|
int childPolicy;
|
||
|
|
||
|
/**
|
||
|
* The object value.
|
||
|
*/
|
||
|
ObjectValue objectValue;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The Class Attlist.
|
||
|
*/
|
||
|
@SuppressWarnings( {
|
||
|
"ClassWithoutConstructor"
|
||
|
})
|
||
|
private class Attlist {
|
||
|
|
||
|
/**
|
||
|
* The name.
|
||
|
*/
|
||
|
String name;
|
||
|
|
||
|
/**
|
||
|
* The data type.
|
||
|
*/
|
||
|
int dataType;
|
||
|
|
||
|
/**
|
||
|
* The required.
|
||
|
*/
|
||
|
boolean required;
|
||
|
|
||
|
/**
|
||
|
* The list min length.
|
||
|
*/
|
||
|
int listMinLength;
|
||
|
|
||
|
/**
|
||
|
* The list max length.
|
||
|
*/
|
||
|
int listMaxLength;
|
||
|
|
||
|
/**
|
||
|
* The default value.
|
||
|
*/
|
||
|
String defaultValue;
|
||
|
|
||
|
/**
|
||
|
* The enumerated values.
|
||
|
*/
|
||
|
List<String> enumeratedValues;
|
||
|
|
||
|
/**
|
||
|
* The min value.
|
||
|
*/
|
||
|
String minValue;
|
||
|
|
||
|
/**
|
||
|
* The max value.
|
||
|
*/
|
||
|
String maxValue;
|
||
|
|
||
|
/**
|
||
|
* The min inclusive.
|
||
|
*/
|
||
|
boolean minInclusive;
|
||
|
|
||
|
/**
|
||
|
* The max inclusive.
|
||
|
*/
|
||
|
boolean maxInclusive;
|
||
|
|
||
|
/**
|
||
|
* The value type.
|
||
|
*/
|
||
|
int valueType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The Class ObjectValue.
|
||
|
*/
|
||
|
@SuppressWarnings( {
|
||
|
"ClassWithoutConstructor"
|
||
|
})
|
||
|
private class ObjectValue<T> {
|
||
|
|
||
|
/**
|
||
|
* The class type.
|
||
|
*/
|
||
|
Class<T> classType;
|
||
|
|
||
|
/**
|
||
|
* The array min length.
|
||
|
*/
|
||
|
int arrayMinLength;
|
||
|
|
||
|
/**
|
||
|
* The array max length.
|
||
|
*/
|
||
|
int arrayMaxLength;
|
||
|
|
||
|
/**
|
||
|
* The default value.
|
||
|
*/
|
||
|
T defaultValue;
|
||
|
|
||
|
/**
|
||
|
* The enumerated values.
|
||
|
*/
|
||
|
List<? extends T> enumeratedValues;
|
||
|
|
||
|
/**
|
||
|
* The min value.
|
||
|
*/
|
||
|
Comparable<? super T> minValue;
|
||
|
|
||
|
/**
|
||
|
* The max value.
|
||
|
*/
|
||
|
Comparable<? super T> maxValue;
|
||
|
|
||
|
/**
|
||
|
* The min inclusive.
|
||
|
*/
|
||
|
boolean minInclusive;
|
||
|
|
||
|
/**
|
||
|
* The max inclusive.
|
||
|
*/
|
||
|
boolean maxInclusive;
|
||
|
|
||
|
/**
|
||
|
* The value type.
|
||
|
*/
|
||
|
int valueType;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Find element.
|
||
|
*
|
||
|
* @param name
|
||
|
* the name.
|
||
|
* @return the element.
|
||
|
*/
|
||
|
private Element findElement(String name) {
|
||
|
Element element;
|
||
|
if ((element = elementHash.get(name)) == null) {
|
||
|
throw new IllegalArgumentException("element name is null or no such element: " + name);
|
||
|
}
|
||
|
|
||
|
return element;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Find attribute.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @param attributeName
|
||
|
* the attribute name.
|
||
|
* @return the attlist.
|
||
|
*/
|
||
|
private Attlist findAttribute(String elementName, String attributeName) {
|
||
|
Element element = findElement(elementName);
|
||
|
Attlist attribute;
|
||
|
if ((attribute = element.attributes.get(attributeName)) == null) {
|
||
|
throw new IllegalArgumentException("attribute name is null or no such attribute: "
|
||
|
+ attributeName);
|
||
|
}
|
||
|
|
||
|
return attribute;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Find object value.
|
||
|
*
|
||
|
* @param elementName
|
||
|
* the element name.
|
||
|
* @return the object value.
|
||
|
*/
|
||
|
private ObjectValue findObjectValue(String elementName) {
|
||
|
Element element = findElement(elementName);
|
||
|
ObjectValue v = element.objectValue;
|
||
|
if (v == null) {
|
||
|
throw new IllegalArgumentException("No object within element");
|
||
|
}
|
||
|
return v;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Gets the resource string.
|
||
|
*
|
||
|
* @param key
|
||
|
* the key.
|
||
|
* @param locale
|
||
|
* the locale.
|
||
|
* @return the resource string.
|
||
|
*/
|
||
|
private String getResourceString(String key, Locale locale) {
|
||
|
if (locale == null) {
|
||
|
locale = Locale.getDefault();
|
||
|
}
|
||
|
|
||
|
// Get the context class loader and try to locate the bundle with it
|
||
|
// first
|
||
|
ClassLoader contextClassloader = AccessController
|
||
|
.doPrivileged(new PrivilegedAction<ClassLoader>() {
|
||
|
public ClassLoader run() {
|
||
|
return Thread.currentThread().getContextClassLoader();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Now try to get the resource bundle
|
||
|
ResourceBundle rb;
|
||
|
try {
|
||
|
rb = ResourceBundle.getBundle(resourceBaseName, locale, contextClassloader);
|
||
|
} catch (MissingResourceException e) {
|
||
|
try {
|
||
|
rb = ResourceBundle.getBundle(resourceBaseName, locale);
|
||
|
} catch (MissingResourceException e1) {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
return rb.getString(key);
|
||
|
} catch (MissingResourceException e) {
|
||
|
return null;
|
||
|
} catch (ClassCastException e) {
|
||
|
return null; // Not a string resource
|
||
|
}
|
||
|
}
|
||
|
}
|