/* * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.print.attribute; import java.io.Serializable; /** * Class AttributeSetUtilities provides static methods for manipulating * AttributeSets. * <ul> * <li>Methods for creating unmodifiable and synchronized views of attribute * sets. * <li>operations useful for building * implementations of interface {@link AttributeSet AttributeSet} * </ul> * <P> * An <B>unmodifiable view</B> <I>U</I> of an AttributeSet <I>S</I> provides a * client with "read-only" access to <I>S</I>. Query operations on <I>U</I> * "read through" to <I>S</I>; thus, changes in <I>S</I> are reflected in * <I>U</I>. However, any attempt to modify <I>U</I>, * results in an UnmodifiableSetException. * The unmodifiable view object <I>U</I> will be serializable if the * attribute set object <I>S</I> is serializable. * <P> * A <B>synchronized view</B> <I>V</I> of an attribute set <I>S</I> provides a * client with synchronized (multiple thread safe) access to <I>S</I>. Each * operation of <I>V</I> is synchronized using <I>V</I> itself as the lock * object and then merely invokes the corresponding operation of <I>S</I>. In * order to guarantee mutually exclusive access, it is critical that all * access to <I>S</I> is accomplished through <I>V</I>. The synchronized view * object <I>V</I> will be serializable if the attribute set object <I>S</I> * is serializable. * <P> * As mentioned in the package description of javax.print, a null reference * parameter to methods is * incorrect unless explicitly documented on the method as having a meaningful * interpretation. Usage to the contrary is incorrect coding and may result in * a run time exception either immediately * or at some later time. IllegalArgumentException and NullPointerException * are examples of typical and acceptable run time exceptions for such cases. * * @author Alan Kaminsky */ public final class AttributeSetUtilities { /* Suppress default constructor, ensuring non-instantiability. */ private AttributeSetUtilities() { } /** * @serial include */ private static class UnmodifiableAttributeSet implements AttributeSet, Serializable { private AttributeSet attrset; /* Unmodifiable view of the underlying attribute set. */ public UnmodifiableAttributeSet(AttributeSet attributeSet) { attrset = attributeSet; } public Attribute get(Class<?> key) { return attrset.get(key); } public boolean add(Attribute attribute) { throw new UnmodifiableSetException(); } public synchronized boolean remove(Class<?> category) { throw new UnmodifiableSetException(); } public boolean remove(Attribute attribute) { throw new UnmodifiableSetException(); } public boolean containsKey(Class<?> category) { return attrset.containsKey(category); } public boolean containsValue(Attribute attribute) { return attrset.containsValue(attribute); } public boolean addAll(AttributeSet attributes) { throw new UnmodifiableSetException(); } public int size() { return attrset.size(); } public Attribute[] toArray() { return attrset.toArray(); } public void clear() { throw new UnmodifiableSetException(); } public boolean isEmpty() { return attrset.isEmpty(); } public boolean equals(Object o) { return attrset.equals (o); } public int hashCode() { return attrset.hashCode(); } } /** * @serial include */ private static class UnmodifiableDocAttributeSet extends UnmodifiableAttributeSet implements DocAttributeSet, Serializable { public UnmodifiableDocAttributeSet(DocAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintRequestAttributeSet extends UnmodifiableAttributeSet implements PrintRequestAttributeSet, Serializable { public UnmodifiablePrintRequestAttributeSet (PrintRequestAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintJobAttributeSet extends UnmodifiableAttributeSet implements PrintJobAttributeSet, Serializable { public UnmodifiablePrintJobAttributeSet (PrintJobAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintServiceAttributeSet extends UnmodifiableAttributeSet implements PrintServiceAttributeSet, Serializable { public UnmodifiablePrintServiceAttributeSet (PrintServiceAttributeSet attributeSet) { super (attributeSet); } } /** * Creates an unmodifiable view of the given attribute set. * * @param attributeSet Underlying attribute set. * * @return Unmodifiable view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. Null is never a */ public static AttributeSet unmodifiableView(AttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new UnmodifiableAttributeSet(attributeSet); } /** * Creates an unmodifiable view of the given doc attribute set. * * @param attributeSet Underlying doc attribute set. * * @return Unmodifiable view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static DocAttributeSet unmodifiableView (DocAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new UnmodifiableDocAttributeSet(attributeSet); } /** * Creates an unmodifiable view of the given print request attribute set. * * @param attributeSet Underlying print request attribute set. * * @return Unmodifiable view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static PrintRequestAttributeSet unmodifiableView(PrintRequestAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new UnmodifiablePrintRequestAttributeSet(attributeSet); } /** * Creates an unmodifiable view of the given print job attribute set. * * @param attributeSet Underlying print job attribute set. * * @return Unmodifiable view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static PrintJobAttributeSet unmodifiableView(PrintJobAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new UnmodifiablePrintJobAttributeSet(attributeSet); } /** * Creates an unmodifiable view of the given print service attribute set. * * @param attributeSet Underlying print service attribute set. * * @return Unmodifiable view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static PrintServiceAttributeSet unmodifiableView(PrintServiceAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new UnmodifiablePrintServiceAttributeSet (attributeSet); } /** * @serial include */ private static class SynchronizedAttributeSet implements AttributeSet, Serializable { private AttributeSet attrset; public SynchronizedAttributeSet(AttributeSet attributeSet) { attrset = attributeSet; } public synchronized Attribute get(Class<?> category) { return attrset.get(category); } public synchronized boolean add(Attribute attribute) { return attrset.add(attribute); } public synchronized boolean remove(Class<?> category) { return attrset.remove(category); } public synchronized boolean remove(Attribute attribute) { return attrset.remove(attribute); } public synchronized boolean containsKey(Class<?> category) { return attrset.containsKey(category); } public synchronized boolean containsValue(Attribute attribute) { return attrset.containsValue(attribute); } public synchronized boolean addAll(AttributeSet attributes) { return attrset.addAll(attributes); } public synchronized int size() { return attrset.size(); } public synchronized Attribute[] toArray() { return attrset.toArray(); } public synchronized void clear() { attrset.clear(); } public synchronized boolean isEmpty() { return attrset.isEmpty(); } public synchronized boolean equals(Object o) { return attrset.equals (o); } public synchronized int hashCode() { return attrset.hashCode(); } } /** * @serial include */ private static class SynchronizedDocAttributeSet extends SynchronizedAttributeSet implements DocAttributeSet, Serializable { public SynchronizedDocAttributeSet(DocAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintRequestAttributeSet extends SynchronizedAttributeSet implements PrintRequestAttributeSet, Serializable { public SynchronizedPrintRequestAttributeSet (PrintRequestAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintJobAttributeSet extends SynchronizedAttributeSet implements PrintJobAttributeSet, Serializable { public SynchronizedPrintJobAttributeSet (PrintJobAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintServiceAttributeSet extends SynchronizedAttributeSet implements PrintServiceAttributeSet, Serializable { public SynchronizedPrintServiceAttributeSet (PrintServiceAttributeSet attributeSet) { super(attributeSet); } } /** * Creates a synchronized view of the given attribute set. * * @param attributeSet Underlying attribute set. * * @return Synchronized view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static AttributeSet synchronizedView (AttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new SynchronizedAttributeSet(attributeSet); } /** * Creates a synchronized view of the given doc attribute set. * * @param attributeSet Underlying doc attribute set. * * @return Synchronized view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static DocAttributeSet synchronizedView(DocAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new SynchronizedDocAttributeSet(attributeSet); } /** * Creates a synchronized view of the given print request attribute set. * * @param attributeSet Underlying print request attribute set. * * @return Synchronized view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static PrintRequestAttributeSet synchronizedView(PrintRequestAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new SynchronizedPrintRequestAttributeSet(attributeSet); } /** * Creates a synchronized view of the given print job attribute set. * * @param attributeSet Underlying print job attribute set. * * @return Synchronized view of <CODE>attributeSet</CODE>. * * @exception NullPointerException * Thrown if <CODE>attributeSet</CODE> is null. */ public static PrintJobAttributeSet synchronizedView(PrintJobAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new SynchronizedPrintJobAttributeSet(attributeSet); } /** * Creates a synchronized view of the given print service attribute set. * * @param attributeSet Underlying print service attribute set. * * @return Synchronized view of <CODE>attributeSet</CODE>. */ public static PrintServiceAttributeSet synchronizedView(PrintServiceAttributeSet attributeSet) { if (attributeSet == null) { throw new NullPointerException(); } return new SynchronizedPrintServiceAttributeSet(attributeSet); } /** * Verify that the given object is a {@link java.lang.Class Class} that * implements the given interface, which is assumed to be interface {@link * Attribute Attribute} or a subinterface thereof. * * @param object Object to test. * @param interfaceName Interface the object must implement. * * @return If <CODE>object</CODE> is a {@link java.lang.Class Class} * that implements <CODE>interfaceName</CODE>, * <CODE>object</CODE> is returned downcast to type {@link * java.lang.Class Class}; otherwise an exception is thrown. * * @exception NullPointerException * (unchecked exception) Thrown if <CODE>object</CODE> is null. * @exception ClassCastException * (unchecked exception) Thrown if <CODE>object</CODE> is not a * {@link java.lang.Class Class} that implements * <CODE>interfaceName</CODE>. */ public static Class<?> verifyAttributeCategory(Object object, Class<?> interfaceName) { Class result = (Class) object; if (interfaceName.isAssignableFrom (result)) { return result; } else { throw new ClassCastException(); } } /** * Verify that the given object is an instance of the given interface, which * is assumed to be interface {@link Attribute Attribute} or a subinterface * thereof. * * @param object Object to test. * @param interfaceName Interface of which the object must be an instance. * * @return If <CODE>object</CODE> is an instance of * <CODE>interfaceName</CODE>, <CODE>object</CODE> is returned * downcast to type {@link Attribute Attribute}; otherwise an * exception is thrown. * * @exception NullPointerException * (unchecked exception) Thrown if <CODE>object</CODE> is null. * @exception ClassCastException * (unchecked exception) Thrown if <CODE>object</CODE> is not an * instance of <CODE>interfaceName</CODE>. */ public static Attribute verifyAttributeValue(Object object, Class<?> interfaceName) { if (object == null) { throw new NullPointerException(); } else if (interfaceName.isInstance (object)) { return (Attribute) object; } else { throw new ClassCastException(); } } /** * Verify that the given attribute category object is equal to the * category of the given attribute value object. If so, this method * returns doing nothing. If not, this method throws an exception. * * @param category Attribute category to test. * @param attribute Attribute value to test. * * @exception NullPointerException * (unchecked exception) Thrown if the <CODE>category</CODE> is * null or if the <CODE>attribute</CODE> is null. * @exception IllegalArgumentException * (unchecked exception) Thrown if the <CODE>category</CODE> is not * equal to the category of the <CODE>attribute</CODE>. */ public static void verifyCategoryForValue(Class<?> category, Attribute attribute) { if (!category.equals (attribute.getCategory())) { throw new IllegalArgumentException(); } } }