/* * Copyright (c) 2000, 2017, 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; /** * Interface {@code AttributeSet} specifies the interface for a set of printing * attributes. A printing attribute is an object whose class implements * interface {@link Attribute Attribute}. *

* An attribute set contains a group of attribute values, where duplicate * values are not allowed in the set. Furthermore, each value in an attribute * set is a member of some category, and at most one value in any * particular category is allowed in the set. For an attribute set, the values * are {@link Attribute Attribute} objects, and the categories are * {@link Class Class} objects. An attribute's category is the class (or * interface) at the root of the class hierarchy for that kind of attribute. * Note that an attribute object's category may be a superclass of the attribute * object's class rather than the attribute object's class itself. An attribute * object's category is determined by calling the * {@link Attribute#getCategory() getCategory()} method defined in interface * {@link Attribute Attribute}. *

* The interfaces of an {@code AttributeSet} resemble those of the Java * Collections API's {@code java.util.Map} interface, but is more restrictive in * the types it will accept, and combines keys and values into an * {@code Attribute}. *

* Attribute sets are used in several places in the Print Service API. In each * context, only certain kinds of attributes are allowed to appear in the * attribute set, as determined by the tagging interfaces which the attribute * class implements -- {@link DocAttribute DocAttribute}, * {@link PrintRequestAttribute PrintRequestAttribute}, * {@link PrintJobAttribute PrintJobAttribute}, and * {@link PrintServiceAttribute PrintServiceAttribute}. * There are four specializations of an attribute set that are restricted to * contain just one of the four kinds of attribute -- * {@link DocAttributeSet DocAttributeSet}, * {@link PrintRequestAttributeSet PrintRequestAttributeSet}, * {@link PrintJobAttributeSet PrintJobAttributeSet}, and * {@link PrintServiceAttributeSet PrintServiceAttributeSet}, respectively. Note * that many attribute classes implement more than one tagging interface and so * may appear in more than one context. *

* In some contexts, the client is only allowed to examine an attribute set's * contents but not change them (the set is read-only). In other places, the * client is allowed both to examine and to change an attribute set's contents * (the set is read-write). For a read-only attribute set, calling a mutating * operation throws an {@code UnmodifiableSetException}. *

* The Print Service API provides one implementation of interface * {@code AttributeSet}, class {@link HashAttributeSet HashAttributeSet}. A * client can use class {@link HashAttributeSet HashAttributeSet} or provide its * own implementation of interface {@code AttributeSet}. The Print Service API * also provides implementations of interface {@code AttributeSet}'s * subinterfaces -- classes * {@link HashDocAttributeSet HashDocAttributeSet}, * {@link HashPrintRequestAttributeSet HashPrintRequestAttributeSet}, * {@link HashPrintJobAttributeSet HashPrintJobAttributeSet}, and * {@link HashPrintServiceAttributeSet HashPrintServiceAttributeSet}. * * @author Alan Kaminsky */ public interface AttributeSet { /** * Returns the attribute value which this attribute set contains in the * given attribute category. Returns {@code null} if this attribute set does * not contain any attribute value in the given attribute category. * * @param category attribute category whose associated attribute value is * to be returned. It must be a {@link Class Class} that implements * interface {@link Attribute Attribute}. * @return the attribute value in the given attribute category contained in * this attribute set, or {@code null} if this attribute set does * not contain any attribute value in the given attribute category * @throws NullPointerException if the {@code category} is {@code null} * @throws ClassCastException if the {@code category} is not a * {@link Class Class} that implements interface * {@link Attribute Attribute} */ public Attribute get(Class category); /** * Adds the specified attribute to this attribute set if it is not already * present, first removing any existing value in the same attribute category * as the specified attribute value. * * @param attribute attribute value to be added to this attribute set * @return {@code true} if this attribute set changed as a result of the * call, i.e., the given attribute value was not already a member of * this attribute set * @throws NullPointerException if the {@code attribute} is {@code null} * @throws UnmodifiableSetException if this attribute set does not support * the {@code add()} operation */ public boolean add(Attribute attribute); /** * Removes any attribute for this category from this attribute set if * present. If {@code category} is {@code null}, then {@code remove()} does * nothing and returns {@code false}. * * @param category attribute category to be removed from this attribute set * @return {@code true} if this attribute set changed as a result of the * call, i.e., the given attribute value had been a member of this * attribute set * @throws UnmodifiableSetException if this attribute set does not support * the {@code remove()} operation */ public boolean remove(Class category); /** * Removes the specified attribute from this attribute set if present. If * {@code attribute} is {@code null}, then {@code remove()} does nothing and * returns {@code false}. * * @param attribute attribute value to be removed from this attribute set * @return {@code true} if this attribute set changed as a result of the * call, i.e., the given attribute value had been a member of this * attribute set * @throws UnmodifiableSetException if this attribute set does not support * the {@code remove()} operation */ public boolean remove(Attribute attribute); /** * Returns {@code true} if this attribute set contains an attribute for the * specified category. * * @param category whose presence in this attribute set is to be tested * @return {@code true} if this attribute set contains an attribute value * for the specified category */ public boolean containsKey(Class category); /** * Returns {@code true} if this attribute set contains the given attribute * value. * * @param attribute attribute value whose presence in this attribute set is * to be tested * @return {@code true} if this attribute set contains the given attribute * value */ public boolean containsValue(Attribute attribute); /** * Adds all of the elements in the specified set to this attribute. The * outcome is the same as if the = {@link #add(Attribute) add(Attribute)} * operation had been applied to this attribute set successively with each * element from the specified set. The behavior of the * {@code addAll(AttributeSet)} operation is unspecified if the specified * set is modified while the operation is in progress. *

* If the {@code addAll(AttributeSet)} operation throws an exception, the * effect on this attribute set's state is implementation dependent; * elements from the specified set before the point of the exception may or * may not have been added to this attribute set. * * @param attributes whose elements are to be added to this attribute set * @return {@code true} if this attribute set changed as a result of the * call * @throws UnmodifiableSetException if this attribute set does not support * the {@code addAll(AttributeSet)} method * @throws NullPointerException if some element in the specified set is * {@code null} * @see #add(Attribute) */ public boolean addAll(AttributeSet attributes); /** * Returns the number of attributes in this attribute set. If this attribute * set contains more than {@code Integer.MAX_VALUE} elements, returns * {@code Integer.MAX_VALUE}. * * @return the number of attributes in this attribute set */ public int size(); /** * Returns an array of the attributes contained in this set. * * @return the {@code Attributes} contained in this set as an array, zero * length if the {@code AttributeSet} is empty */ public Attribute[] toArray(); /** * Removes all attributes from this attribute set. * * @throws UnmodifiableSetException if this attribute set does not support * the {@code clear()} operation */ public void clear(); /** * Returns {@code true} if this attribute set contains no attributes. * * @return {@code true} if this attribute set contains no attributes */ public boolean isEmpty(); /** * Compares the specified object with this attribute set for equality. * Returns {@code true} if the given object is also an attribute set and the * two attribute sets contain the same attribute category-attribute value * mappings. This ensures that the {@code equals()} method works properly * across different implementations of the {@code AttributeSet} interface. * * @param object to be compared for equality with this attribute set * @return {@code true} if the specified object is equal to this attribute * set */ public boolean equals(Object object); /** * Returns the hash code value for this attribute set. The hash code of an * attribute set is defined to be the sum of the hash codes of each entry in * the {@code AttributeSet}. This ensures that {@code t1.equals(t2)} implies * that {@code t1.hashCode()==t2.hashCode()} for any two attribute sets * {@code t1} and {@code t2}, as required by the general contract of * {@link Object#hashCode() Object.hashCode()}. * * @return the hash code value for this attribute set */ public int hashCode(); }