Mercurial > hg > openjdk > lambda > jdk
changeset 10436:c9c945cea665
8015586: [macosx] Test closed/java/awt/print/PrinterJob/PrintToDir.java fails on MacOSX
Reviewed-by: prr, jchen
author | jgodinez |
---|---|
date | Tue, 15 Oct 2013 14:24:49 -0700 |
parents | 0df5cda89a50 |
children | 070e8ec9d82c |
files | src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java src/share/classes/sun/print/RasterPrinterJob.java test/java/awt/print/PrinterJob/PrintToDir.java |
diffstat | 3 files changed, 183 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Tue Oct 15 14:16:27 2013 -0700 +++ b/src/macosx/classes/sun/lwawt/macosx/CPrinterJob.java Tue Oct 15 14:24:49 2013 -0700 @@ -233,6 +233,10 @@ setAttributes(attributes); + // throw exception for invalid destination + if (destinationAttr != null) { + validateDestination(destinationAttr); + } /* Get the range of pages we are to print. If the * last page to print is unknown, then we print to
--- a/src/share/classes/sun/print/RasterPrinterJob.java Tue Oct 15 14:16:27 2013 -0700 +++ b/src/share/classes/sun/print/RasterPrinterJob.java Tue Oct 15 14:24:49 2013 -0700 @@ -1359,34 +1359,7 @@ setAttributes(attributes); // throw exception for invalid destination if (destinationAttr != null) { - // destinationAttr is null for Destination(new URI("")) - // because isAttributeValueSupported returns false in setAttributes - - // Destination(new URI(" ")) throws URISyntaxException - File f = new File(destinationAttr); - try { - // check if this is a new file and if filename chars are valid - if (f.createNewFile()) { - f.delete(); - } - } catch (IOException ioe) { - throw new PrinterException("Cannot write to file:"+ - destinationAttr); - } catch (SecurityException se) { - //There is already file read/write access so at this point - // only delete access is denied. Just ignore it because in - // most cases the file created in createNewFile gets overwritten - // anyway. - } - - File pFile = f.getParentFile(); - if ((f.exists() && - (!f.isFile() || !f.canWrite())) || - ((pFile != null) && - (!pFile.exists() || (pFile.exists() && !pFile.canWrite())))) { - throw new PrinterException("Cannot write to file:"+ - destinationAttr); - } + validateDestination(destinationAttr); } } else { spoolToService(psvc, attributes); @@ -1509,6 +1482,40 @@ } } + protected void validateDestination(String dest) throws PrinterException { + if (dest == null) { + return; + } + // dest is null for Destination(new URI("")) + // because isAttributeValueSupported returns false in setAttributes + + // Destination(new URI(" ")) throws URISyntaxException + File f = new File(dest); + try { + // check if this is a new file and if filename chars are valid + if (f.createNewFile()) { + f.delete(); + } + } catch (IOException ioe) { + throw new PrinterException("Cannot write to file:"+ + dest); + } catch (SecurityException se) { + //There is already file read/write access so at this point + // only delete access is denied. Just ignore it because in + // most cases the file created in createNewFile gets overwritten + // anyway. + } + + File pFile = f.getParentFile(); + if ((f.exists() && + (!f.isFile() || !f.canWrite())) || + ((pFile != null) && + (!pFile.exists() || (pFile.exists() && !pFile.canWrite())))) { + throw new PrinterException("Cannot write to file:"+ + dest); + } + } + /** * updates a Paper object to reflect the current printer's selected * paper size and imageable area for that paper size.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/print/PrinterJob/PrintToDir.java Tue Oct 15 14:24:49 2013 -0700 @@ -0,0 +1,144 @@ +/* + * 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. + */ + +/* @test + @bug 4973278 8015586 + @run main PrintToDir + @summary Must throw exception when printing to an invalid filename - a dir. +*/ +import java.io.*; +import java.net.*; +import java.awt.*; +import java.awt.geom.*; +import java.awt.print.*; +import javax.print.PrintService; +import javax.print.attribute.*; +import javax.print.attribute.standard.*; +import java.util.PropertyPermission; + +public class PrintToDir extends Frame implements Printable { + + boolean firstTime = true; + double sx, sy; + Shape clip, firstClip; + + TextField tf = new TextField(); + Label tfLabel = new Label ("File Name"); + Panel p = new Panel (new GridLayout(2,2)); + Button b = new Button("Print"); + + PrintToDir() { + add("South", p); + p.add(tfLabel); + p.add(tf); + p.add(b); + setSize(300, 300); + setVisible(true); + } + + public int print(Graphics g, PageFormat pf, int pageIndex) { + Graphics2D g2 = (Graphics2D)g; + if (pageIndex>=1) { + return Printable.NO_SUCH_PAGE; + } + g2.drawString("hello world", 100, 100); + return Printable.PAGE_EXISTS; + } + + void doPrintJob(String fileStr) { + PageAttributes pa = new PageAttributes(); + JobAttributes ja = new JobAttributes(); + ja.setDialog(JobAttributes.DialogType.NONE); + ja.setDestination(JobAttributes.DestinationType.FILE); + ja.setFileName(fileStr); + try { + PrintJob pjob = Toolkit.getDefaultToolkit().getPrintJob(this, + "PrintDialog Testing", ja, pa); + if (pjob != null) { + System.out.println("Printjob successfully created: " + pjob); + Graphics g = pjob.getGraphics(); + this.printAll(g); + g.dispose(); + pjob.end(); + } + System.out.println("Printing completed"); + } catch (IllegalArgumentException e) { + System.out.println("PrintJob passed."); + return; + } + throw new RuntimeException("PrintJob::IllegalArgumentException expected but not thrown. \nTEST FAILED"); + } + + public static void doPrinterJob(String fileStr, OrientationRequested o) { + PrinterJob pj = PrinterJob.getPrinterJob(); + PrintService ps = pj.getPrintService(); + if (ps == null) { + System.out.println("No print service found."); + return; + } + pj.setPrintable(new PrintToDir()); + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + aset.add(o); + File f = new File(fileStr); + // f.deleteOnExit(); + URI dest = f.toURI(); + Destination d = new Destination(dest); + if (ps.isAttributeValueSupported(d, null, null)) { + aset.add(d); + try { + pj.print(aset); + } catch (PrinterException e) { + System.out.println("PrinterJob passed."); + return; + } + throw new RuntimeException("PrinterJob:PrinterException expected but not thrown. \nTEST FAILED"); + } else { + System.out.println("Destination attribute is not a supported value. PrinterJob passed."); + } + } + + + public static void main(String arg[]) { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + System.out.println("Security manager detected"); + try { + security.checkPermission(new FilePermission("<<ALL FILES>>", "read,write")); + security.checkPermission(new PropertyPermission("user.dir", "read")); + } catch (SecurityException se) { + System.out.println("Security requirement not obtained. TEST PASSED"); + return; + } + } + String[] testStr = {".", ""}; + for (int i=0; i<testStr.length; i++) { + System.out.println("Testing file name = \""+testStr[i]+"\""); + doPrinterJob(testStr[i], OrientationRequested.PORTRAIT); + PrintToDir ptd = new PrintToDir(); + ptd.doPrintJob(testStr[i]); + ptd.dispose(); + } + System.out.println("TEST PASSED"); + } + +}