6870661: Setting a custom PrintService on a PrinterJob leads to a PrinterException

Reviewed-by: prr, jgodinez
This commit is contained in:
Patrick Reinhart 2013-09-27 13:04:54 -07:00 committed by Jennifer Godinez
parent 00c37e4e9e
commit 2c516bc7b4
4 changed files with 271 additions and 5 deletions

View File

@ -96,7 +96,6 @@ import javax.print.attribute.standard.PrinterName;
import javax.print.attribute.standard.JobMediaSheetsSupported; import javax.print.attribute.standard.JobMediaSheetsSupported;
import javax.print.attribute.standard.PageRanges; import javax.print.attribute.standard.PageRanges;
import javax.print.attribute.Size2DSyntax; import javax.print.attribute.Size2DSyntax;
import javax.print.StreamPrintService;
import sun.awt.Win32FontManager; import sun.awt.Win32FontManager;
@ -440,7 +439,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
throw new HeadlessException(); throw new HeadlessException();
} }
if (getPrintService() instanceof StreamPrintService) { if (!(getPrintService() instanceof Win32PrintService)) {
return super.pageDialog(page); return super.pageDialog(page);
} }
@ -586,7 +585,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
attributes = new HashPrintRequestAttributeSet(); attributes = new HashPrintRequestAttributeSet();
} }
if (getPrintService() instanceof StreamPrintService) { if (!(getPrintService() instanceof Win32PrintService)) {
return super.printDialog(attributes); return super.printDialog(attributes);
} }
@ -611,7 +610,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
public void setPrintService(PrintService service) public void setPrintService(PrintService service)
throws PrinterException { throws PrinterException {
super.setPrintService(service); super.setPrintService(service);
if (service instanceof StreamPrintService) { if (!(service instanceof Win32PrintService)) {
return; return;
} }
driverDoesMultipleCopies = false; driverDoesMultipleCopies = false;
@ -648,7 +647,7 @@ public class WPrinterJob extends RasterPrinterJob implements DisposerTarget {
} }
myService = PrintServiceLookup.lookupDefaultPrintService(); myService = PrintServiceLookup.lookupDefaultPrintService();
if (myService != null) { if (myService instanceof Win32PrintService) {
try { try {
setNativePrintServiceIfNeeded(myService.getName()); setNativePrintServiceIfNeeded(myService.getName());
} catch (Exception e) { } catch (Exception e) {

View File

@ -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");
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}
}