/* AttributeSetUtilities.java -- 
   Copyright (C) 2003, 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.attribute;

import java.io.Serializable;

/**
 * <code>AttributeSetUtilities</code> provides static methods for working
 * with <code>AttributeSet</code>s.
 * <p>
 * For every type of an attribute set available in the Java Print Service API
 * are methods provided to get an unmodifiable view of an attribute set.
 * This unmodifiable view provides a read-only version of the attribute
 * set which throws {@link javax.print.attribute.UnmodifiableSetException}s
 * if state changing methods are invoked.
 * </p>
 * <p>
 * Methods for getting a synchronized view of an attribute set are also 
 * available. This view provides synchronized (thread safe) access to the
 * underlying wrapped attribute set.
 * </P>
 * <p>
 * Three static methods for the implementation of own AttributeSets
 * are provided, which verify that:
 * <ul>
 * <li>the given object is an attribute of the given interface.</li>
 * <li>the category of given attribute is equals to a given category.</li>
 * <li>the given object is a <code>Class</code> that implements the given 
 * interface name.</li>
 * </ul>
 * 
 */
public final class AttributeSetUtilities
{
  /**
   * This class isn't intended to be instantiated.
   */
  private AttributeSetUtilities() 
  {
    // only static methods
  }

  private static class UnmodifiableAttributeSet
    implements AttributeSet, Serializable
  {
    private AttributeSet attrset;

    public UnmodifiableAttributeSet(AttributeSet attributeSet)
    {
      if (attributeSet == null)
        throw new NullPointerException("attributeSet may not be null");

      this.attrset = attributeSet;
    }

    public boolean add(Attribute attribute)
    {
      throw new UnmodifiableSetException();
    }

    public boolean addAll(AttributeSet attributes)
    {
      throw new UnmodifiableSetException();
    }
    
    public void clear()
    {
      throw new UnmodifiableSetException();
    }

    public boolean containsKey(Class category)
    {
      return attrset.containsKey(category);
    }

    public boolean containsValue(Attribute attribute)
    {
      return attrset.containsValue(attribute);
    }

    public boolean equals(Object obj)
    {
      return attrset.equals(obj);
    }
    
    public Attribute get(Class interfaceName)
    {
      return attrset.get(interfaceName);
    }

    public int hashCode()
    {
      return attrset.hashCode();
    }
    
    public boolean isEmpty()
    {
      return attrset.isEmpty();
    }

    public boolean remove(Class category)
    {
      throw new UnmodifiableSetException();
    }

    public boolean remove(Attribute attribute)
    {
      throw new UnmodifiableSetException();
    }

    public int size()
    {
      return attrset.size();
    }

    public Attribute[] toArray()
    {
      return attrset.toArray();
    }
  }

