/*
 * 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.standard;

import javax.print.attribute.Attribute;
import javax.print.attribute.EnumSyntax;
import javax.print.attribute.PrintJobAttribute;

/**
 * JobState is a printing attribute class, an enumeration, that identifies
 * the current state of a print job. Class JobState defines standard job state
 * values. A  Print Service implementation only needs to report those job
 * states which are appropriate for the particular implementation; it does not
 * have to report every defined job state. The {@link JobStateReasons
 * JobStateReasons} attribute augments the JobState attribute to give more
 * detailed information about the job in the given job state.
 * <P>
 * <B>IPP Compatibility:</B> The category name returned by
 * <CODE>getName()</CODE> is the IPP attribute name.  The enumeration's
 * integer value is the IPP enum value.  The <code>toString()</code> method
 * returns the IPP string representation of the attribute value.
 * <P>
 *
 * @author  Alan Kaminsky
 */

public class JobState extends EnumSyntax implements PrintJobAttribute {

    private static final long serialVersionUID = 400465010094018920L;

    /**
     * The job state is unknown.
     */
    public static final JobState UNKNOWN = new JobState(0);

    /**
     * The job is a candidate to start processing, but is not yet processing.
     */
    public static final JobState PENDING = new JobState(3);

    /**
     * The job is not a candidate for processing for any number of reasons but
     * will return to the PENDING state as soon as the reasons are no longer
     * present. The job's {@link JobStateReasons JobStateReasons} attribute must
     * indicate why the job is no longer a candidate for processing.
     */
    public static final JobState PENDING_HELD = new JobState(4);

    /**
     * The job is processing. One or more of the following activities is
     * occurring:
     * <OL TYPE=1>
     * <LI>
     * The job is using, or is attempting to use, one or more purely software
     * processes that are analyzing, creating, or interpreting a PDL, etc.
     * <P>
     * <LI>
     * The job is using, or is attempting to use, one or more hardware
     * devices that are interpreting a PDL, making marks on a medium, and/or
     * performing finishing, such as stapling, etc.
     * <P>
     * <LI>
     * The printer has made the job ready for printing, but the output
     * device is not yet printing it, either because the job hasn't reached the
     * output device or because the job is queued in the output device or some
     * other spooler, awaiting the output device to print it.
     * </OL>
     * <P>
     * When the job is in the PROCESSING state, the entire job state includes
     * the detailed status represented in the printer's {@link PrinterState
     * PrinterState} and {@link PrinterStateReasons PrinterStateReasons}
     * attributes.
     * <P>
     * Implementations may, though they need not, include additional values in
     * the job's {@link JobStateReasons JobStateReasons} attribute to indicate
     * the progress of the job, such as adding the JOB_PRINTING value to
     * indicate when the output device is actually making marks on paper and/or
     * the PROCESSING_TO_STOP_POINT value to indicate that the printer is in the
     * process of canceling or aborting the job.
     */
    public static final JobState PROCESSING = new JobState (5);

    /**
     * The job has stopped while processing for any number of reasons and will
     * return to the PROCESSING state as soon as the reasons are no longer
     * present.
     * <P>
     * The job's {@link JobStateReasons JobStateReasons} attribute may indicate
     * why the job has stopped processing. For example, if the output device is
     * stopped, the PRINTER_STOPPED value may be included in the job's {@link
     * JobStateReasons JobStateReasons} attribute.
     * <P>
     * <I>Note:</I> When an output device is stopped, the device usually
     * indicates its condition in human readable form locally at the device. A
     * client can obtain more complete device status remotely by querying the
     * printer's {@link PrinterState PrinterState} and {@link
     * PrinterStateReasons PrinterStateReasons} attributes.
     */
    public static final JobState PROCESSING_STOPPED = new JobState (6);

    /**
     * The job has been canceled by some human agency, the printer has completed
     * canceling the job, and all job status attributes have reached their final
     * values for the job. While the printer is canceling the job, the job
     * remains in its current state, but the job's {@link JobStateReasons
     * JobStateReasons} attribute should contain the PROCESSING_TO_STOP_POINT
     * value and one of the CANCELED_BY_USER, CANCELED_BY_OPERATOR, or
     * CANCELED_AT_DEVICE values. When the job moves to the CANCELED state, the
     * PROCESSING_TO_STOP_POINT value, if present, must be removed, but the
     * CANCELED_BY_<I>xxx</I> value, if present, must remain.
     */
    public static final JobState CANCELED = new JobState (7);

    /**
     * The job has been aborted by the system (usually while the job was in the
     * PROCESSING or PROCESSING_STOPPED state), the printer has completed
     * aborting the job, and all job status attributes have reached their final
     * values for the job. While the printer is aborting the job, the job
     * remains in its current state, but the job's {@link JobStateReasons
     * JobStateReasons} attribute should contain the PROCESSING_TO_STOP_POINT
     * and ABORTED_BY_SYSTEM values. When the job moves to the ABORTED state,
     * the PROCESSING_TO_STOP_POINT value, if present, must be removed, but the
     * ABORTED_BY_SYSTEM value, if present, must remain.
     */
    public static final JobState ABORTED = new JobState (8);

    /**
     * The job has completed successfully or with warnings or errors after
     * processing, all of the job media sheets have been successfully stacked in
     * the appropriate output bin(s), and all job status attributes have reached
     * their final values for the job. The job's {@link JobStateReasons
     * JobStateReasons} attribute should contain one of these values:
     * COMPLETED_SUCCESSFULLY, COMPLETED_WITH_WARNINGS, or
     * COMPLETED_WITH_ERRORS.
     */
    public static final JobState COMPLETED = new JobState (9);

    // Hidden constructors.

    /**
     * Construct a new job state enumeration value with the given integer value.
     *
     * @param  value  Integer value.
     */
    protected JobState(int value) {
        super (value);
    }

    private static final String[] myStringTable =
    {"unknown",
     null,
     null,
     "pending",
     "pending-held",
     "processing",
     "processing-stopped",
     "canceled",
     "aborted",
     "completed"};

    private static final JobState[] myEnumValueTable =
    {UNKNOWN,
     null,
     null,
     PENDING,
     PENDING_HELD,
     PROCESSING,
     PROCESSING_STOPPED,
     CANCELED,
     ABORTED,
     COMPLETED};

    /**
     * Returns the string table for class JobState.
     */
    protected String[] getStringTable() {
        return myStringTable;
    }

    /**
     * Returns the enumeration value table for class JobState.
     */
    protected EnumSyntax[] getEnumValueTable() {
        return myEnumValueTable;
    }

    /**
     * Get the printing attribute class which is to be used as the "category"
     * for this printing attribute value.
     * <P>
     * For class JobState and any vendor-defined subclasses, the category is
     * class JobState itself.
     *
     * @return  Printing attribute class (category), an instance of class
     *          {@link java.lang.Class java.lang.Class}.
     */
    public final Class<? extends Attribute> getCategory() {
        return JobState.class;
    }

    /**
     * Get the name of the category of which this attribute value is an
     * instance.
     * <P>
     * For class JobState and any vendor-defined subclasses, the category
     * name is <CODE>"job-state"</CODE>.
     *
     * @return  Attribute category name.
     */
    public final String getName() {
        return "job-state";
    }

}
