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

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

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
 * useful 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 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();
  }
}
