6870661: Setting a custom PrintService on a PrinterJob leads to a PrinterException
Reviewed-by: prr, jgodinez
Contributed-by: patrick@reini.net
--- a/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java Thu Sep 26 16:30:38 2013 -0700
+++ b/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java Fri Sep 27 13:04:54 2013 -0700
@@ -96,7 +96,6 @@
import javax.print.attribute.standard.JobMediaSheetsSupported;
import javax.print.attribute.standard.PageRanges;
import javax.print.attribute.Size2DSyntax;
-import javax.print.StreamPrintService;
import sun.awt.Win32FontManager;
@@ -440,7 +439,7 @@
throw new HeadlessException();
}
- if (getPrintService() instanceof StreamPrintService) {
+ if (!(getPrintService() instanceof Win32PrintService)) {
return super.pageDialog(page);
}
@@ -586,7 +585,7 @@
attributes = new HashPrintRequestAttributeSet();
}
- if (getPrintService() instanceof StreamPrintService) {
+ if (!(getPrintService() instanceof Win32PrintService)) {
return super.printDialog(attributes);
}
@@ -611,7 +610,7 @@
public void setPrintService(PrintService service)
throws PrinterException {
super.setPrintService(service);
- if (service instanceof StreamPrintService) {
+ if (!(service instanceof Win32PrintService)) {
return;
}
driverDoesMultipleCopies = false;
@@ -648,7 +647,7 @@
}
myService = PrintServiceLookup.lookupDefaultPrintService();
- if (myService != null) {
+ if (myService instanceof Win32PrintService) {
try {
setNativePrintServiceIfNeeded(myService.getName());
} catch (Exception e) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintDialog.java Fri Sep 27 13:04:54 2013 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.print.PrinterJob;
+import javax.print.PrintServiceLookup;
+
+/**
+ * @test
+ * @bug 6870661
+ * @summary Verify that no native dialog is opened for a custom PrintService
+ * @run main/manual PrintDialog
+ * @author reinhapa
+ */
+public class PrintDialog {
+
+ private static final String instructions =
+ "This test shows a non native print dialog having a 'test' print service\n" +
+ "selected. No other options are selectable on the General tab. The other\n" +
+ "tabs are as follows:\n" +
+ "Page Setup: Media & Margins enabled, Orientation disabled\n" +
+ "Appearance: All parts disabled\n\n" +
+ "Test passes if the dialog is shown as described above.";
+
+ public static void main(String[] args) throws Exception {
+ // instruction dialog
+ Frame instruction = new Frame("Verify that no native print dialog is showed");
+ instruction.add(new TextArea(instructions));
+ instruction.pack();
+ instruction.show();
+ // test begin
+ PrintServiceStub service = new PrintServiceStub("test");
+ PrintServiceLookup.registerService(service);
+ PrinterJob job = PrinterJob.getPrinterJob();
+ job.setPrintService(service);
+ job.printDialog();
+ System.out.println("test passed");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintServiceStub.java Fri Sep 27 13:04:54 2013 -0700
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 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.
+ */
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.print.DocFlavor;
+import javax.print.DocPrintJob;
+import javax.print.PrintService;
+import javax.print.ServiceUIFactory;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.AttributeSet;
+import javax.print.attribute.HashPrintServiceAttributeSet;
+import javax.print.attribute.PrintServiceAttribute;
+import javax.print.attribute.PrintServiceAttributeSet;
+import javax.print.attribute.standard.Media;
+import javax.print.attribute.standard.MediaSizeName;
+import javax.print.attribute.standard.PrinterInfo;
+import javax.print.attribute.standard.PrinterIsAcceptingJobs;
+import javax.print.attribute.standard.PrinterMakeAndModel;
+import javax.print.attribute.standard.PrinterName;
+import javax.print.attribute.standard.PrinterState;
+import javax.print.event.PrintServiceAttributeListener;
+
+/**
+ * Stub implementation of a custom {@link PrintService}.
+ *
+ * @author reinhapa
+ */
+public class PrintServiceStub implements PrintService {
+ private final String _name;
+ private final Set<DocFlavor> _flavors;
+ private final Map<Class<?>, Object> _attributes;
+
+ public PrintServiceStub(String name) {
+ _name = name;
+ _flavors = new HashSet<DocFlavor>();
+ _flavors.add(DocFlavor.SERVICE_FORMATTED.PAGEABLE);
+ _flavors.add(DocFlavor.SERVICE_FORMATTED.PRINTABLE);
+ _attributes = new HashMap<>();
+ _attributes.put(PrinterName.class, new PrinterName(name, null));
+ _attributes.put(PrinterState.class, PrinterState.IDLE);
+ _attributes.put(PrinterInfo.class, new PrinterInfo("Custom location",
+ null));
+ _attributes.put(PrinterIsAcceptingJobs.class,
+ PrinterIsAcceptingJobs.ACCEPTING_JOBS);
+ _attributes.put(PrinterMakeAndModel.class, new PrinterMakeAndModel(
+ "Custom printer", null));
+ _attributes.put(Media.class, new Media[] { MediaSizeName.ISO_A4 });
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public boolean isDocFlavorSupported(DocFlavor flavor) {
+ return _flavors.contains(flavor);
+ }
+
+ @Override
+ public Object getSupportedAttributeValues(
+ Class<? extends Attribute> category, DocFlavor flavor,
+ AttributeSet attributes) {
+ return _attributes.get(category);
+ }
+
+ @Override
+ public boolean isAttributeCategorySupported(
+ Class<? extends Attribute> category) {
+ return _attributes.containsKey(category);
+ }
+
+ @Override
+ public <T extends PrintServiceAttribute> T getAttribute(Class<T> category) {
+ return category.cast(_attributes.get(category));
+ }
+
+ @Override
+ public PrintServiceAttributeSet getAttributes() {
+ return new HashPrintServiceAttributeSet(_attributes.values().toArray(
+ new PrintServiceAttribute[_attributes.size()]));
+ }
+
+ @Override
+ public DocFlavor[] getSupportedDocFlavors() {
+ return _flavors.toArray(new DocFlavor[_flavors.size()]);
+ }
+
+ // not implemented methods
+
+ @Override
+ public DocPrintJob createPrintJob() {
+ return null;
+ }
+
+ @Override
+ public void addPrintServiceAttributeListener(
+ PrintServiceAttributeListener listener) {
+
+ }
+
+ @Override
+ public void removePrintServiceAttributeListener(
+ PrintServiceAttributeListener listener) {
+
+ }
+
+ @Override
+ public Class<?>[] getSupportedAttributeCategories() {
+ return null;
+ }
+
+ @Override
+ public Object getDefaultAttributeValue(Class<? extends Attribute> category) {
+ return null;
+ }
+
+ @Override
+ public boolean isAttributeValueSupported(Attribute attrval,
+ DocFlavor flavor, AttributeSet attributes) {
+ return false;
+ }
+
+ @Override
+ public AttributeSet getUnsupportedAttributes(DocFlavor flavor,
+ AttributeSet attributes) {
+ return null;
+ }
+
+ @Override
+ public ServiceUIFactory getServiceUIFactory() {
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/SetPrintServiceTest.java Fri Sep 27 13:04:54 2013 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 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.
+ */
+
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+
+/**
+ * @test
+ * @bug 6870661
+ * @summary tests setPrintService() with a custom implementation
+ * @author reinhapa
+ */
+public class SetPrintServiceTest {
+
+ public static void main(String[] args) {
+ PrintServiceStub service = new PrintServiceStub("CustomPrintService");
+ PrinterJob printerJob = PrinterJob.getPrinterJob();
+ try {
+ printerJob.setPrintService(service);
+ System.out.println("Test Passed");
+ } catch (PrinterException e) {
+ throw new RuntimeException("Test FAILED", e);
+ }
+ }
+
+}