/* * Copyright (c) 2000, 2014, 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. * *

* An unmodifiable view U of an AttributeSet S provides a * client with "read-only" access to S. Query operations on U * "read through" to S; thus, changes in S are reflected in * U. However, any attempt to modify U, * results in an UnmodifiableSetException. * The unmodifiable view object U will be serializable if the * attribute set object S is serializable. *

* A synchronized view V of an attribute set S provides a * client with synchronized (multiple thread safe) access to S. Each * operation of V is synchronized using V itself as the lock * object and then merely invokes the corresponding operation of S. In * order to guarantee mutually exclusive access, it is critical that all * access to S is accomplished through V. The synchronized view * object V will be serializable if the attribute set object S * is serializable. *

* 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 static final long serialVersionUID = -6131802583863447813L; 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 { private static final long serialVersionUID = -6349408326066898956L; public UnmodifiableDocAttributeSet(DocAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintRequestAttributeSet extends UnmodifiableAttributeSet implements PrintRequestAttributeSet, Serializable { private static final long serialVersionUID = 7799373532614825073L; public UnmodifiablePrintRequestAttributeSet (PrintRequestAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintJobAttributeSet extends UnmodifiableAttributeSet implements PrintJobAttributeSet, Serializable { private static final long serialVersionUID = -8002245296274522112L; public UnmodifiablePrintJobAttributeSet (PrintJobAttributeSet attributeSet) { super (attributeSet); } } /** * @serial include */ private static class UnmodifiablePrintServiceAttributeSet extends UnmodifiableAttributeSet implements PrintServiceAttributeSet, Serializable { private static final long serialVersionUID = -7112165137107826819L; public UnmodifiablePrintServiceAttributeSet (PrintServiceAttributeSet attributeSet) { super (attributeSet); } } /** * Creates an unmodifiable view of the given attribute set. * * @param attributeSet Underlying attribute set. * * @return Unmodifiable view of attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 static final long serialVersionUID = 8365731020128564925L; 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 { private static final long serialVersionUID = 6455869095246629354L; public SynchronizedDocAttributeSet(DocAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintRequestAttributeSet extends SynchronizedAttributeSet implements PrintRequestAttributeSet, Serializable { private static final long serialVersionUID = 5671237023971169027L; public SynchronizedPrintRequestAttributeSet (PrintRequestAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintJobAttributeSet extends SynchronizedAttributeSet implements PrintJobAttributeSet, Serializable { private static final long serialVersionUID = 2117188707856965749L; public SynchronizedPrintJobAttributeSet (PrintJobAttributeSet attributeSet) { super(attributeSet); } } /** * @serial include */ private static class SynchronizedPrintServiceAttributeSet extends SynchronizedAttributeSet implements PrintServiceAttributeSet, Serializable { private static final long serialVersionUID = -2830705374001675073L; public SynchronizedPrintServiceAttributeSet (PrintServiceAttributeSet attributeSet) { super(attributeSet); } } /** * Creates a synchronized view of the given attribute set. * * @param attributeSet Underlying attribute set. * * @return Synchronized view of attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. * * @exception NullPointerException * Thrown if attributeSet 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 attributeSet. */ 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 object is a {@link java.lang.Class Class} * that implements interfaceName, * object is returned downcast to type {@link * java.lang.Class Class}; otherwise an exception is thrown. * * @exception NullPointerException * (unchecked exception) Thrown if object is null. * @exception ClassCastException * (unchecked exception) Thrown if object is not a * {@link java.lang.Class Class} that implements * interfaceName. */ 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 object is an instance of * interfaceName, object is returned * downcast to type {@link Attribute Attribute}; otherwise an * exception is thrown. * * @exception NullPointerException * (unchecked exception) Thrown if object is null. * @exception ClassCastException * (unchecked exception) Thrown if object is not an * instance of interfaceName. */ 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 category is * null or if the attribute is null. * @exception IllegalArgumentException * (unchecked exception) Thrown if the category is not * equal to the category of the attribute. */ public static void verifyCategoryForValue(Class category, Attribute attribute) { if (!category.equals (attribute.getCategory())) { throw new IllegalArgumentException(); } } }