org.springframework.integration.print.outbound.PrintMessageHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.springframework.integration.print.outbound.PrintMessageHandler.java

Source

/*
 * Copyright 2002-2012 the original author or authors
 *
 *     Licensed under the Apache License, Version 2.0 (the "License");
 *     you may not use this file except in compliance with the License.
 *     You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *     Unless required by applicable law or agreed to in writing, software
 *     distributed under the License is distributed on an "AS IS" BASIS,
 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *     See the License for the specific language governing permissions and
 *     limitations under the License.
 */

package org.springframework.integration.print.outbound;

import java.io.InputStream;
import java.util.Locale;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Chromaticity;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.MediaTray;
import javax.print.attribute.standard.Sides;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.integration.Message;
import org.springframework.integration.handler.AbstractMessageHandler;
import org.springframework.integration.print.core.PrintServiceExecutor;
import org.springframework.integration.print.support.PrintJobMonitor;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

/**
 * Outbound Adapter that supports printing of payloads.
 *
 * @author Gunnar Hillert
 * @since 1.0
 */
public class PrintMessageHandler extends AbstractMessageHandler {

    private static final Log LOG = LogFactory.getLog(PrintMessageHandler.class);

    private final PrintServiceExecutor printServiceExecutor;

    private volatile String printJobName;
    private volatile MediaSizeName mediaSizeName;
    private volatile Sides sides;
    private volatile Copies copies;
    private volatile MediaTray mediaTray;
    private volatile Chromaticity chromaticity;
    private final DocFlavor docFlavor;

    private volatile PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();

    public PrintMessageHandler(PrintServiceExecutor printServiceExecutor, DocFlavor docFlavor) {
        Assert.notNull(docFlavor, "'docFlavor' must not be null.");
        this.docFlavor = docFlavor;
        this.printServiceExecutor = printServiceExecutor;

    }

    public PrintMessageHandler(PrintServiceExecutor printServiceExecutor, String mimeType, String className) {

        Assert.hasText(className, "'className' must be neither null nor empty.");
        Assert.hasText(mimeType, "'mimeType' must be neither null nor empty.");

        this.docFlavor = new DocFlavor(mimeType, className);
        this.printServiceExecutor = printServiceExecutor;

    }

    public PrintMessageHandler(PrintServiceExecutor printServiceExecutor) {
        this.docFlavor = DocFlavor.STRING.TEXT_PLAIN;
        this.printServiceExecutor = printServiceExecutor;
    }

    @Override
    protected void handleMessageInternal(Message<?> message) throws Exception {

        if (LOG.isDebugEnabled()) {
            LOG.debug("Printing using printer '" + this.printServiceExecutor.getPrintService().getName() + "'.");
        }

        DocAttributeSet das = new HashDocAttributeSet();
        das.add(Chromaticity.MONOCHROME);

        Object payload = message.getPayload();

        final Doc doc = new SimpleDoc(message.getPayload(), docFlavor, das);

        final DocPrintJob job = this.printServiceExecutor.getPrintService().createPrintJob();

        PrintJobMonitor printJobMonitor = new PrintJobMonitor(job);

        job.print(doc, this.printRequestAttributeSet);

        printJobMonitor.waitForDone();

        if (payload instanceof InputStream) {
            ((InputStream) payload).close();
        }

    }

