From 2c516bc7b4990e1b29ca1d28fa563baa3caa0e58 Mon Sep 17 00:00:00 2001 From: Patrick Reinhart Date: Fri, 27 Sep 2013 13:04:54 -0700 Subject: [PATCH] 6870661: Setting a custom PrintService on a PrinterJob leads to a PrinterException Reviewed-by: prr, jgodinez --- .../classes/sun/awt/windows/WPrinterJob.java | 9 +- .../CustomPrintService/PrintDialog.java | 59 +++++++ .../CustomPrintService/PrintServiceStub.java | 160 ++++++++++++++++++ .../SetPrintServiceTest.java | 48 ++++++ 4 files changed, 271 insertions(+), 5 deletions(-) create mode 100644 jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintDialog.java create mode 100644 jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintServiceStub.java create mode 100644 jdk/test/java/awt/print/PrinterJob/CustomPrintService/SetPrintServiceTest.java diff --git a/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java b/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java index 519a0be422e..6f22231a53c 100644 --- a/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java +++ b/jdk/src/windows/classes/sun/awt/windows/WPrinterJob.java @@ -96,7 +96,6 @@ import javax.print.attribute.standard.PrinterName; 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 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget { throw new HeadlessException(); } - if (getPrintService() instanceof StreamPrintService) { + if (!(getPrintService() instanceof Win32PrintService)) { return super.pageDialog(page); } @@ -586,7 +585,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget { attributes = new HashPrintRequestAttributeSet(); } - if (getPrintService() instanceof StreamPrintService) { + if (!(getPrintService() instanceof Win32PrintService)) { return super.printDialog(attributes); } @@ -611,7 +610,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget { 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 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget { } myService = PrintServiceLookup.lookupDefaultPrintService(); - if (myService != null) { + if (myService instanceof Win32PrintService) { try { setNativePrintServiceIfNeeded(myService.getName()); } catch (Exception e) { diff --git a/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintDialog.java b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintDialog.java new file mode 100644 index 00000000000..d18ee86878d --- /dev/null +++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintDialog.java @@ -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"); + } +} diff --git a/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintServiceStub.java b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintServiceStub.java new file mode 100644 index 00000000000..c430959c42b --- /dev/null +++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/PrintServiceStub.java @@ -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 _flavors; + private final Map, Object> _attributes; + + public PrintServiceStub(String name) { + _name = name; + _flavors = new HashSet(); + _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 category, DocFlavor flavor, + AttributeSet attributes) { + return _attributes.get(category); + } + + @Override + public boolean isAttributeCategorySupported( + Class category) { + return _attributes.containsKey(category); + } + + @Override + public T getAttribute(Class 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 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; + } +} diff --git a/jdk/test/java/awt/print/PrinterJob/CustomPrintService/SetPrintServiceTest.java b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/SetPrintServiceTest.java new file mode 100644 index 00000000000..a6bc7ff9877 --- /dev/null +++ b/jdk/test/java/awt/print/PrinterJob/CustomPrintService/SetPrintServiceTest.java @@ -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); + } + } + +}