6921664: The number of copies and the job name are not passed to a 3rd party PrintService
authorpsadhukhan
Fri, 15 Apr 2016 11:45:11 +0530
changeset 37690 0e619f348ff7
parent 37689 c69dbc15e4bd
child 37691 8cd8bdd9280c
6921664: The number of copies and the job name are not passed to a 3rd party PrintService Reviewed-by: prr, jdv
jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
jdk/test/java/awt/print/PrinterJob/DummyPrintTest.java
--- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Thu Apr 14 12:36:14 2016 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java	Fri Apr 15 11:45:11 2016 +0530
@@ -1388,6 +1388,8 @@
         Doc doc = new PageableDoc(getPageable());
         if (attributes == null) {
             attributes = new HashPrintRequestAttributeSet();
+            attributes.add(new Copies(getCopies()));
+            attributes.add(new JobName(getJobName(), null));
         }
         try {
             job.print(doc, attributes);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/DummyPrintTest.java	Fri Apr 15 11:45:11 2016 +0530
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 2016, 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.
+ *
+ * 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.
+ */
+/*
+ * @test
+ * @bug      6921664
+ * @summary  Verifies number of copies and the job name are passed to a
+ *           3rd party PrintService.
+ * @run      main DummyPrintTest
+ */
+import java.awt.Graphics;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import java.util.HashSet;
+import java.util.Set;
+import javax.print.Doc;
+import javax.print.DocFlavor;
+import javax.print.DocPrintJob;
+import javax.print.PrintException;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.ServiceUIFactory;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.AttributeSet;
+import javax.print.attribute.HashPrintJobAttributeSet;
+import javax.print.attribute.HashPrintServiceAttributeSet;
+import javax.print.attribute.PrintJobAttributeSet;
+import javax.print.attribute.PrintRequestAttributeSet;
+import javax.print.attribute.PrintServiceAttribute;
+import javax.print.attribute.PrintServiceAttributeSet;
+import javax.print.attribute.standard.Copies;
+import javax.print.attribute.standard.JobName;
+import javax.print.attribute.standard.PrinterName;
+import javax.print.attribute.standard.PrinterState;
+import javax.print.event.PrintJobAttributeListener;
+import javax.print.event.PrintJobListener;
+import javax.print.event.PrintServiceAttributeListener;
+
+
+public class DummyPrintTest {
+
+    public static void main(String[] args) throws Exception {
+        // register custom print service implementation
+        String printerName = "myDummyPrintService";
+        PrintServiceLookup.registerService(new DummyPrintService(printerName));
+        // calling third party print logic
+        thirdPartyPrintLogic(printerName);
+    }
+
+    static void thirdPartyPrintLogic(String printerName) throws Exception {
+        PrinterJob printerjob = PrinterJob.getPrinterJob();
+        printerjob.setCopies(2);
+        printerjob.setJobName("myJobName");
+        printerjob.setPrintable(new DummyPrintable());
+        for (PrintService printService : PrinterJob.lookupPrintServices()) {
+            System.out.println("check printer name of service " + printService);
+            if (printerName.equals(printService.getName())) {
+                System.out.println("correct printer service do print...");
+                printerjob.setPrintService(printService);
+                printerjob.print();
+                break;
+            }
+        }
+    }
+}
+
+class DummyPrintService implements PrintService {
+    private final String _name;
+    private final Set<DocFlavor> _supportedFlavors;
+    private final PrintServiceAttributeSet _printServiceAttributeSet;
+
+    public DummyPrintService(String name) {
+        _name = name;
+        _supportedFlavors = new HashSet<DocFlavor>();
+        _supportedFlavors.add(DocFlavor.SERVICE_FORMATTED.PAGEABLE);
+        _supportedFlavors.add(DocFlavor.SERVICE_FORMATTED.PRINTABLE);
+        _printServiceAttributeSet = new HashPrintServiceAttributeSet();
+        _printServiceAttributeSet.add(new PrinterName(name, null));
+        _printServiceAttributeSet.add(PrinterState.IDLE);
+    }
+
+    @Override
+    public String toString() {
+        return "Dummy Printer : " + getName();
+    }
+
+    @Override
+    public String getName() {
+        return _name;
+    }
+
+    @Override
+    public DocPrintJob createPrintJob() {
+        return new DummyDocPrintJob(this);
+    }
+
+    @Override
+    public boolean isDocFlavorSupported(DocFlavor flavor) {
+        return _supportedFlavors.contains(flavor);
+    }
+
+    @Override
+    public <T extends PrintServiceAttribute> T getAttribute(Class<T> category) {
+        return category.cast(_printServiceAttributeSet.get(category));
+    }
+
+    @Override
+    public PrintServiceAttributeSet getAttributes() {
+        return _printServiceAttributeSet;
+    }
+
+    @Override
+    public DocFlavor[] getSupportedDocFlavors() {
+        return _supportedFlavors.toArray(new DocFlavor[_supportedFlavors.size()]);
+    }
+
+    @Override
+    public Object getDefaultAttributeValue(Class<? extends Attribute> category) {
+        return null;
+    }
+
+    @Override
+    public ServiceUIFactory getServiceUIFactory() {
+        return null;
+    }
+
+    @Override
+    public Class<?>[] getSupportedAttributeCategories() {
+        return null;
+    }
+
+    @Override
+    public Object getSupportedAttributeValues(Class<? extends Attribute> category,
+                                    DocFlavor flavor, AttributeSet attributes) {
+        return null;
+    }
+
+    @Override
+    public AttributeSet getUnsupportedAttributes(DocFlavor flavor,
+                                                 AttributeSet attributes) {
+        return null;
+    }
+
+    @Override
+    public boolean isAttributeCategorySupported(Class<? extends Attribute> category) {
+        return false;
+    }
+
+    @Override
+    public boolean isAttributeValueSupported(Attribute attrval,
+                                             DocFlavor flavor,
+                                             AttributeSet attributes) {
+        return false;
+    }
+
+    @Override
+    public void addPrintServiceAttributeListener(PrintServiceAttributeListener listener) {
+    }
+
+    @Override
+    public void removePrintServiceAttributeListener(PrintServiceAttributeListener listener) {
+    }
+}
+
+class DummyDocPrintJob implements DocPrintJob {
+    private static int _counter;
+    private final PrintService _printService;
+    private final PrintJobAttributeSet _printJobAttributeSet;
+
+    public DummyDocPrintJob(PrintService printService) {
+        _counter++;
+        _printService = printService;
+        _printJobAttributeSet = new HashPrintJobAttributeSet();
+    }
+
+    @Override
+    public PrintService getPrintService() {
+        return _printService;
+    }
+
+    @Override
+    public PrintJobAttributeSet getAttributes() {
+        return _printJobAttributeSet;
+    }
+
+    @Override
+    public void addPrintJobAttributeListener(PrintJobAttributeListener listener,
+                                    PrintJobAttributeSet printJobAttributeSet) {
+    }
+
+    @Override
+    public void removePrintJobAttributeListener(PrintJobAttributeListener listener) {
+    }
+
+    @Override
+    public void addPrintJobListener(PrintJobListener listener) {
+    }
+
+    @Override
+    public void removePrintJobListener(PrintJobListener listener) {
+    }
+
+    @Override
+    public void print(Doc doc,
+                      PrintRequestAttributeSet printRequestAttributeSet)
+          throws PrintException {
+        System.out.println("job name: " + printRequestAttributeSet.get(JobName.class));
+        System.out.println("copies: " + printRequestAttributeSet.get(Copies.class));
+        if(printRequestAttributeSet.get(JobName.class) == null ||
+            printRequestAttributeSet.get(Copies.class) == null) {
+            throw new RuntimeException("Copies and JobName is not passed correctly");
+        }
+    }
+}
+
+class DummyPrintable implements Printable {
+    @Override
+    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
+            throws PrinterException {
+        if (pageIndex == 0) {
+            return Printable.PAGE_EXISTS;
+        } else {
+            return Printable.NO_SUCH_PAGE;
+        }
+    }
+}