/* DocFlavor.java --
   Copyright (C) 2004, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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 javax.print;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.io.StreamTokenizer;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/**
 * <code>DocFlavor</code> provides a description of the format in which the 
 * print data will be supplied in a print job to the print service.
 * <p>
 * A doc flavor consists of two parts:
 * <ul>
 * <li>
 * The MIME type (Multipurpose Internet Mail Extensions types as described 
 * in RFC 2045/2046) specifying the media format of the print data.
 * </li><li>
 * The representation class name which is the fully qualified name of the 
 * class providing the print data to the print job. For example if the print 
 * data is supplied as a byte array the representation class name will be 
 * <code>"[B"</code> or for an input stream <code>"java.io.InputStream"</code>.
 * </li>
 * </ul>
 * The <code>DocFlavor</code> class is therefore used in several places in the 
 * Java Print Service API. A print service provides its supported document 
 * flavors as an array of DocFlavor objects and a print job gets the flavor of
 * its data to print from the <code>Doc</code> object provided as a DocFlavor
 * instance.
 * </p>
 * <p>
 * It has to be differentiated between <b>client formatted</b> and <b>service 
 * formatted</b> print data. Client formatted print data is already provided 
 * formatted by the client e.g. in an image format or as postscript. For 
 * service formatted print data, the Java Print Service instance produces 
 * the formatted print data. Here the doc flavor's representation class name 
 * does specify an interface instead of the actual print data source. The 
 * print service will call the methods of the given implementation of this
 * interface with a special Graphics object capable of producing formatted
 * print data from the graphics routines inside the interface methods.
 * </p>
 * <p>
 * <h3>Client formatted print data document flavors</h3>
 * The print service uses the representation class of the doc flavor to know 
 * how to retrieve the print data. If the representation class is a 
 * <code>URL</code> it will open the URL to read the print data from it. If it is 
 * a <code>byte[]</code> it will directly use the array and send it to the 
 * printer. There are predefined doc flavor as inner class for the most common 
 * representation class types:
 * <ul>
 * <li>Character arrays (<code>char[]</code>): The characters of the array 
 * represent the print data.</li>
 * <li>Character streams (<code>java.io.Reader</code>): The whole characters 
 * read from the stream represent the print data.</li>
 * <li>String (<code>java.lang.String</code>): The characters of the String 
 * represent the print data.</li>
 * <li>Byte arrays (<code>byte[]</code>): The bytes of the array represent the 
 * print data. Encoding if text content is given in the mime type.</li>
 * <li>Byte streams (<code>java.io.InputStream</code>): The whole bytes read 
 * from the stream represent the print data. If text content the encoding is 
 * specified in the mime type.</li>
 * <li>Uniform Resource Locator (<code>java.net.URL</code>): The bytes read 
 * from the stream through opening of the URL represent the print data. 
 * If text content the encoding is specified in the mime type.</li></li>
 * </ul>
 * </p>
 * <p>
 * <h3>Service formatted print data document flavors</h3>
 * The print service uses the provided object implementing the interface
 * specified by the representation class to produce the formatted print data. 
 * The mime type of service formatted data is always 
 * <code>"application/x-java-jvm-local-objectref"</code> to signal the local 
 * reference to the print data object implementing the interface. Predefined
 * doc flavor classes exist as an inner class for the three available interface 
 * to produce print data:
 * <ul>
 * <li>Pageable object (<code>java.awt.print.Pageable</code>): A pageable object
 * is supplied to the print service. The print service will call the methods of
 * the interface with a Grahics object to produce the formatted print data.</li>
 * <li>Printable object (<code>java.awt.print.Printable</code>): A printable object
 * is supplied to the print service. The print service will call the methods of
 * the interface with a Grahics object to produce the formatted print data.</li>
 * <li>Renderable Image object 
 * (<code>java.awt.image.renderable.RenderableImage</code>): A renderable image
 * object is supplied to the print service. The print service calls methods of
 * this interface to obtain the image to be printed.</li>
 * </ul>
 * </p>
 * 
 * @author Michael Koch (konqueror@gmx.de)
 * @author Wolfgang Baer (WBaer@gmx.de)
 */
