aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/jar/Attributes.java
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2000-11-18 02:00:06 +0000
committerMark Wielaard <mark@gcc.gnu.org>2000-11-18 02:00:06 +0000
commitc5f651bf3ff1ec27c25ebdcd14d55bc125c020a4 (patch)
tree1cdd2c04005f269ae818823da99af56069055ae4 /libjava/java/util/jar/Attributes.java
parentc003f37865e09e796e26de62b6eb9c1dfa03e632 (diff)
downloadgcc-c5f651bf3ff1ec27c25ebdcd14d55bc125c020a4.zip
gcc-c5f651bf3ff1ec27c25ebdcd14d55bc125c020a4.tar.gz
gcc-c5f651bf3ff1ec27c25ebdcd14d55bc125c020a4.tar.bz2
backport: *.java: Reformat all to unofficial standard coding style.
Merge with Classpath (changes by Bryce McKinlay) * java/util/jar/*.java: Reformat all to unofficial standard coding style. No changes of substance. From-SVN: r37538
Diffstat (limited to 'libjava/java/util/jar/Attributes.java')
-rw-r--r--libjava/java/util/jar/Attributes.java955
1 files changed, 491 insertions, 464 deletions
diff --git a/libjava/java/util/jar/Attributes.java b/libjava/java/util/jar/Attributes.java
index 6a01be5..b18b5d8 100644
--- a/libjava/java/util/jar/Attributes.java
+++ b/libjava/java/util/jar/Attributes.java
@@ -7,7 +7,7 @@ GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
-
+
GNU Classpath 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
@@ -54,533 +54,560 @@ import java.util.Set;
* @see java.util.jar.Attributes.Name
* @author Mark Wielaard (mark@klomp.org)
*/
-public class Attributes implements Cloneable, Map {
+public class Attributes implements Cloneable, Map
+{
+
+ // Fields
+
+ /**
+ * The map that holds all the attribute name/value pairs. In this
+ * implementation it is actually a Hashtable, but that can be different in
+ * other implementations.
+ */
+ protected Map map;
+
+ // Inner class
+
+ /**
+ * Represents a name of a Manifest Attribute. Defines a couple of well
+ * know names for the general main attributes, stand alone application
+ * attributes, applet attributes, extension identification attributes,
+ * package versioning and sealing attributes, file contents attributes,
+ * bean objects attribute and signing attributes. See the
+ * <p>
+ * The characters of a Name must obey the following restrictions:
+ * <ul>
+ * <li> Must contain at least one character
+ * <li> The first character must be alphanumeric (a-z, A-Z, 0-9)
+ * <li> All other characters must be alphanumeric, a '-' or a '_'
+ * </ul>
+ * <p>
+ * When comparing Names (with <code>equals</code>) all characters are
+ * converted to lowercase. But you can get the original case sensitive
+ * string with the <code>toString()</code> method.
+ *
+ * @since 1.2
+ * @author Mark Wielaard (mark@klomp.org)
+ */
+ public static class Name
+ {
// Fields
+ // General Main Attributes
+
/**
- * The map that holds all the attribute name/value pairs. In this
- * implementation it is actually a Hashtable, but that can be different in
- * other implementations.
+ * General main attribute -
+ * the version of this Manifest file.
*/
- protected Map map;
-
- // Inner class
-
+ public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
/**
- * Represents a name of a Manifest Attribute. Defines a couple of well
- * know names for the general main attributes, stand alone application
- * attributes, applet attributes, extension identification attributes,
- * package versioning and sealing attributes, file contents attributes,
- * bean objects attribute and signing attributes. See the
- * <p>
- * The characters of a Name must obey the following restrictions:
- * <ul>
- * <li> Must contain at least one character
- * <li> The first character must be alphanumeric (a-z, A-Z, 0-9)
- * <li> All other characters must be alphanumeric, a '-' or a '_'
- * </ul>
- * <p>
- * When comparing Names (with <code>equals</code>) all characters are
- * converted to lowercase. But you can get the original case sensitive
- * string with the <code>toString()</code> method.
- *
- * @since 1.2
- * @author Mark Wielaard (mark@klomp.org)
+ * General main attribute -
+ * tool and version that created this Manifest file.
*/
- public static class Name {
-
- // Fields
-
- // General Main Attributes
-
- /**
- * General main attribute -
- * the version of this Manifest file.
- */
- public static final Name MANIFEST_VERSION
- = new Name("Manifest-Version");
- /**
- * General main attribute -
- * tool and version that created this Manifest file.
- */
- public static final Name CREATED_BY
- = new Name("Created-By");
- /**
- * General main attribute -
- * the version of the jar file signature.
- */
- public static final Name SIGNATURE_VERSION
- = new Name("Signature-Version");
- /**
- * General main attribute -
- * (relative) URLs of the libraries/classpaths that the Classes in
- * this jar file depend on.
- */
- public static final Name CLASS_PATH
- = new Name("Class-Path");
-
- /**
- * Stand alone application attribute -
- * the entry (without the .class ending) that is the main
- * class of this jar file.
- */
- public static final Name MAIN_CLASS
- = new Name("Main-Class");
-
- /**
- * Applet attribute -
- * a list of extension libraries that the applet in this
- * jar file depends on.
- * For every named extension there should be some Attributes in the
- * Manifest manifest file with the following Names:
- * <ul>
- * <li> &lt;extension&gt;-Extension-Name:
- * unique name of the extension
- * <li> &lt;extension&gt;-Specification-Version:
- * minimum specification version
- * <li> &lt;extension&gt;-Implementation-Version:
- * minimum implementation version
- * <li> &lt;extension&gt;-Implementation-Vendor-Id:
- * unique id of implementation vendor
- * <li> &lt;extension&gt;-Implementation-URL:
- * where the latest version of the extension library can be found
- * </ul>
- */
- public static final Name EXTENSION_LIST
- = new Name("Extension-List");
-
- /**
- * Extension identification attribute -
- * the name if the extension library contained in the jar.
- */
- public static final Name EXTENSION_NAME
- = new Name("Extension-Name");
- /**
- * Extension identification attribute -
- * synonym for <code>EXTENSTION_NAME</code>.
- */
- public static final Name EXTENSION_INSTALLATION
- = EXTENSION_NAME;
-
- // Package versioning and sealing attributes
- /**
- * Package versioning -
- * name of extension library contained in this jar.
- */
- public static final Name IMPLEMENTATION_TITLE
- = new Name("Implementation-Title");
- /**
- * Package versioning -
- * version of the extension library contained in this jar.
- */
- public static final Name IMPLEMENTATION_VERSION
- = new Name("Implementation-Version");
- /**
- * Package versioning -
- * name of extension library creator contained in this jar.
- */
- public static final Name IMPLEMENTATION_VENDOR
- = new Name("Implementation-Vendor");
- /**
- * Package versioning -
- * unique id of extension library creator.
- */
- public static final Name IMPLEMENTATION_VENDOR_ID
- = new Name("Implementation-Vendor-Id");
- /**
- * Package versioning -
- * location where this implementation can be downloaded.
- */
- public static final Name IMPLEMENTATION_URL
- = new Name("Implementation-URL");
- /**
- * Package versioning -
- * title of the specification contained in this jar.
- */
- public static final Name SPECIFICATION_TITLE
- = new Name("Specification-Title");
- /**
- * Package versioning -
- * version of the specification contained in this jar.
- */
- public static final Name SPECIFICATION_VERSION
- = new Name("Specification-Version");
- /**
- * Package versioning -
- * organisation that maintains the specification contains in this
- * jar.
- */
- public static final Name SPECIFICATION_VENDOR
- = new Name("Specification-Vendor");
- /**
- * Package sealing -
- * whether (all) package(s) is(/are) sealed. Value is either "true"
- * or "false".
- */
- public static final Name SEALED
- = new Name("Sealed");
-
- /**
- * File contents attribute -
- * Mime type and subtype for the jar entry.
- */
- public static final Name CONTENT_TYPE
- = new Name("Content-Type");
-
- /**
- * Bean objects attribute -
- * whether the entry is a Java Bean. Value is either "true" or "false".
- */
- public static final Name JAVA_BEAN
- = new Name("Java-Bean");
-
- /**
- * Signing attribute -
- * application specific signing attribute. Must be understood by
- * the manifest parser when present to validate the jar (entry).
- */
- public static final Name MAGIC
- = new Name("Magic");
-
- /** The (lowercase) String representation of this Name */
- private final String name;
- /** The original String given to the constructor */
- private final String origName;
-
- // Constructor
-
- /**
- * Creates a new Name from the given String.
- * Throws an IllegalArgumentException if the given String is empty or
- * contains any illegal Name characters.
- *
- * @param name the name of the new Name
- * @exception IllegalArgumentException if name isn't a valid String
- * representation of a Name
- * @exception NullPointerException if name is null
- */
- public Name(String name) throws IllegalArgumentException,
- NullPointerException {
- // name must not be null
- // this will throw a NullPointerException if it is
- char chars[] = name.toCharArray();
-
- // there must be at least one character
- if (chars.length == 0)
- throw new IllegalArgumentException(
- "There must be at least one character in a name");
-
- // first character must be alphanum
- char c = chars[0];
- if (!((c >= 'a' && c <= 'z') ||
- (c >= 'A' && c <= 'Z') ||
- (c >= '0' && c <= '9')))
- throw new IllegalArgumentException(
- "First character must be alphanum");
-
- // all other characters must be alphanums, '-' or '_'
- for (int i = 1; i < chars.length; i++) {
- if (!((c >= 'a' && c <= 'z') ||
- (c >= 'A' && c <= 'Z') ||
- (c >= '0' && c <= '9') ||
- (c == '-') || (c == '_')))
- throw new IllegalArgumentException(
- "Characters must be alphanums, '-' or '_'");
- }
-
- // Still here? Then convert to lower case and be done.
- // Store the original name for toString();
- this.origName = name;
- this.name = name.toLowerCase();
- }
-
- /**
- * Returns the hash code of the (lowercase) String representation of
- * this Name.
- */
- public int hashCode() {
- return name.hashCode();
- }
-
- /**
- * Checks if another object is equal to this Name object.
- * Another object is equal to this Name object if it is an instance of
- * Name and the (lowercase) string representation of the name is equal.
- */
- public boolean equals(Object o) {
- // Quick and dirty check
- if (name == o)
- return true;
-
- try {
- // Note that the constructor already converts the strings to
- // lowercase.
- String otherName = ((Name)o).name;
- return name.equals(otherName);
- } catch (ClassCastException cce) {
- return false;
- } catch (NullPointerException npe) {
- return false;
- }
- }
-
- /**
- * Returns the string representation of this Name as given to the
- * constructor (not neccesarily the lower case representation).
- */
- public String toString() {
- return origName;
- }
- }
-
- // Constructors
-
+ public static final Name CREATED_BY = new Name("Created-By");
/**
- * Creates an empty Attributes map.
+ * General main attribute -
+ * the version of the jar file signature.
*/
- public Attributes() {
- map = new Hashtable();
- }
-
+ public static final Name SIGNATURE_VERSION
+ = new Name("Signature-Version");
/**
- * Creates an empty Attributes map with the given initial size.
- * @param size the initial size of the underlying map
+ * General main attribute -
+ * (relative) URLs of the libraries/classpaths that the Classes in
+ * this jar file depend on.
*/
- public Attributes(int size) {
- map = new Hashtable(size);
- }
+ public static final Name CLASS_PATH = new Name("Class-Path");
/**
- * Creates an Attributes map with the initial values taken from another
- * Attributes map.
- * @param attr Attributes map to take the initial values from
+ * Stand alone application attribute -
+ * the entry (without the .class ending) that is the main
+ * class of this jar file.
*/
- public Attributes(Attributes attr) {
- map = new Hashtable(attr.map);
- }
-
- // Methods
+ public static final Name MAIN_CLASS = new Name("Main-Class");
/**
- * Gets the value of an attribute name given as a String.
- *
- * @param name a String describing the Name to look for
- * @return the value gotten from the map of null when not found
+ * Applet attribute -
+ * a list of extension libraries that the applet in this
+ * jar file depends on.
+ * For every named extension there should be some Attributes in the
+ * Manifest manifest file with the following Names:
+ * <ul>
+ * <li> &lt;extension&gt;-Extension-Name:
+ * unique name of the extension
+ * <li> &lt;extension&gt;-Specification-Version:
+ * minimum specification version
+ * <li> &lt;extension&gt;-Implementation-Version:
+ * minimum implementation version
+ * <li> &lt;extension&gt;-Implementation-Vendor-Id:
+ * unique id of implementation vendor
+ * <li> &lt;extension&gt;-Implementation-URL:
+ * where the latest version of the extension library can be found
+ * </ul>
*/
- public String getValue(String name) {
- return (String)get(new Name(name));
- }
+ public static final Name EXTENSION_LIST = new Name("Extension-List");
/**
- * Gets the value of the given attribute name.
- *
- * @param name the Name to look for
- * @return the value gotten from the map of null when not found
+ * Extension identification attribute -
+ * the name if the extension library contained in the jar.
*/
- public String getValue(Name name) {
- return (String)get(name);
- }
-
+ public static final Name EXTENSION_NAME = new Name("Extension-Name");
/**
- * Stores an attribute name (represented by a String) and value in this
- * Attributes map.
- * When the (case insensitive string) name already exists the value is
- * replaced and the old value is returned.
- *
- * @param name a (case insensitive) String representation of the attribite
- * name to add/replace
- * @param value the (new) value of the attribute name
- * @returns the old value of the attribute name or null if it didn't exist
- * yet
+ * Extension identification attribute -
+ * synonym for <code>EXTENSTION_NAME</code>.
*/
- public String putValue(String name, String value)
- {
- return putValue(new Name(name), value);
- }
+ public static final Name EXTENSION_INSTALLATION = EXTENSION_NAME;
+ // Package versioning and sealing attributes
/**
- * Stores an attribute name (represented by a String) and value in this
- * Attributes map.
- * When the name already exists the value is replaced and the old value
- * is returned.
- * <p>
- * I don't know why there is no public method with this signature. I think
- * there should be one.
- *
- * @param name the attribite name to add/replace
- * @param value the (new) value of the attribute name
- * @returns the old value of the attribute name or null if it didn't exist
- * yet
+ * Package versioning -
+ * name of extension library contained in this jar.
*/
- private String putValue(Name name, String value)
- {
- return (String)put(name, value);
- }
-
- // Methods from Cloneable interface
-
+ public static final Name IMPLEMENTATION_TITLE
+ = new Name("Implementation-Title");
/**
- * Return a clone of this attribute map.
+ * Package versioning -
+ * version of the extension library contained in this jar.
*/
- public Object clone() {
- return new Attributes(this);
- }
-
- // Methods from Map interface
-
+ public static final Name IMPLEMENTATION_VERSION
+ = new Name("Implementation-Version");
/**
- * Removes all attributes.
+ * Package versioning -
+ * name of extension library creator contained in this jar.
*/
- public void clear() {
- map.clear();
- }
-
+ public static final Name IMPLEMENTATION_VENDOR
+ = new Name("Implementation-Vendor");
/**
- * Checks to see if there is an attribute with the specified name.
- * XXX - what if the object is a String?
- *
- * @param attrName the name of the attribute to check
- * @return true if there is an attribute with the specified name, false
- * otherwise
+ * Package versioning -
+ * unique id of extension library creator.
*/
- public boolean containsKey(Object attrName) {
- return map.containsKey(attrName);
- }
-
+ public static final Name IMPLEMENTATION_VENDOR_ID
+ = new Name("Implementation-Vendor-Id");
/**
- * Checks to see if there is an attribute name with the specified value.
- *
- * @param attrValue the value of a attribute to check
- * @return true if there is an attribute name with the specified value,
- * false otherwise
+ * Package versioning -
+ * location where this implementation can be downloaded.
*/
- public boolean containsValue(Object attrValue) {
- return map.containsValue(attrValue);
- }
-
+ public static final Name IMPLEMENTATION_URL
+ = new Name("Implementation-URL");
/**
- * Gives a Set of attribute name and values pairs as MapEntries.
- * @see java.util.Map.Entry
- * @see java.util.Map#entrySet()
- *
- * @return a set of attribute name value pairs
+ * Package versioning -
+ * title of the specification contained in this jar.
*/
- public Set entrySet() {
- return map.entrySet();
- }
-
+ public static final Name SPECIFICATION_TITLE
+ = new Name("Specification-Title");
/**
- * Checks to see if two Attributes are equal. The supplied object must be
- * a real instance of Attributes and contain the same attribute name/value
- * pairs.
- *
- * @param o another Attribute object which should be checked for equality
- * @return true if the object is an instance of Attributes and contains the
- * same name/value pairs, false otherwise
+ * Package versioning -
+ * version of the specification contained in this jar.
*/
- public boolean equals(Object o) {
- // quick and dirty check
- if (this == o)
- return true;
-
- try {
- return map.equals(((Attributes)o).map);
- } catch (ClassCastException cce) {
- return false;
- } catch (NullPointerException npe) {
- return false;
- }
- }
-
+ public static final Name SPECIFICATION_VERSION
+ = new Name("Specification-Version");
/**
- * Gets the value of a specified attribute name.
- * XXX - what if the object is a String?
- *
- * @param attrName the name of the attribute we want the value of
- * @return the value of the specified attribute name or null when there is
- * no such attribute name
+ * Package versioning -
+ * organisation that maintains the specification contains in this
+ * jar.
*/
- public Object get(Object attrName) {
- return map.get(attrName);
- }
-
+ public static final Name SPECIFICATION_VENDOR
+ = new Name("Specification-Vendor");
/**
- * Returns the hashcode of the attribute name/value map.
+ * Package sealing -
+ * whether (all) package(s) is(/are) sealed. Value is either "true"
+ * or "false".
*/
- public int hashCode() {
- return map.hashCode();
- }
+ public static final Name SEALED = new Name("Sealed");
/**
- * Returns true if there are no attributes set, false otherwise.
+ * File contents attribute -
+ * Mime type and subtype for the jar entry.
*/
- public boolean isEmpty() {
- return map.isEmpty();
- }
+ public static final Name CONTENT_TYPE = new Name("Content-Type");
/**
- * Gives a Set of all the values of defined attribute names.
+ * Bean objects attribute -
+ * whether the entry is a Java Bean. Value is either "true" or "false".
*/
- public Set keySet() {
- return map.keySet();
- }
+ public static final Name JAVA_BEAN = new Name("Java-Bean");
/**
- * Adds or replaces a attribute name/value pair.
- * XXX - What if the name is a string? What if the name is neither a Name
- * nor a String? What if the value is not a string?
- *
- * @param name the name of the attribute
- * @param value the (new) value of the attribute
- * @return the old value of the attribute or null when there was no old
- * attribute with this name
+ * Signing attribute -
+ * application specific signing attribute. Must be understood by
+ * the manifest parser when present to validate the jar (entry).
*/
- public Object put(Object name, Object value) {
- return map.put(name, value);
- }
+ public static final Name MAGIC = new Name("Magic");
+
+ /** The (lowercase) String representation of this Name */
+ private final String name;
+ /** The original String given to the constructor */
+ private final String origName;
+
+ // Constructor
/**
- * Adds or replaces all attribute name/value pairs from another
- * Attributes object to this one. The supplied Map must be an instance of
- * Attributes.
- *
- * @param attr the Attributes object to merge with this one
- * @exception ClassCastException if the supplied map is not an instance of
- * Attributes
+ * Creates a new Name from the given String.
+ * Throws an IllegalArgumentException if the given String is empty or
+ * contains any illegal Name characters.
+ *
+ * @param name the name of the new Name
+ * @exception IllegalArgumentException if name isn't a valid String
+ * representation of a Name
+ * @exception NullPointerException if name is null
*/
- public void putAll(Map attr) {
- if (!(attr instanceof Attributes)) {
- throw new ClassCastException(
- "Supplied Map is not an instance of Attributes");
- }
- map.putAll(attr);
+ public Name(String name) throws IllegalArgumentException,
+ NullPointerException
+ {
+ // name must not be null
+ // this will throw a NullPointerException if it is
+ char chars[] = name.toCharArray();
+
+ // there must be at least one character
+ if (chars.length == 0)
+ throw new
+ IllegalArgumentException
+ ("There must be at least one character in a name");
+
+ // first character must be alphanum
+ char c = chars[0];
+ if (!((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')))
+ throw new
+ IllegalArgumentException("First character must be alphanum");
+
+ // all other characters must be alphanums, '-' or '_'
+ for (int i = 1; i < chars.length; i++)
+ {
+ if (!((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') || (c == '-') || (c == '_')))
+ throw new
+ IllegalArgumentException
+ ("Characters must be alphanums, '-' or '_'");
+ }
+
+ // Still here? Then convert to lower case and be done.
+ // Store the original name for toString();
+ this.origName = name;
+ this.name = name.toLowerCase();
}
/**
- * Remove a attribute name/value pair.
- * XXX - What if the name is a String?
- *
- * @param name the name of the attribute name/value pair to remove
- * @return the old value of the attribute or null if the attribute didn't
- * exist
+ * Returns the hash code of the (lowercase) String representation of
+ * this Name.
*/
- public Object remove(Object name) {
- return map.remove(name);
+ public int hashCode()
+ {
+ return name.hashCode();
}
/**
- * Returns the number of defined attribute name/value pairs.
+ * Checks if another object is equal to this Name object.
+ * Another object is equal to this Name object if it is an instance of
+ * Name and the (lowercase) string representation of the name is equal.
*/
- public int size() {
- return map.size();
+ public boolean equals(Object o)
+ {
+ // Quick and dirty check
+ if (name == o)
+ return true;
+
+ try
+ {
+ // Note that the constructor already converts the strings to
+ // lowercase.
+ String otherName = ((Name) o).name;
+ return name.equals(otherName);
+ }
+ catch (ClassCastException cce)
+ {
+ return false;
+ }
+ catch (NullPointerException npe)
+ {
+ return false;
+ }
}
/**
- * Returns all the values of the defined attribute name/value pairs as a
- * Collection.
+ * Returns the string representation of this Name as given to the
+ * constructor (not neccesarily the lower case representation).
*/
- public Collection values() {
- return map.values();
+ public String toString()
+ {
+ return origName;
}
+ }
+
+ // Constructors
+
+ /**
+ * Creates an empty Attributes map.
+ */
+ public Attributes()
+ {
+ map = new Hashtable();
+ }
+
+ /**
+ * Creates an empty Attributes map with the given initial size.
+ * @param size the initial size of the underlying map
+ */
+ public Attributes(int size)
+ {
+ map = new Hashtable(size);
+ }
+
+ /**
+ * Creates an Attributes map with the initial values taken from another
+ * Attributes map.
+ * @param attr Attributes map to take the initial values from
+ */
+ public Attributes(Attributes attr)
+ {
+ map = new Hashtable(attr.map);
+ }
+
+ // Methods
+
+ /**
+ * Gets the value of an attribute name given as a String.
+ *
+ * @param name a String describing the Name to look for
+ * @return the value gotten from the map of null when not found
+ */
+ public String getValue(String name)
+ {
+ return (String) get(new Name(name));
+ }
+
+ /**
+ * Gets the value of the given attribute name.
+ *
+ * @param name the Name to look for
+ * @return the value gotten from the map of null when not found
+ */
+ public String getValue(Name name)
+ {
+ return (String) get(name);
+ }
+
+ /**
+ * Stores an attribute name (represented by a String) and value in this
+ * Attributes map.
+ * When the (case insensitive string) name already exists the value is
+ * replaced and the old value is returned.
+ *
+ * @param name a (case insensitive) String representation of the attribite
+ * name to add/replace
+ * @param value the (new) value of the attribute name
+ * @returns the old value of the attribute name or null if it didn't exist
+ * yet
+ */
+ public String putValue(String name, String value)
+ {
+ return putValue(new Name(name), value);
+ }
+
+ /**
+ * Stores an attribute name (represented by a String) and value in this
+ * Attributes map.
+ * When the name already exists the value is replaced and the old value
+ * is returned.
+ * <p>
+ * I don't know why there is no public method with this signature. I think
+ * there should be one.
+ *
+ * @param name the attribite name to add/replace
+ * @param value the (new) value of the attribute name
+ * @returns the old value of the attribute name or null if it didn't exist
+ * yet
+ */
+ private String putValue(Name name, String value)
+ {
+ return (String) put(name, value);
+ }
+
+ // Methods from Cloneable interface
+
+ /**
+ * Return a clone of this attribute map.
+ */
+ public Object clone()
+ {
+ return new Attributes(this);
+ }
+
+ // Methods from Map interface
+
+ /**
+ * Removes all attributes.
+ */
+ public void clear()
+ {
+ map.clear();
+ }
+
+ /**
+ * Checks to see if there is an attribute with the specified name.
+ * XXX - what if the object is a String?
+ *
+ * @param attrName the name of the attribute to check
+ * @return true if there is an attribute with the specified name, false
+ * otherwise
+ */
+ public boolean containsKey(Object attrName)
+ {
+ return map.containsKey(attrName);
+ }
+
+ /**
+ * Checks to see if there is an attribute name with the specified value.
+ *
+ * @param attrValue the value of a attribute to check
+ * @return true if there is an attribute name with the specified value,
+ * false otherwise
+ */
+ public boolean containsValue(Object attrValue)
+ {
+ return map.containsValue(attrValue);
+ }
+
+ /**
+ * Gives a Set of attribute name and values pairs as MapEntries.
+ * @see java.util.Map.Entry
+ * @see java.util.Map#entrySet()
+ *
+ * @return a set of attribute name value pairs
+ */
+ public Set entrySet()
+ {
+ return map.entrySet();
+ }
+
+ /**
+ * Checks to see if two Attributes are equal. The supplied object must be
+ * a real instance of Attributes and contain the same attribute name/value
+ * pairs.
+ *
+ * @param o another Attribute object which should be checked for equality
+ * @return true if the object is an instance of Attributes and contains the
+ * same name/value pairs, false otherwise
+ */
+ public boolean equals(Object o)
+ {
+ // quick and dirty check
+ if (this == o)
+ return true;
+
+ try
+ {
+ return map.equals(((Attributes) o).map);
+ }
+ catch (ClassCastException cce)
+ {
+ return false;
+ }
+ catch (NullPointerException npe)
+ {
+ return false;
+ }
+ }
+
+ /**
+ * Gets the value of a specified attribute name.
+ * XXX - what if the object is a String?
+ *
+ * @param attrName the name of the attribute we want the value of
+ * @return the value of the specified attribute name or null when there is
+ * no such attribute name
+ */
+ public Object get(Object attrName)
+ {
+ return map.get(attrName);
+ }
+
+ /**
+ * Returns the hashcode of the attribute name/value map.
+ */
+ public int hashCode()
+ {
+ return map.hashCode();
+ }
+
+ /**
+ * Returns true if there are no attributes set, false otherwise.
+ */
+ public boolean isEmpty()
+ {
+ return map.isEmpty();
+ }
+
+ /**
+ * Gives a Set of all the values of defined attribute names.
+ */
+ public Set keySet()
+ {
+ return map.keySet();
+ }
+
+ /**
+ * Adds or replaces a attribute name/value pair.
+ * XXX - What if the name is a string? What if the name is neither a Name
+ * nor a String? What if the value is not a string?
+ *
+ * @param name the name of the attribute
+ * @param value the (new) value of the attribute
+ * @return the old value of the attribute or null when there was no old
+ * attribute with this name
+ */
+ public Object put(Object name, Object value)
+ {
+ return map.put(name, value);
+ }
+
+ /**
+ * Adds or replaces all attribute name/value pairs from another
+ * Attributes object to this one. The supplied Map must be an instance of
+ * Attributes.
+ *
+ * @param attr the Attributes object to merge with this one
+ * @exception ClassCastException if the supplied map is not an instance of
+ * Attributes
+ */
+ public void putAll(Map attr)
+ {
+ if (!(attr instanceof Attributes))
+ {
+ throw new
+ ClassCastException("Supplied Map is not an instance of Attributes");
+ }
+ map.putAll(attr);
+ }
+
+ /**
+ * Remove a attribute name/value pair.
+ * XXX - What if the name is a String?
+ *
+ * @param name the name of the attribute name/value pair to remove
+ * @return the old value of the attribute or null if the attribute didn't
+ * exist
+ */
+ public Object remove(Object name)
+ {
+ return map.remove(name);
+ }
+
+ /**
+ * Returns the number of defined attribute name/value pairs.
+ */
+ public int size()
+ {
+ return map.size();
+ }
+
+ /**
+ * Returns all the values of the defined attribute name/value pairs as a
+ * Collection.
+ */
+ public Collection values()
+ {
+ return map.values();
+ }
}