| /* |
| * 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 |
| } |
| } |
| } |