summaryrefslogtreecommitdiffstats
path: root/libjava/java/util/jar/Attributes.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/jar/Attributes.java')
-rw-r--r--libjava/java/util/jar/Attributes.java586
1 files changed, 586 insertions, 0 deletions
diff --git a/libjava/java/util/jar/Attributes.java b/libjava/java/util/jar/Attributes.java
new file mode 100644
index 00000000000..587f4a1d130
--- /dev/null
+++ b/libjava/java/util/jar/Attributes.java
@@ -0,0 +1,586 @@
+/* Attributes.java -- Represents attribute name/value pairs from a Manifest
+ Copyright (C) 2000 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+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
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+package java.util.jar;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Represents attribute name/value pairs from a Manifest as a Map.
+ * The names of an attribute are represented by the
+ * <code>Attributes.Name</code> class and should confirm to the restrictions
+ * described in that class. Note that the Map interface that Attributes
+ * implements allows you to put names and values into the attribute that don't
+ * follow these restriction (and are not really Atrribute.Names, but if you do
+ * that it might cause undefined behaviour later).
+ * <p>
+ * If you use the constants defined in the inner class Name then you can be
+ * sure that you always access the right attribute names. This makes
+ * manipulating the Attributes more or less type safe.
+ * <p>
+ * Most of the methods are wrappers to implement the Map interface. The really
+ * usefull and often used methods are <code>getValue(Name)</code> and
+ * <code>getValue(String)</code>. If you actually want to set attributes you
+ * may want to use the <code>putValue(String, String)</code> method
+ * (sorry there is no public type safe <code>putValue(Name, String)</code>
+ * method).
+ *
+ * @see java.util.jar.Attributes.Name
+ * @author Mark Wielaard (mark@klomp.org)
+ */
+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
+
+ /**
+ * 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
+
+ /**
+ * 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 atrribute 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();
+ }
+}
OpenPOWER on IntegriCloud