On Wed, 19 May 2021 15:25:34 GMT, Phil Race <[email protected]> wrote:
>> Hello,
>>
>> Could you please review the following fix for the bug specific to macOS. The
>> bug consists in the fact that if the method
>> "java.awt.print.Printable.print​(Graphics, PageFormat, int)" throws
>> "java.awt.print.PrinterException" or "java.lang.RuntimeException" during the
>> call "java.awt.print.PrinterJob.print()", then the exception is caught and
>> ignored by JDK and a user cannot learn that printing failed and what caused
>> failure of printing, because "PrinterJob.print()" method does not throw
>> "PrinterException" or the occurred exception is not reported by JDK through
>> the error stream.
>>
>> ROOT CAUSE OF THE BUG:
>> The root cause of the bug is the fact that in the method
>> "sun.lwawt.macosx.CPrinterJob.printAndGetPageFormatArea(final Printable,
>> final Graphics, final PageFormat, final int)" from the file
>> "src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java" the
>> exception thrown during execution of the expression
>>
>> "int pageResult = printable.print(graphics, pageFormat, pageIndex);"
>>
>> is caught but is not returned to a developer by any mean or is not printed
>> out to the error stream.
>>
>> THE FIX:
>> The fix implements propagation of the occurred and caught exception to the
>> level of the user's code executing "PrinterJob.print()" method. Propagation
>> of the exception by storing it in the instance variable of "CPrinterJob"
>> object is implemented, because the engaged code always is executed:
>> - on 2 threads (non-EDT thread, EDT thread) in case when
>> "PrinterJob.print()" is called by the user on a non-EDT thread;
>> - on 3 threads (2 EDT threads, a temporary thread started by JDK to execute
>> "CPrinterJob._safePrintLoop(long, long );") when "PrinterJob.print()" is
>> called on EDT thread.
>>
>> The regression test which is part of the fix was also successfully executed
>> on MS Windows OS and Linux OS.
>>
>> Thank you,
>> Anton
>
> src/java.desktop/macosx/classes/sun/lwawt/macosx/CPrinterJob.java line 264:
>
>> 262: Exception oldEx = lastPrintExRef.getAndSet(newEx);
>> 263: if (printOldEx && (oldEx != null)) {
>> 264: oldEx.printStackTrace();
>
> Why not Throwable ?
> I suggest to not do this. ie don't print and don't replace Instead swallow
> the new exception
> and let the original problem that started it get propagated. That seems more
> likely to be useful.
Thank you for this remark. I agree using "Throwable" is more solid approach. In
the 2nd version of the fix I use "Throwable" in this "AtomicReference" object
and I removed completely this method "setLastPrintEx".
-------------
PR: https://git.openjdk.java.net/jdk/pull/4036