<html>
<head>
<title>javax.print.attribute package</title>
<!--
Copyright (c) 2000, 2003, 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
CA 95054 USA or visit www.sun.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.
<P>
<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.
<P>
<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.
<P>
<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:
<pre>
<blockquote>
public class Sides
  extends EnumSyntax
  implements DocAttribute, PrintRequestAttribute, PrintJobAttribute
  {
  public final Object getCategory()
    {
    return Sides.class;
    }
  ...
  }
</blockquote>  
</pre>
<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:
<p>
<pre>
<blockquote>

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) {}
}
</blockquote>
</pre>
<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>