  private static class UnmodifiableDocAttributeSet
    extends UnmodifiableAttributeSet
    implements DocAttributeSet, Serializable
  {
    public UnmodifiableDocAttributeSet(DocAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class UnmodifiablePrintJobAttributeSet
    extends UnmodifiableAttributeSet
    implements PrintJobAttributeSet, Serializable
  {
    public UnmodifiablePrintJobAttributeSet(PrintJobAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class UnmodifiablePrintRequestAttributeSet
    extends UnmodifiableAttributeSet
    implements PrintRequestAttributeSet, Serializable
  {
    public UnmodifiablePrintRequestAttributeSet(PrintRequestAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class UnmodifiablePrintServiceAttributeSet
    extends UnmodifiableAttributeSet
    implements PrintServiceAttributeSet, Serializable
  {
    public UnmodifiablePrintServiceAttributeSet(PrintServiceAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class SynchronizedAttributeSet
    implements AttributeSet, Serializable
  {
    private AttributeSet attrset;

    public SynchronizedAttributeSet(AttributeSet attributeSet)
    {
      if (attributeSet == null)
        throw new NullPointerException("attributeSet may not be null");

      attrset = attributeSet;
    }

    public synchronized boolean add(Attribute attribute)
    {
      return attrset.add(attribute);
    }

    public synchronized boolean addAll(AttributeSet attributes)
    {
      return attrset.addAll(attributes);
    }
    
    public synchronized void clear()
    {
      attrset.clear();
    }

    public synchronized boolean containsKey(Class category)
    {
      return attrset.containsKey(category);
    }

    public synchronized boolean containsValue(Attribute attribute)
    {
      return attrset.containsValue(attribute);
    }

    public synchronized boolean equals(Object obj)
    {
      return attrset.equals(obj);
    }
    
    public synchronized Attribute get(Class interfaceName)
    {
      return attrset.get(interfaceName);
    }

    public synchronized int hashCode()
    {
      return attrset.hashCode();
    }
    
    public synchronized boolean isEmpty()
    {
      return attrset.isEmpty();
    }

    public synchronized boolean remove(Class category)
    {
      return attrset.remove(category);
    }

    public synchronized boolean remove(Attribute attribute)
    {
      return attrset.remove(attribute);
    }

    public synchronized int size()
    {
      return attrset.size();
    }

    public synchronized Attribute[] toArray()
    {
      return attrset.toArray();
    }
  }

  private static class SynchronizedDocAttributeSet
    extends SynchronizedAttributeSet
    implements DocAttributeSet, Serializable
  {
    public SynchronizedDocAttributeSet(DocAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class SynchronizedPrintJobAttributeSet
    extends SynchronizedAttributeSet
    implements PrintJobAttributeSet, Serializable
  {
    public SynchronizedPrintJobAttributeSet(PrintJobAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class SynchronizedPrintRequestAttributeSet
    extends SynchronizedAttributeSet
    implements PrintRequestAttributeSet, Serializable
  {
    public SynchronizedPrintRequestAttributeSet(PrintRequestAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  private static class SynchronizedPrintServiceAttributeSet
    extends SynchronizedAttributeSet
    implements PrintServiceAttributeSet, Serializable
  {
    public SynchronizedPrintServiceAttributeSet(PrintServiceAttributeSet attributeSet)
    {
      super(attributeSet);
    }
  }

  /**
   * Returns a synchronized view of the given attribute set.
   *
   * @param attributeSet the set to synchronize.
   * @return The sychronized attribute set.
   */
  public static AttributeSet synchronizedView(AttributeSet attributeSet)
  {
    return new SynchronizedAttributeSet(attributeSet);
  }

  /**
   * Returns a synchronized view of the given attribute set.
   *
   * @param attributeSet the set to synchronize.
   * @return The sychronized attribute set.
   */
  public static DocAttributeSet synchronizedView(DocAttributeSet attributeSet)
  {
    return new SynchronizedDocAttributeSet(attributeSet);
  }
  
  /**
   * Returns a synchronized view of the given attribute set.
   *
   * @param attributeSet the set to synchronize.
   * @return The sychronized attribute set.
   */
  public static PrintJobAttributeSet synchronizedView(PrintJobAttributeSet attributeSet)
  {
    return new SynchronizedPrintJobAttributeSet(attributeSet);
  }
  
  /**
   * Returns a synchronized view of the given attribute set.
   *
   * @param attributeSet the set to synchronize.
   * @return The sychronized attribute set.
   */
  public static PrintRequestAttributeSet synchronizedView(PrintRequestAttributeSet attributeSet)
  {
    return new SynchronizedPrintRequestAttributeSet(attributeSet);
  }
  
  /**
   * Returns a synchronized view of the given attribute set.
   *
   * @param attributeSet the set to synchronize.
   * @return The sychronized attribute set.
   */
  public static PrintServiceAttributeSet synchronizedView(PrintServiceAttributeSet attributeSet)
  {
    return new SynchronizedPrintServiceAttributeSet(attributeSet);
  }
  
  /**
   * Returns an unmodifiable view of the given attribute set.
   *
   * @param attributeSet the set to make unmodifiable.
   * @return The unmodifiable attribute set.
   */
  public static AttributeSet unmodifiableView(AttributeSet attributeSet)
  {
    return new UnmodifiableAttributeSet(attributeSet);
  }
  
  /**
   * Returns an unmodifiable view of the given attribute set.
   *
   * @param attributeSet the set to make unmodifiable.
   * @return The unmodifiable attribute set.
   */
  public static DocAttributeSet unmodifiableView(DocAttributeSet attributeSet)
  {
    return new UnmodifiableDocAttributeSet(attributeSet);
  }
  
  /**
   * Returns an unmodifiable view of the given attribute set.
   *
   * @param attributeSet the set to make unmodifiable.
   * @return The unmodifiable attribute set.
   */
  public static PrintJobAttributeSet unmodifiableView(PrintJobAttributeSet attributeSet)
  {
    return new UnmodifiablePrintJobAttributeSet(attributeSet);
  }
  
  /**
   * Returns an unmodifiable view of the given attribute set.
   *
   * @param attributeSet the set to make unmodifiable.
   * @return The unmodifiable attribute set.
   */
  public static PrintRequestAttributeSet unmodifiableView(PrintRequestAttributeSet attributeSet)
  {
    return new UnmodifiablePrintRequestAttributeSet(attributeSet);
  }
  
  /**
   * Returns an unmodifiable view of the given attribute set.
   *
   * @param attributeSet the set to make unmodifiable.
   * @return The unmodifiable attribute set.
   */
  public static PrintServiceAttributeSet unmodifiableView(PrintServiceAttributeSet attributeSet)
  {
    return new UnmodifiablePrintServiceAttributeSet(attributeSet);
  }

  /**
   * Verifies that the given object is a <code>Class</code> that
   * implements the given interface name and returns it casted.
   * 
   * @param object the object to test.
   * @param interfaceName the <code>Class</code> to verify against.
   * @return object casted to <code>Class</code>
   *
   * @exception ClassCastException if object is not a <code>Class</code>
   * that implements interfaceName
   * @exception NullPointerException if object is null
   */
  public static Class verifyAttributeCategory(Object object,
                                              Class interfaceName)
  {
    if (object == null)
      throw new NullPointerException("object may not be null");

    Class clazz = (Class) object;

    if (interfaceName.isAssignableFrom(clazz))
      return clazz;

    throw new ClassCastException();
  }
  
  /**
   * Verifies that the given object is an attribute of the given interface.
   * and returns it casted to the interface type.
   * 
   * @param object the object to test.
   * @param interfaceName the <code>Class</code> to verify against.
   * @return the object casted to <code>Attribute</code>
   *
   * @exception ClassCastException if object is no instance of interfaceName.
   * @exception NullPointerException if object is null
   */
  public static Attribute verifyAttributeValue(Object object,
                                               Class interfaceName)
  {
    if (object == null)
      throw new NullPointerException("object may not be null");

    if (interfaceName.isInstance(object))
      return (Attribute) object;

    throw new ClassCastException();
  }

  /**
   * Verifies that the category of attribute is equals to the given category
   * class.
   * 
   * @param category the category to test.
   * @param attribute the attribute to verify.
   *
   * @exception IllegalArgumentException if the categories are not equal
   * @exception NullPointerException if category is null
   */
  public static void verifyCategoryForValue(Class category,
                                            Attribute attribute)
  {
    if (category == null || attribute == null)
      throw new NullPointerException("category or attribute may not be null");

    if (!category.equals(attribute.getCategory()))
      throw new IllegalArgumentException
        ("category of attribute not equal to category");
  }
}