public class DocFlavor implements Cloneable, Serializable
{
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use a byte array for the print data representation.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "[B" (byte array).</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class BYTE_ARRAY
    extends DocFlavor
  {
    private static final long serialVersionUID = -9065578006593857475L;

    /**
     * Byte array doc flavor with a MIME Type of "application/octet-stream".
     */
    public static final BYTE_ARRAY AUTOSENSE = new BYTE_ARRAY("application/octet-stream");
    /**
     * Byte array doc flavor with a MIME Type of "image/gif".
     */
    public static final BYTE_ARRAY GIF = new BYTE_ARRAY("image/gif");
    /**
     * Byte array doc flavor with a MIME Type of "image/jpeg".
     */
    public static final BYTE_ARRAY JPEG = new BYTE_ARRAY("image/jpeg");
    /**
     * Byte array doc flavor with a MIME Type of "application/vnd.hp-PCL".
     */
    public static final BYTE_ARRAY PCL = new BYTE_ARRAY("application/vnd.hp-PCL");
    /**
     * Byte array doc flavor with a MIME Type of "application/pdf".
     */
    public static final BYTE_ARRAY PDF = new BYTE_ARRAY("application/pdf");
    /**
     * Byte array doc flavor with a MIME Type of "image/png".
     */
    public static final BYTE_ARRAY PNG = new BYTE_ARRAY("image/png");
    /**
     * Byte array doc flavor with a MIME Type of "application/postscript".
     */
    public static final BYTE_ARRAY POSTSCRIPT = new BYTE_ARRAY("application/postscript");
    /**
     * Byte array doc flavor with a MIME Type of "text/html" in the host encoding.
     */
    public static final BYTE_ARRAY TEXT_HTML_HOST = new BYTE_ARRAY("text/html; charset=" + hostEncoding);
    /**
     * Byte array doc flavor with a MIME Type of "text/html; charset=us-ascii".
     */
    public static final BYTE_ARRAY TEXT_HTML_US_ASCII = new BYTE_ARRAY("text/html; charset=us-ascii");
    /**
     * Byte array doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final BYTE_ARRAY TEXT_HTML_UTF_16 = new BYTE_ARRAY("text/html; charset=utf-16");
    /**
     * Byte array doc flavor with a MIME Type of "text/html; charset=utf-16be".
     */
    public static final BYTE_ARRAY TEXT_HTML_UTF_16BE = new BYTE_ARRAY("text/html; charset=utf-16be");
    /**
     * Byte array doc flavor with a MIME Type of "text/html; charset=utf-16le".
     */
    public static final BYTE_ARRAY TEXT_HTML_UTF_16LE = new BYTE_ARRAY("text/html; charset=utf-16le");
    /**
     * Byte array doc flavor with a MIME Type of "text/html; charset=utf-8".
     */
    public static final BYTE_ARRAY TEXT_HTML_UTF_8 = new BYTE_ARRAY("text/html; charset=utf-8");
    /**
     * Byte array doc flavor with a MIME Type of "text/plain" in the host encoding.
     */
    public static final BYTE_ARRAY TEXT_PLAIN_HOST = new BYTE_ARRAY("text/plain; charset=" + hostEncoding);
    /**
     * Byte array doc flavor with a MIME Type of "text/plain; charset=us-ascii".
     */
    public static final BYTE_ARRAY TEXT_PLAIN_US_ASCII = new BYTE_ARRAY("text/plain; charset=us-ascii");    
    /**
     * Byte array doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final BYTE_ARRAY TEXT_PLAIN_UTF_16 = new BYTE_ARRAY("text/plain; charset=utf-16");
    /**
     * Byte array doc flavor with a MIME Type of "text/plain; charset=utf-16be".
     */
    public static final BYTE_ARRAY TEXT_PLAIN_UTF_16BE = new BYTE_ARRAY("text/plain; charset=utf-16be");
    /**
     * Byte array doc flavor with a MIME Type of "text/plain; charset=utf-16le".
     */
    public static final BYTE_ARRAY TEXT_PLAIN_UTF_16LE = new BYTE_ARRAY("text/plain; charset=utf-16le");
    /**
     * Byte array doc flavor with a MIME Type of "text/plain; charset=utf-8".
     */
    public static final BYTE_ARRAY TEXT_PLAIN_UTF_8 = new BYTE_ARRAY("text/plain; charset=utf-8");
    
    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "[B".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public BYTE_ARRAY(String mimeType)
    {
      super(mimeType, "[B");
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use a char array for the print data representation.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "[C" (char array).</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class CHAR_ARRAY
    extends DocFlavor
  {
    private static final long serialVersionUID = -8720590903724405128L;
    
    /**
     * Char array doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final DocFlavor.CHAR_ARRAY TEXT_HTML = new CHAR_ARRAY("text/html; charset=utf-16");
    /**
     * Char array doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final DocFlavor.CHAR_ARRAY TEXT_PLAIN = new CHAR_ARRAY("text/plain; charset=utf-16");

    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "[C".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public CHAR_ARRAY(String mimeType)
    {
      super(mimeType, "[C");
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use an InputStream to retrieve the print data.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "java.io.InputStream".</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class INPUT_STREAM
    extends DocFlavor
  {
    private static final long serialVersionUID = -7045842700749194127L;

    /**
     * InputStream doc flavor with a MIME Type of "application/octet-stream".
     */
    public static final INPUT_STREAM AUTOSENSE = new INPUT_STREAM("application/octet-stream");
    /**
     * InputStream doc flavor with a MIME Type of "image/gif".
     */
    public static final INPUT_STREAM GIF = new INPUT_STREAM("image/gif");
    /**
     * InputStream doc flavor with a MIME Type of "image/jpeg".
     */
    public static final INPUT_STREAM JPEG = new INPUT_STREAM("image/jpeg");
    /**
     * InputStream doc flavor with a MIME Type of "application/vnd.hp-PCL".
     */
    public static final INPUT_STREAM PCL = new INPUT_STREAM("application/vnd.hp-PCL");
    /**
     * InputStream doc flavor with a MIME Type of "application/pdf".
     */
    public static final INPUT_STREAM PDF = new INPUT_STREAM("application/pdf");
    /**
     * InputStream doc flavor with a MIME Type of "image/png".
     */
    public static final INPUT_STREAM PNG = new INPUT_STREAM("image/png");
    /**
     * InputStream doc flavor with a MIME Type of "application/postscript".
     */
    public static final INPUT_STREAM POSTSCRIPT = new INPUT_STREAM("application/postscript");
    /**
     * InputStream doc flavor with a MIME Type of "text/html" in the host encoding.
     */
    public static final INPUT_STREAM TEXT_HTML_HOST = new INPUT_STREAM("text/html; charset=" + hostEncoding);
    /**
     * InputStream doc flavor with a MIME Type of "text/html; charset=us-ascii".
     */
    public static final INPUT_STREAM TEXT_HTML_US_ASCII = new INPUT_STREAM("text/html; charset=us-ascii");
    /**
     * InputStream doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final INPUT_STREAM TEXT_HTML_UTF_16 = new INPUT_STREAM("text/html; charset=utf-16");
    /**
     * InputStream doc flavor with a MIME Type of "text/html; charset=utf-16be".
     */
    public static final INPUT_STREAM TEXT_HTML_UTF_16BE = new INPUT_STREAM("text/html; charset=utf-16be");
    /**
     * InputStream doc flavor with a MIME Type of "text/html; charset=utf-16le".
     */
    public static final INPUT_STREAM TEXT_HTML_UTF_16LE = new INPUT_STREAM("text/html; charset=utf-16le");
    /**
     * InputStream doc flavor with a MIME Type of "text/html; charset=utf-8".
     */
    public static final INPUT_STREAM TEXT_HTML_UTF_8 = new INPUT_STREAM("text/html; charset=utf-8");
    /**
     * InputStream doc flavor with a MIME Type of "text/plain" in the host encoding.
     */
    public static final INPUT_STREAM TEXT_PLAIN_HOST = new INPUT_STREAM("text/plain; charset=" + hostEncoding);
    /**
     * InputStream doc flavor with a MIME Type of "text/plain; charset=us-ascii".
     */
    public static final INPUT_STREAM TEXT_PLAIN_US_ASCII = new INPUT_STREAM("text/plain; charset=us-ascii");
    /**
     * InputStream doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final INPUT_STREAM TEXT_PLAIN_UTF_16 = new INPUT_STREAM("text/plain; charset=utf-16");
    /**
     * InputStream doc flavor with a MIME Type of "text/plain; charset=utf-16be".
     */
    public static final INPUT_STREAM TEXT_PLAIN_UTF_16BE = new INPUT_STREAM("text/plain; charset=utf-16be");
    /**
     * InputStream doc flavor with a MIME Type of "text/plain; charset=utf-16le".
     */
    public static final INPUT_STREAM TEXT_PLAIN_UTF_16LE = new INPUT_STREAM("text/plain; charset=utf-16le");
    /**
     * InputStream doc flavor with a MIME Type of "text/plain; charset=utf-8".
     */
    public static final INPUT_STREAM TEXT_PLAIN_UTF_8 = new INPUT_STREAM("text/plain; charset=utf-8");
    
    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "java.io.InputStream".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public INPUT_STREAM(String mimeType)
    {
      super(mimeType, "java.io.InputStream");
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use an Reader to retrieve the print data.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "java.io.Reader".</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class READER
    extends DocFlavor
  {
    private static final long serialVersionUID = 7100295812579351567L;

    /**
     * Reader doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final DocFlavor.READER TEXT_HTML = new READER("text/html; charset=utf-16");
    /**
     * Reader doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final DocFlavor.READER TEXT_PLAIN = new READER("text/plain; charset=utf-16");
    
    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "java.io.Reader".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public READER(String mimeType)
    {
      super(mimeType, "java.io.Reader");
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use service formatted print data.
   * <p>All the defined doc flavors have a MIME type of 
   * "application/x-java-jvm-local-objectref".</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class SERVICE_FORMATTED
    extends DocFlavor
  {
    private static final long serialVersionUID = 6181337766266637256L;

    /**
     * Service formatted doc flavor with a representation class of 
     * "java.awt.print.Pageable".
     */
    public static final DocFlavor.SERVICE_FORMATTED PAGEABLE = new SERVICE_FORMATTED("java.awt.print.Pageable");
    /**
     * Service formatted doc flavor with a representation class of 
     * "java.awt.print.Printable".
     */
    public static final DocFlavor.SERVICE_FORMATTED PRINTABLE = new SERVICE_FORMATTED("java.awt.print.Printable");
    /**
     * Service formatted doc flavor with a representation class of 
     * "java.awt.image.renderable.RenderableImage".
     */
    public static final DocFlavor.SERVICE_FORMATTED RENDERABLE_IMAGE = new SERVICE_FORMATTED("java.awt.image.renderable.RenderableImage");
    
    /**
     * Constructor for doc flavor objects with a MIME type of 
     * "application/x-java-jvm-local-objectref" and the given
     * print data representation classname.
     * 
     * @param className the representation classname
     * 
     * @throws NullPointerException if className is <code>null</code>.
     */
    public SERVICE_FORMATTED(String className)
    {
      super("application/x-java-jvm-local-objectref", className);
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which use a String for the print data representation.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "java.lang.String".</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class STRING
    extends DocFlavor
  {
    private static final long serialVersionUID = 4414407504887034035L;

    /**
     * String doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final DocFlavor.STRING TEXT_HTML = new STRING("text/html; charset=utf-16");
    /**
     * String doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final DocFlavor.STRING TEXT_PLAIN = new STRING("text/plain; charset=utf-16");
    
    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "java.lang.String".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public STRING(String mimeType)
    {
      super(mimeType, "java.lang.String");
    }
  }
  
  /**
   * Predefined static <code>DocFlavor</code> objects for document
   * types which have an URL where to retrieve the print data.
   * <p>All the defined doc flavors have a print data representation 
   * classname of "java.net.URL".</p>
   * 
   * @author Michael Koch (konqueror@gmx.de)
   */
  public static class URL
    extends DocFlavor
  {
    private static final long serialVersionUID = 2936725788144902062L;

    /**
     * URL doc flavor with a MIME Type of "application/octet-stream".
     */
    public static final DocFlavor.URL AUTOSENSE = new URL("application/octet-stream");
    /**
     * URL doc flavor with a MIME Type of "image/gif".
     */
    public static final DocFlavor.URL GIF = new URL("image/gif");
    /**
     * URL doc flavor with a MIME Type of "image/jpeg".
     */
    public static final DocFlavor.URL JPEG = new URL("image/jpeg");
    /**
     * URL doc flavor with a MIME Type of "application/vnd.hp-PCL".
     */
    public static final DocFlavor.URL PCL = new URL("application/vnd.hp-PCL");
    /**
     * URL doc flavor with a MIME Type of "application/pdf".
     */
    public static final DocFlavor.URL PDF = new URL("application/pdf");
    /**
     * URL doc flavor with a MIME Type of "image/png".
     */
    public static final DocFlavor.URL PNG = new URL("image/png");
    /**
     * URL doc flavor with a MIME Type of "application/postscript".
     */
    public static final DocFlavor.URL POSTSCRIPT = new URL("application/postscript");
    /**
     * URL doc flavor with a MIME Type of "text/html" in the host encoding.
     */
    public static final DocFlavor.URL TEXT_HTML_HOST = new URL("text/html; charset=" + hostEncoding);
    /**
     * URL doc flavor with a MIME Type of "text/html; charset=us-ascii".
     */
    public static final DocFlavor.URL TEXT_HTML_US_ASCII = new URL("text/html; charset=us-ascii");
    /**
     * URL doc flavor with a MIME Type of "text/html; charset=utf-16".
     */
    public static final DocFlavor.URL TEXT_HTML_UTF_16 = new URL("text/html; charset=utf-16");
    /**
     * URL doc flavor with a MIME Type of "text/html; charset=utf-16be".
     */
    public static final DocFlavor.URL TEXT_HTML_UTF_16BE = new URL("text/html; charset=utf-16be");
    /**
     * URL doc flavor with a MIME Type of "text/html; charset=utf-16le".
     */
    public static final DocFlavor.URL TEXT_HTML_UTF_16LE = new URL("text/html; charset=utf-16le");
    /**
     * URL doc flavor with a MIME Type of "text/html; charset=utf-8".
     */
    public static final DocFlavor.URL TEXT_HTML_UTF_8 = new URL("text/html; charset=utf-8");
    /**
     * URL doc flavor with a MIME Type of "text/plain" in the host encoding.
     */
    public static final DocFlavor.URL TEXT_PLAIN_HOST = new URL("text/plain; charset=" + hostEncoding);
    /**
     * URL doc flavor with a MIME Type of "text/plain; charset=us-ascii".
     */
    public static final DocFlavor.URL TEXT_PLAIN_US_ASCII = new URL("text/plain; charset=us-ascii");
    /**
     * URL doc flavor with a MIME Type of "text/plain; charset=utf-16".
     */
    public static final DocFlavor.URL TEXT_PLAIN_UTF_16 = new URL("text/plain; charset=utf-16");
    /**
     * URL doc flavor with a MIME Type of "text/plain; charset=utf-16be".
     */
    public static final DocFlavor.URL TEXT_PLAIN_UTF_16BE = new URL("text/plain; charset=utf-16be");
    /**
     * URL doc flavor with a MIME Type of "text/plain; charset=utf-16le".
     */
    public static final DocFlavor.URL TEXT_PLAIN_UTF_16LE = new URL("text/plain; charset=utf-16le");
    /**
     * URL doc flavor with a MIME Type of "text/plain; charset=utf-8".
     */
    public static final DocFlavor.URL TEXT_PLAIN_UTF_8 = new URL("text/plain; charset=utf-8");
    
    /**
     * Constructor for doc flavor objects with the given MIME type 
     * and a print data representation class name of "java.net.URL".
     * 
     * @param mimeType the mime type string
     * 
     * @throws NullPointerException if mimeType is <code>null</code>.
     * @throws IllegalArgumentException if mimeType has the wrong syntax.
     */
    public URL(String mimeType)
    {
      super(mimeType, "java.net.URL");
    }
  }
  
  private static final long serialVersionUID = -4512080796965449721L;
  
  /**
   * The string representing the host encoding. This is the encoding
   * used in the predefined HOST doc flavors 
   * (e.g. {@link BYTE_ARRAY#TEXT_HTML_HOST}).
   */
  public static final String hostEncoding = Charset.defaultCharset().name();

  private transient String mediaSubtype;
  private transient String mediaType;
  private transient TreeMap params;
  
  // name as defined in Serialized Form JDK 1.4
  private String myClassName;
  
  /**
   * Constructs a <code>DocFlavor</code> object with the given MIME type and 
   * representation class name.
   * 
   * @param mimeType the MIME type string.
   * @param className the fully-qualified name of the representation class.
   * 
   * @throws NullPointerException if mimeType or className are <code>null</code>.
   * @throws IllegalArgumentException if given mimeType has syntax errors.
   */
  public DocFlavor(String mimeType, String className)
  {
    if (mimeType == null || className == null)
      throw new NullPointerException();

    params = new TreeMap();
    parseMimeType(mimeType);
    
    myClassName = className;
  }
  
  /**
   * Parses the given string as MIME type.
   * The mediatype, mediasubtype and all parameter/value
   * combinations are extracted, comments are dropped.
   *  
   * @param mimeType the string to parse
   * @throws IllegalArgumentException if not conformant.
   */
  private void parseMimeType(String mimeType)
  {
    int MEDIA = 1;
    int MEDIASUB = 2;
    int PARAM_NAME = 3;
    int PARAM_VALUE = 4;
    int COMMENT_START = 5;
    
    int state = 0;
    int lastState = 0; // keeps track of state before comment
    int tok;
    
    try
      {
        String paramName = null;
        StreamTokenizer in = new StreamTokenizer(new StringReader(mimeType));
        in.resetSyntax();
        // Allowed characters are anything except:
        // SPACE, CTLs (= Unicode characters U+0000 - U+001F and U+007F)
        // and tspecials ( ) < > @ , ; : \ " / [ ] ? =
        in.whitespaceChars(0x00, 0x20);
        in.whitespaceChars(0x7F, 0x7F);
        in.wordChars('A', 'Z');
        in.wordChars('a', 'z');
        in.wordChars('0', '9');
        in.wordChars(0xA0, 0xFF);
        in.wordChars(0x21, 0x21);
        in.wordChars(0x23, 0x27);
        in.wordChars(0x2A, 0x2B);
        in.wordChars(0x2D, 0x2E);
        in.wordChars(0x5E, 0x60);
        in.wordChars(0x7B, 0x7E);
        in.quoteChar('"');

        while ((tok = in.nextToken()) != StreamTokenizer.TT_EOF)
          {
            switch (tok)
              {
              case StreamTokenizer.TT_WORD:
                if (state == 0)
                  {
                    mediaType = in.sval.toLowerCase();
                    state = MEDIA;
                    break;
                  }
                if (state == MEDIA)
                  {
                    mediaSubtype = in.sval.toLowerCase();
                    state = MEDIASUB;
                    break;
                  }
                // begin of parameters is either after mediasub or a parameter value
                if (state == MEDIASUB || state == PARAM_VALUE)
                  {
                    paramName = in.sval.toLowerCase();
                    state = PARAM_NAME;
                    break;
                  }
                // a parameter always needs to follow a value
                if (state == PARAM_NAME)
                  {
                    String paramValue = in.sval;
                    // if a charset param the value needs to be stored lowercase
                    if (paramName.equals("charset"))
                      paramValue = paramValue.toLowerCase();

                    state = PARAM_VALUE;
                    params.put(paramName, paramValue);
                    break;
                  }
                if (state == COMMENT_START)
                  {
                    // ignore;
                    break;
                  }
                break;
              case '/':
                // may only occur after the mediatype
                if (state != MEDIA)
                  throw new IllegalArgumentException();

                break;
              case '=':
                // may only occur after a parameter
                if (state != PARAM_NAME)
                  throw new IllegalArgumentException();

                break;
              case ';':
                // differentiates mime type and parameters/value combinations
                if (state != MEDIASUB && state != PARAM_VALUE)
                  throw new IllegalArgumentException();

                break;
              case '(': // begin comment
                lastState = state;
                state = COMMENT_START;
                break;
              case ')': // end comment
                state = lastState;
                break;
              // a parameter always needs to follow a value / or quoted value
              case '"':
                if (state == PARAM_NAME)
                  {
                    String paramValue = in.sval;
                    // if a charset param the value needs to be stored lowercase
                    if (paramName.equals("charset"))
                      paramValue = paramValue.toLowerCase();

                    state = PARAM_VALUE;
                    params.put(paramName, paramValue);
                    break;
                  }

                // only values may be quoted
                throw new IllegalArgumentException();
              default:
                // if any other char is observed its not allowed
                throw new IllegalArgumentException();
              }
          }
      }
    catch (IOException e)
      {
        // should not happen as mimetype str cannot be null
        throw new InternalError("IOException during parsing String " + mimeType);
      }
  }
  
  /**
   * Checks if this doc flavor object is equal to the given object.
   * <p>
   * Two doc flavor objects are considered equal if the provided object is not
   * <code>null</code> and an instance of <code>DocFlavor</code>. The MIME
   * types has to be equal in their media type, media subtype, their
   * paramter/value combinations and the representation classname.
   * </p>
   * 
   * @param obj the object to test.
   * @return <code>true</code> if equal, <code>false</code> otherwise.
   */
  public boolean equals(Object obj)
  {
    if (! (obj instanceof DocFlavor))
      return false;

    DocFlavor tmp = (DocFlavor) obj;

    return (getMimeType().equals(tmp.getMimeType())
	    && getRepresentationClassName().equals(tmp.getRepresentationClassName()));
  }

  /**
   * Returns the media subtype of this flavor object.
   * A mimetype of "text/html; charset=us-ascii" will
   * return "html" as the media subtype. 
   * 
   * @return The media subtype.
   */
  public String getMediaSubtype()
  {
    return mediaSubtype;
  }

  /**
   * Returns the media type of this flavor object.
   * A mimetype of "text/html; charset=us-ascii" will
   * return "text" as the media type.
   * 
   * @return The media type.
   */
  public String getMediaType()
  {
    return mediaType;
  }

  /**
   * Returns the mime type of this flavor object.
   * The mimetype will have every parameter value
   * enclosed in quotes.
   * 
   * @return The mime type.
   */
  public String getMimeType()
  {
    String mimeType = getMediaType() + "/" + getMediaSubtype();
    Iterator it = params.entrySet().iterator();

    while (it.hasNext())
      {
	Map.Entry entry = (Map.Entry) it.next();
	mimeType += "; " + entry.getKey() + "=\"" + entry.getValue() + "\"";
      }

    return mimeType;
  }

  /**
   * Returns the value for an optional parameter of the mime type of this
   * flavor object.
   * 
   * @param paramName the name of the parameter
   * @return The value for the parameter, or <code>null</code> if none bound.
   * @throws NullPointerException if paramName is <code>null</code>.
   */
  public String getParameter(String paramName)
  {
    if (paramName == null)
      throw new NullPointerException();
    
    return (String) params.get(paramName.toLowerCase());
  }

  /**
   * Returns the name of the representation class of this flavor object.
   * 
   * @return The representation classname.
   */
  public String getRepresentationClassName()
  {
    return myClassName;
  }

  /**
   * Returns a hash code for this doc flavor object.
   * 
   * @return The hashcode.
   */
  public int hashCode()
  {
    return ((mediaType.hashCode()
	     * mediaSubtype.hashCode()
	     * myClassName.hashCode()) ^ params.hashCode());
  }

  /**
   * Returns a string representation of this doc flavor object.
   * The returned string is of the form
   * getMimeType() + "; class=\"" + getRepresentationClassName() + "\"";
   * 
   * @return The constructed string representation.
   */
  public String toString()
  {
    return getMimeType() + "; class=\"" + getRepresentationClassName() + "\"";
  }
  
  // needs special treatment for serialization
  private void readObject(ObjectInputStream stream) 
    throws IOException, ClassNotFoundException
  {
    params = new TreeMap();
    myClassName = (String) stream.readObject();
    parseMimeType((String) stream.readObject());
  }

  private void writeObject(java.io.ObjectOutputStream stream)
    throws IOException
  {
    stream.writeObject(myClassName);
    stream.writeObject(getMimeType());
  }
}