    @Override
    protected void onInit() throws Exception {

        if (this.copies != null) {
            //Assert.isTrue(printService.isAttributeValueSupported(this.copies, this.docFlavor, this.printService.getAttributes()),
            //   "Attribute '" + this.copies.getName() + "' with value '" + this.copies.getValue() + "' is not supported.");
            this.printRequestAttributeSet.add(this.copies);
        }

        if (this.chromaticity != null) {
            Assert.isTrue(
                    this.printServiceExecutor.getPrintService().isAttributeValueSupported(this.chromaticity,
                            this.docFlavor, this.printServiceExecutor.getPrintService().getAttributes()),
                    "Attribute '" + this.chromaticity.getName() + "' with value '" + this.chromaticity.getValue()
                            + "' is not supported.");
            this.printRequestAttributeSet.add(this.chromaticity);
        }

        if (this.mediaSizeName != null) {
            Assert.isTrue(
                    this.printServiceExecutor.getPrintService().isAttributeValueSupported(this.mediaSizeName, null,
                            null),
                    "Attribute '" + this.mediaSizeName.getName() + "' with value '" + this.mediaSizeName.getValue()
                            + "' is not supported.");
            this.printRequestAttributeSet.add(this.mediaSizeName);
        }

        if (this.mediaTray != null) {
            Assert.isTrue(
                    this.printServiceExecutor.getPrintService().isAttributeValueSupported(this.mediaTray,
                            this.docFlavor, this.printServiceExecutor.getPrintService().getAttributes()),
                    "Attribute value '" + this.mediaTray + "' is not supported.");
            this.printRequestAttributeSet.add(this.mediaTray);
        }

        if (this.sides != null) {
            Assert.isTrue(
                    this.printServiceExecutor.getPrintService().isAttributeValueSupported(this.sides,
                            this.docFlavor, this.printServiceExecutor.getPrintService().getAttributes()),
                    "Attribute value '" + this.sides + "' is not supported.");
            this.printRequestAttributeSet.add(this.sides);
        }

        if (StringUtils.hasText(this.printJobName)) {
            this.printRequestAttributeSet.add(new JobName(this.printJobName, Locale.getDefault()));
        }

        super.onInit();

    }

    /**
     * Specifies how the pages are are printed to the selected medium,
     * e.g. duplex or one-sided. Under the covers, this property will add the
     * provided {@link Sides} instance to the respective {@link PrintRequestAttributeSet}.
     *
     * This property is not used, if not specified (No explicit default value).
     *
     * @param sides Must not be null
     */
    public void setSides(Sides sides) {
        Assert.notNull(sides, "'sides' must not be null.");
        this.sides = sides;
    }

    /**
     * Let's you specify an integer value that indicates how many time each
     * print page shall be printed. Under the covers, this property will add a
     *
     * {@link Copies} instance to the respective {@link PrintRequestAttributeSet}.
     * This property is not used, if not specified (No explicit default value).
     *
     * @param numberOfCopies Must be greater than 0
     */
    public void setCopies(int numberOfCopies) {
        Assert.isTrue(numberOfCopies > 0, "'copies' must be greater than 0.");
        this.copies = new Copies(numberOfCopies);
    }

    /**
     * Specifies the media tray/bin for the print job. This property can be used
     * instead of providing the {@link #mediaSizeName} property. Under the covers,
     * this property will add the provided {@link MediaTray} instance to the
     * respective {@link PrintRequestAttributeSet}. This property is not used,
     * if not specified (No explicit default value).
     *
     * @param mediaTray Must not be null
     */
    public void setMediaTray(MediaTray mediaTray) {
        Assert.notNull(mediaTray, "'mediaTray' must not be null.");
        this.mediaTray = mediaTray;
    }

    /**
     *  Specifies whether you want to do monochrome or color printing. Under the
     *  covers, this property will add the provided {@link Chromaticity} instance
     *  to the respective {@link PrintRequestAttributeSet}. This property is not
     *  used, if not specified (No explicit default value).
     *
     *  @param chromaticity Must not be null.
     */
    public void setChromaticity(Chromaticity chromaticity) {
        Assert.notNull(chromaticity, "'chromaticity' must not be null.");
        this.chromaticity = chromaticity;
    }

    /**
     * Sets the {@link MediaSizeName}. Under the covers, this property will add
     * the provided {@link MediaSizeName} to the respective {@link PrintRequestAttributeSet}.
     * This property is not used, if not specified (No explicit default value).
     *
     * @param mediaSizeName Must not be null.
     */
    public void setMediaSizeName(MediaSizeName mediaSizeName) {
        Assert.notNull(mediaSizeName, "'mediaSizeName' must not be null.");
        this.mediaSizeName = mediaSizeName;
    }

    /**
     * Optional property that let's you specify the name of the print job as it
     * is added to the print queue. Under the covers, this property will create
     * a {@link JobName} instance and add it to the respective {@link PrintRequestAttributeSet}.
     * This property is not used, if not specified (No explicit default value).
     *
     * @param printJobName Must neither be null nor empty.
     */
    public void setPrintJobName(String printJobName) {
        Assert.hasText(printJobName, "'mediaSizeName' must neither be null nor empty.");
        this.printJobName = printJobName;
    }

}