| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> | |
| <html> | |
| <head> | |
| <title>javax.print.attribute package</title> | |
| <!-- | |
| Copyright (c) 2000, 2013, 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. | |
| --> | |
| </head> | |
| <body bgcolor="white"> | |
| Provides classes and interfaces | |
| that describe the types of Java<sup><font size="-2">TM</font></sup> Print | |
| Service attributes and how they can be collected into attribute sets. | |
| <H3>What is an Attribute?</H3> | |
| When setting up a print job, | |
| a client specifies two things: | |
| <B>print data</B> and <B>processing instructions.</B> | |
| The print data is the actual content to be printed. | |
| The processing instructions tell the printer how to print the print data, | |
| such as: what media to use, how many copies to print, and | |
| whether to print on one or both sides of a sheet. The client specifies | |
| these processing instructions with the attribute definitions of the Java | |
| Print Service API. | |
| <P> | |
| The print data and the processing instructions | |
| are separate entities. This means that: | |
| <ul> | |
| <li>You can print the same print data | |
| at different times using different processing instructions. | |
| <br> | |
| For example, you can print a slide presentation | |
| on US letter-sized white paper, | |
| double-sided, stapled, 20 copies | |
| to make handouts for a talk; | |
| and you could print the same slide presentation | |
| on US letter-sized transparencies, | |
| single-sided, one copy | |
| to make the actual slides for the talk. | |
| <li>You can use the same processing instructions | |
| at different times to print different data. | |
| For example, you could set your default processing | |
| instructions to: US letter-sized paper, double sided, stapled. | |
| Whenever you print a job, it prints with these settings, | |
| unless you explicitly override them. | |
| </ul> | |
| <P> | |
| The processing instruction does not specify how the print job | |
| processes the request; each processing instruction is only a description | |
| of the results of a print job. The print job determines the manner in | |
| which it achieves the results specified by the processing instructions. | |
| Representing processing instructions as descriptive items | |
| provides more flexibility for implementing print jobs. | |
| <h4>Attribute Categories and Values</h4> | |
| Each printer has a set of capabilities, such as the ability to print on | |
| different paper sizes or the ability to print more than one copy. Each of | |
| the capabilities has a range of values. For example, a printer's orientation | |
| capability might have this range of values: [landscape, portrait]. | |
| For each print request, the capability is set to one of these values. The | |
| Java Print Service API uses the term <b>attribute category</b> to refer to | |
| a printer capability and the term <b>attribute value</b> to refer to the value | |
| of the capability. | |
| <p> | |
| In the Java Print Service API, an attribute category is represented by a Java | |
| class implementing the <a href="Attribute.html">Attribute</a> interface. | |
| Attribute values are instances of such a class or | |
| one of its subclasses. For example, to specify the number of copies, an | |
| application constructs an instance of the | |
| <a href="standard/Copies.html">Copies</a> class with the | |
| number of desired copies and uses the <code>Copies</code> instance as part of | |
| the print request. In this case, the <code>Copies</code> class represents the | |
| attribute category, and the <code>Copies</code> instance represents the | |
| attribute value. | |
| <h4><a name="role"></a>Attribute Roles</h4> | |
| When submitting a print job to a printer, the client provides the | |
| attributes describing the characteristics of the print data, such as | |
| the document name, and how the print data should be printed, such as | |
| double-sided, five copies. If a print job consists of multiple | |
| pieces of print data, different pieces might have different processing | |
| instructions, such as 8 x 11 inch media for the first document, and | |
| 11 x 17 inch media for another document. | |
| <p> | |
| Once the printer starts processing the print job, | |
| additional information about the job becomes available, which might include: | |
| the job state (such as <i>completed</i> or <i>queued</i>) and | |
| the number of pages printed so far. These pieces of information are also | |
| attributes. Attributes can also describe the printer itself, such as: | |
| the printer name, the printer location, and the number of jobs queued. | |
| <p> | |
| The Java Print Service API defines these different kinds of attributes | |
| with five subinterfaces of <code>Attribute</code>: | |
| <ul> | |
| <li><A HREF="DocAttribute.html">DocAttribute</A> specifies a characteristic | |
| of an individual document and the print job settings to be applied to an | |
| individual document. | |
| <li><A HREF="PrintRequestAttribute.html">PrintRequestAttribute</A> specifies | |
| a setting applied to a whole print job and to all the documents in | |
| the print job. | |
| <li><A HREF="PrintJobAttribute.html">PrintJobAttribute</A> reports the status | |
| of a print job. | |
| <li><A HREF="PrintServiceAttribute.html">PrintServiceAttribute</A> reports the | |
| status of a print service. | |
| <li><A HREF="SupportedValuesAttribute.html">SupportedValuesAttribute</A> gives | |
| the supported values for another attribute. | |
| </ul> | |
| Each attribute class | |
| implements one or more of these tagging subinterfaces | |
| to indicate where the attribute can be used in the API. | |
| If an attribute class implements multiple tagging subinterfaces, | |
| the attribute can be used in multiple contexts. For example, the media | |
| attribute can apply to one document in a print job as a <code>DocAttribute</code> | |
| or to an entire print job as a <code>PrintRequestAttribute</code>. | |
| Certain low-level attributes | |
| are never used on their own | |
| but are always aggregated into higher-level attributes. | |
| These low-level attribute classes only | |
| implement interface <A HREF="Attribute.html">Attribute</A>, | |
| not any of the tagging subinterfaces. | |
| <P> | |
| The Java Print Service API defines a group of | |
| standard attribute classes modeled upon the attributes in | |
| the Internet Printing Protocol (IPP) version 1.1. The | |
| standard attribute classes are in the subpackage | |
| javax.print.attribute.standard to keep the actual | |
| attribute classes conceptually separate from the generic | |
| apparatus defined in package javax.print.attribute. | |
| <H3>Attribute Sets</H3> | |
| A client usually needs to provide more than one processing | |
| instruction when submitting a print job. For example, the client might need to | |
| specify a media size of A4 and a landscape orientation. To send more than one | |
| processing instruction, the client collects the attributes into an | |
| attribute set, which the Java Print Service API represents with the | |
| <a href="AttributeSet.html">AttributeSet</a> | |
| interface. | |
| <p> | |
| The <code>AttributeSet</code> interface is similar to the | |
| <a href="../../../java/util/Map.html">Map</a> interface: it provides a map of | |
| key to values, in which each key is unique and can contain no more than one | |
| value. However, the <code>AttributeSet</code> interface is designed to | |
| specifically support the needs of the Java Print Service API. An | |
| <code>AttributeSet</code> requires that: | |
| <OL TYPE=1> | |
| <LI>Each key in an <code>AttributeSet</code> corresponds to a category, and | |
| the value of the key can only be one of the attribute values that belong | |
| to the category represented by the key. Thus, unlike a <code>Map</code>, an | |
| <code>AttributeSet</code> restricts the possible values of a key: an | |
| attribute category cannot be set to an attribute value that does not belong to | |
| that category. | |
| <LI>No two attributes from the same category can exist in the same set. | |
| For example, an attribute collection | |
| must not contain both a "one-sided" attribute and a "two-sided" attribute | |
| because these two attributes give the printer conflicting instructions. | |
| <LI>Only attributes implementing the <code>Attribute</code> interface can | |
| be added to the set. | |
| </OL> | |
| <P> | |
| The javax.print.attribute package includes | |
| <A HREF="HashAttributeSet.html">HashAttributeSet</A> | |
| as a concrete implementation of the attribute set interface. | |
| <code>HashAttributeSet</code> provides an attribute set based on a hash map. | |
| You can use this implementation or provide your own implementation | |
| of interface <code>AttributeSet</code>. | |
| <p> | |
| The Java Print Service API provides four specializations of an attribute set | |
| that are restricted to contain just one of the four kinds of attributes, | |
| as discussed in the <a href="#role">Attribute Roles</a> section: | |
| <ul> | |
| <li><A HREF="DocAttributeSet.html">DocAttributeSet</A> | |
| <li><A HREF="PrintRequestAttributeSet.html">PrintRequestAttributeSet</A> | |
| <li><A HREF="PrintJobAttributeSet.html">PrintJobAttributeSet</A> | |
| <li><A HREF="PrintServiceAttributeSet.html">PrintServiceAttributeSet</A> | |
| </ul> | |
| Notice that only four kinds of attribute sets are listed here, but there are | |
| five kinds of attributes. Interface | |
| <A HREF="SupportedValuesAttribute.html">SupportedValuesAttribute</A> | |
| denotes an attribute that gives the supported values for another attribute. | |
| Supported-values attributes are never aggregated into attribute sets, | |
| so there is no attribute set subinterface defined for them. | |
| <P> | |
| In some contexts, an attribute set is read-only, which means that the | |
| client is only allowed to examine an attribute set's | |
| contents but not change them. In other contexts, the attribute set is read-write, | |
| which means that the client is allowed both to examine and to change an | |
| attribute set's contents. For a read-only attribute set, calling a mutating | |
| operation throws an <code>UnmodifiableSetException</code>. | |
| <P> | |
| Package javax.print.attribute includes | |
| one concrete implementation of each of the attribute set subinterfaces: | |
| <ul> | |
| <li><A HREF="HashDocAttributeSet.html">HashDocAttributeSet</A> | |
| <li><A HREF="HashPrintRequestAttributeSet.html">HashPrintRequestAttributeSet</A>, | |
| <li><A HREF="HashPrintJobAttributeSet.html">HashPrintJobAttributeSet</A>, | |
| <li><A HREF="HashPrintServiceAttributeSet.html">HashPrintServiceAttributeSet</A>. | |
| </ul> | |
| All of these classes extend <A HREF="HashAttributeSet.html">HashAttributeSet</A> | |
| and enforce the restriction that the attribute set is only allowed to contain | |
| the corresponding kind of attribute. | |
| <H3>Attribute Class Design</H3> | |
| An attribute value is a small, atomic data item, | |
| such as an integer or an enumerated value. The Java Print Service API | |
| does not use primitive data types, such as int, to represent attribute | |
| values for these reasons: | |
| <ul> | |
| <li>Primitive data types are not type-safe. For example, a compiler | |
| should not allow a "copies" attribute value to | |
| be used for a "sides" attribute. | |
| <li>Some attributes must be represented as a record of several | |
| values. One example is printer resolution, which requires two | |
| numbers, such as 600 and 300 representing 600 x 300 dpi. | |
| </ul> | |
| For type-safety and to represent all attributes uniformly, the Java | |
| Print Service API defines each attribute category as a class, such as | |
| class <code>Copies</code>, class <a href="standard/Sides.html">Sides</a>, and class | |
| <a href="standard/PrinterResolution.html">PrinterResolution</a>. Each | |
| attribute class wraps one or more primitive data items containing the | |
| attribute's value. Attribute set operations perform frequent | |
| comparisons between attribute category objects when adding attributes, | |
| finding existing attributes in the same category, and looking | |
| up an attribute given its category. Because an attribute category is | |
| represented by a class, fast attribute-value comparisons can be performed | |
| with the <code>Class.equals</code> method. | |
| <p> | |
| Even though the Java Print Service API includes a large number of | |
| different attribute categories, there are only a few different types | |
| of attribute values. Most attributes can be represented by a small | |
| number of data types, such as: integer values, integer ranges, text, | |
| or an enumeration of integer values. The type of the attribute value that | |
| a category accepts is called the attribute's abstract syntax. To | |
| provide consistency and reduce code duplication, the Java Print Service | |
| API defines abstract syntax classes to represent each | |
| abstract syntax, and these classes are used as the parent of standard | |
| attributes whenever possible. The abstract syntax classes are: | |
| <ul> | |
| <li><a href="EnumSyntax.html">EnumSyntax</a> | |
| provides a type-safe enumeration in which enumerated | |
| values are represented as singleton objects. Each enumeration | |
| singleton is an instance of the enumeration class that wraps a hidden | |
| int value. | |
| <li><a href="IntegerSyntax.html">IntegerSyntax</a> | |
| is the abstract syntax for integer-valued attributes. | |
| <li><a href="TextSyntax.html">TextSyntax</a> is | |
| the abstract syntax for text-valued attributes, and | |
| includes a locale giving the text string's natural language. | |
| <li><a href="SetOfIntegerSyntax.html">SetOfIntegerSyntax</a> | |
| is the abstract syntax for attributes | |
| representing a range or set of integers | |
| <li><a href="ResolutionSyntax.html">ResolutionSyntax</a> | |
| is the abstract syntax for attributes representing | |
| resolution values, such as 600x300 dpi. | |
| <li><a href="Size2DSyntax.html">Size2DSyntax</a> | |
| is the abstract syntax for attributes representing a | |
| two-dimensional size, such as a paper size of 8.5 x 11 inches. | |
| <li><a href="DateTimeSyntax.html">DateTimeSyntax</a> | |
| is the abstract syntax for attributes whose value is a date and time. | |
| <li><a href="URISyntax.html">URISyntax</a> is the | |
| abstract syntax for attributes whose value is a Uniform Resource | |
| Indicator. | |
| </ul> | |
| The abstract syntax classes are independent of the attributes that | |
| use them. In fact, applications that have nothing to do with | |
| printing can use the abstract syntax classes. Although most of the | |
| standard attribute classes extend one of the abstract syntax classes, | |
| no attribute class is required to extend one of these classes. The | |
| abstract syntax classes merely provide a convenient implementation that | |
| can be shared by many attribute classes. | |
| <p> | |
| Each attribute class implements the <code>Attribute</code> interface, either | |
| directly or indirectly, to mark it as a printing attribute. An | |
| attribute class that can appear in restricted attribute sets in | |
| certain contexts also implements one or more subinterfaces of | |
| <code>Attribute</code>. Most attribute classes also extend the appropriate | |
| abstract syntax class to get the implementation. Consider the | |
| <code>Sides</code> attribute class: | |
| <blockquote> | |
| <pre> | |
| public class Sides | |
| extends EnumSyntax | |
| implements DocAttribute, PrintRequestAttribute, PrintJobAttribute | |
| { | |
| public final Object getCategory() | |
| { | |
| return Sides.class; | |
| } | |
| ... | |
| } | |
| </pre> | |
| </blockquote> | |
| <p> | |
| Since every attribute class implements <code>Attribute</code>, every attribute | |
| class must provide an implementation for the | |
| {@link javax.print.attribute.Attribute#getCategory() getCategory} method, | |
| which returns the attribute category. In the case of <code>Sides</code>, the | |
| <code>getCategory</code> method returns <code>Sides.class</code>. The | |
| <code>getCategory</code> method is final to ensure that any vendor-defined | |
| subclasses of a standard attribute class appear in the same category. | |
| Every attribute object is immutable once constructed so that attribute object | |
| references can be passed around freely. To get a different attribute | |
| value, construct a different attribute object. | |
| <h3>Attribute Vendors</h3> | |
| The Java Print Service API is designed so that vendors can: | |
| <ul> | |
| <li>define new vendor-specific values for any standard attribute | |
| defined in <a href="standard/package-summary.html"> | |
| javax.print.attribute.standard</a>. | |
| <li>define new attribute categories representing the vendor printer's | |
| proprietary capabilities not already supported by the standard | |
| attributes. | |
| </ul> | |
| To define a new value for an attribute, a client can construct | |
| instances of such attributes with arbitrary values at runtime. | |
| However, an enumerated attribute using an abstract syntax class | |
| of <code>EnumSyntax</code> specifies all the possible attribute values | |
| at compile time as singleton instances of the attribute class. This | |
| means that new enumerated values cannot be constructed at run time. | |
| To define new vendor-specific values for a standard enumerated | |
| attribute, the vendor must define a new attribute class specifying | |
| the new singleton instances. To ensure that the new attribute values | |
| fall in the same category as the standard attribute values, the new | |
| attribute class must be a subclass of the standard attribute class. | |
| <p> | |
| To define a new attribute category, a vendor defines a new attribute | |
| class. This attribute class, like the standard attribute classes, | |
| implements <code>Attribute</code> or one of its subinterfaces and extends an | |
| abstract syntax class. The vendor can either use an existing | |
| abstract syntax class or define a new one. The new vendor-defined | |
| attribute can be used wherever an <code>Attribute</code> is used, such as in an | |
| <code>AttributeSet</code>. | |
| <h3>Using Attributes</h3> | |
| A typical printing application uses the <code>PrintRequestAttributeSet</code> | |
| because print-request attributes are the types of attributes that | |
| client usually specifies. This example demonstrates creating an attribute | |
| set of print-request attributes and locating a printer that can | |
| print the document according to the specified attributes: | |
| <blockquote> | |
| <pre> | |
| FileInputStream psStream; | |
| try { | |
| psstream = new FileInputStream("file.ps"); | |
| } catch (FileNotFoundException ffne) { | |
| } | |
| if (psstream == null) { | |
| return; | |
| } | |
| //Set the document type. See the DocFlavor documentation for | |
| //more information. | |
| DocFlavor psInFormat = DocFlavor.INPUT_STREAM.POSTSCRIPT; | |
| Doc myDoc = new SimpleDoc(pstream, psInFormat, null); | |
| PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); | |
| aset.add(new Copies(5)); | |
| aset.add(MediaSize.A4); | |
| aset.add(Sides.DUPLEX); | |
| PrintService[] services = | |
| PrintServiceLookup.lookupPrintServices(psInFormat, aset); | |
| if (services.length > 0) { | |
| DocPrintJob job = services[0].createPrintJob(); | |
| try { | |
| job.print(myDoc, aset); | |
| } catch (PrintException pe) {} | |
| } | |
| </pre> | |
| </blockquote> | |
| <P> | |
| Please note: In the javax.print APIs, 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. | |
| <P> | |
| @since 1.4 | |
| </body> | |
| </html> |