java-topology/test/jdk/java/awt/print/PrinterJob/ValidatePage/ValidatePage.java
russell@unturf.com 0a580b313d undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com

Patches, unit tests, benchmarks, whitepaper, and outreach briefs.
Public domain — no copyright claimed. Use freely.
2026-03-26 17:11:57 -04:00

303 lines
12 KiB
Java

/*
* Copyright (c) 2007, 2024, 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.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JOptionPane;
/*
* @test
* @bug 4252108 6229507
* @key printer
* @summary PrinterJob.validatePage() is unimplemented.
* @library /java/awt/regtesthelpers
* @build PassFailJFrame
* @run main/manual ValidatePage
*/
public class ValidatePage extends Frame implements Printable {
PrinterJob myPrinterJob;
PageFormat myPageFormat;
Label pw, ph, pglm, pgrm, pgiw, pgih, pgtm, pgbm;
TextField tpw, tph, tpglm, tpgtm, tpgiw, tpgih;
Label myWidthLabel;
Label myHeightLabel;
Label myImageableXLabel;
Label myImageableYLabel;
Label myImageableRightLabel;
Label myImageableBottomLabel;
Label myImageableWidthLabel;
Label myImageableHeightLabel;
Label myOrientationLabel;
private static String getOrientation(int o) {
return switch (o) {
case PageFormat.PORTRAIT -> "PORTRAIT";
case PageFormat.LANDSCAPE -> "LANDSCAPE";
case PageFormat.REVERSE_LANDSCAPE -> "REVERSE_LANDSCAPE";
default -> "<invalid>";
};
}
private void displayPageFormatAttributes() {
myWidthLabel.setText("Format Width = " + drnd(myPageFormat.getWidth()));
myHeightLabel.setText("Format Height = " + drnd(myPageFormat.getHeight()));
myImageableXLabel.setText("Format Left Margin = " + drnd(myPageFormat.getImageableX()));
myImageableRightLabel.setText("Format Right Margin = "
+ drnd(myPageFormat.getWidth()
- (myPageFormat.getImageableX() + myPageFormat.getImageableWidth())));
myImageableWidthLabel.setText("Format ImageableWidth = "
+ drnd(myPageFormat.getImageableWidth()));
myImageableYLabel.setText("Format Top Margin = "
+ drnd(myPageFormat.getImageableY()));
myImageableBottomLabel.setText("Format Bottom Margin = "
+ drnd(myPageFormat.getHeight()
- (myPageFormat.getImageableY() + myPageFormat.getImageableHeight())));
myImageableHeightLabel.setText("Format ImageableHeight = "
+ drnd(myPageFormat.getImageableHeight()));
myOrientationLabel.setText("Format Orientation = "
+ getOrientation(myPageFormat.getOrientation()));
Paper p = myPageFormat.getPaper();
pw.setText("Paper Width = " + drnd(p.getWidth()));
ph.setText("Paper Height = " + drnd(p.getHeight()));
pglm.setText("Paper Left Margin = " + drnd(p.getImageableX()));
pgiw.setText("Paper Imageable Width = " + drnd(p.getImageableWidth()));
pgih.setText("Paper Imageable Height = " + drnd(p.getImageableHeight()));
pgrm.setText("Paper Right Margin = "
+ drnd(p.getWidth()
- (p.getImageableX() + p.getImageableWidth())));
pgtm.setText("Paper Top Margin = " + drnd(p.getImageableY()));
pgbm.setText("Paper Bottom Margin = "
+ drnd(p.getHeight()
- (p.getImageableY() + p.getImageableHeight())));
}
static String drnd(double d) {
return String.format("%.2f", d);
}
public ValidatePage() {
super("Validate Page Test");
myPrinterJob = PrinterJob.getPrinterJob();
myPageFormat = new PageFormat();
Paper p = new Paper();
p.setSize(28 * 72, 21.5 * 72);
myPageFormat.setPaper(p);
setLayout(new FlowLayout());
Panel pfp = new Panel();
pfp.setLayout(new GridLayout(9, 1, 0, 0));
pfp.add(myOrientationLabel = new Label());
pfp.add(myWidthLabel = new Label());
pfp.add(myImageableXLabel = new Label());
pfp.add(myImageableRightLabel = new Label());
pfp.add(myImageableWidthLabel = new Label());
pfp.add(myHeightLabel = new Label());
pfp.add(myImageableYLabel = new Label());
pfp.add(myImageableBottomLabel = new Label());
pfp.add(myImageableHeightLabel = new Label());
add(pfp);
Panel pp = new Panel();
pp.setLayout(new GridLayout(8, 1, 0, 0));
pp.add(pw = new Label());
pp.add(pglm = new Label());
pp.add(pgtm = new Label());
pp.add(ph = new Label());
pp.add(pgiw = new Label());
pp.add(pgih = new Label());
pp.add(pgrm = new Label());
pp.add(pgbm = new Label());
add(pp);
Panel epp = new Panel();
epp.setLayout(new GridLayout(6, 2, 0, 0));
epp.add(new Label("Page width:"));
epp.add(tpw = new TextField());
epp.add(new Label("Page height:"));
epp.add(tph = new TextField());
epp.add(new Label("Left Margin:"));
epp.add(tpglm = new TextField());
epp.add(new Label("Top margin:"));
epp.add(tpgtm = new TextField());
epp.add(new Label("Imageable Wid:"));
epp.add(tpgiw = new TextField());
epp.add(new Label("Imageable Hgt:"));
epp.add(tpgih = new TextField());
add(epp);
displayPageFormatAttributes();
Panel panel = new Panel();
Button defButton = new Button("Default Page");
defButton.addActionListener(e -> {
myPageFormat = myPrinterJob.defaultPage();
displayPageFormatAttributes();
});
Button pageButton = new Button("Page Setup...");
pageButton.addActionListener(e -> {
myPageFormat = myPrinterJob.pageDialog(myPageFormat);
displayPageFormatAttributes();
});
Button printButton = new Button("Print");
printButton.addActionListener(e -> {
try {
myPrinterJob.setPrintable(ValidatePage.this, myPageFormat);
myPrinterJob.print();
} catch (PrinterException pe) {
pe.printStackTrace();
PassFailJFrame.forceFail("Test failed because of PrinterException");
}
});
Button chooseButton = new Button("Printer...");
chooseButton.addActionListener(e -> myPrinterJob.printDialog());
Button validateButton = new Button("Validate Page");
validateButton.addActionListener(e -> {
myPageFormat = myPrinterJob.validatePage(myPageFormat);
displayPageFormatAttributes();
});
Button setButton = new Button("Set Paper");
setButton.addActionListener(e -> {
try {
Paper p1 = new Paper();
double pwid = Double.parseDouble(tpw.getText());
double phgt = Double.parseDouble(tph.getText());
double pimx = Double.parseDouble(tpglm.getText());
double pimy = Double.parseDouble(tpgtm.getText());
double pimwid = Double.parseDouble(tpgiw.getText());
double pimhgt = Double.parseDouble(tpgih.getText());
p1.setSize(pwid, phgt);
p1.setImageableArea(pimx, pimy, pimwid, pimhgt);
myPageFormat.setPaper(p1);
displayPageFormatAttributes();
} catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(ValidatePage.this,
"NumberFormatException occurred", "Error",
JOptionPane.ERROR_MESSAGE);
}
});
panel.add(setButton);
panel.add(defButton);
panel.add(pageButton);
panel.add(chooseButton);
panel.add(validateButton);
panel.add(printButton);
add(panel);
TextArea ta = new TextArea(10, 45);
ta.setText(
"When validating a page, the process is 1st to find the closest matching \n" +
"paper size, next to make sure the requested imageable area fits within \n" +
"the printer's imageable area for that paper size. Finally the top and \n" +
"left margins will be shrunk if they are too great for the adjusted \n" +
"imageable area to fit at that position. They will shrink by the minimum\n" +
"needed to accommodate the imageable area.\n \n \n" +
"To test 6229507, put the minimum margins (all 0s) in Page Setup dialog.\n" +
"Compare Imageable width, height, and margins of portrait against landscape.");
ta.setEditable(false);
add(ta);
setSize(700, 500);
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0) {
return Printable.NO_SUCH_PAGE;
}
System.out.println("Format Orientation = "
+ getOrientation(pageFormat.getOrientation()));
Graphics2D g2d = (Graphics2D) graphics;
System.out.println(g2d.getTransform());
System.out.println("ix=" + pageFormat.getImageableX() +
" iy=" + pageFormat.getImageableY());
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.drawString("ORIGIN", 20, 20);
g2d.drawString("X THIS WAY", 200, 50);
g2d.drawString("Y THIS WAY", 60, 200);
g2d.drawRect(0, 0,
(int) pageFormat.getImageableWidth(),
(int) pageFormat.getImageableHeight());
g2d.setColor(Color.blue);
g2d.drawRect(1, 1,
(int) pageFormat.getImageableWidth() - 2,
(int) pageFormat.getImageableHeight() - 2);
return Printable.PAGE_EXISTS;
}
private static final String INSTRUCTIONS =
"This test is very flexible and requires much interaction.\n" +
"There are several buttons.\n\n" +
"Set Paper: if all fields are valid numbers it sets the Paper object.\n" +
"This is used to create arbitrary nonsensical paper sizes to help\n" +
"test validatePage.\n\n" +
"Default Page: sets a default page. This should always be valid.\n\n" +
"Page Setup: brings up the page dialog. You must OK this dialog\n" +
"for it to have any effect. You can use this to set different size,\n" +
"orientation and margins - which of course affect imageable area.\n\n" +
"Printer: Used to set the current printer. Useful because current\n" +
"printer affects the choice of paper sizes available.\n" +
"You must OK this dialog for it to have any effect.\n\n" +
"Validate Page:The most important button in the test.\n" +
"By setting nonsensical or valid papers with varying margins etc,\n" +
"this should always find the closest match within the limits of\n" +
"what is possible on the current printer.\n\n" +
"Print: to the current printer. Not vital for this test request.";
public static void main(String[] args) throws Exception {
if (PrinterJob.lookupPrintServices().length == 0) {
throw new RuntimeException("Printer not configured or available.");
}
PassFailJFrame.builder()
.instructions(INSTRUCTIONS)
.testTimeOut(10)
.testUI(ValidatePage::new)
.rows((int) INSTRUCTIONS.lines().count() + 1)
.columns(45)
.build()
.awaitAndCheck();
}
}