Hi Jay,

Updated testcase
http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.03/

Regards
Prasanta
On 3/16/2016 12:58 PM, Jayathirth D V wrote:

HI Prasanta,

Changes are fine. Both the print dialogs are coming and there is no NPE.

In test case please change copyright year to 2016 and also it is better to have jtreg comments before import statements for readability.

Thanks,

Jay

*From:*Phil Race
*Sent:* Wednesday, March 16, 2016 3:45 AM
*To:* prasanta sadhukhan
*Cc:* 2d-dev@openjdk.java.net
*Subject:* Re: [OpenJDK 2D-Dev] [9] RFR: JDK-8066139, , Null return from PrintJob.getGraphics() running closed/java/awt/PrintJob/HighResTest/HighResTest.java

On 03/10/2016 02:34 AM, prasanta sadhukhan wrote:

    Hi Phil,

    Please find the modified webrev
    http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.02/
    <http://cr.openjdk.java.net/%7Epsadhukhan/8066139/webrev.02/>


+1


    I tested in Mac too but there it seems to be working (ie no NPE)
    without and with this fix.


The mac code is sufficiently different that it is not a surprise that it behaves differently.



    For issue seen on windows , I have raised a bug JDK-8151589
    <https://bugs.openjdk.java.net/browse/JDK-8151589> (strangely it
    is not seen in jdk1.8.0_76 but seen from  1.9.0-ea-b01 onwards,
    can you tell me what is the release version before b01?]


That suggests a bug introduced before 8GA, fixed in an 8-update, but not in 9. But I find that a bit unlikely and I don't want to speculate more. It just needs investigation.

-phil.



    Regards
    Prasanta

    On 3/8/2016 9:45 PM, Philip Race wrote:

        > However, I am finding a strange issue with and without this
        fix too. The "Center" string is not printed

        Sounds completely unrelated to anything to do with the NPE bug.

        It is probably appropriate to file that as a separate bug.
        No big surprise that the behaviour is platform-specific as there
        is a lot of difference in Windows vs Linux (or vs Mac) in the
        printing code.

        -phil.

        On 3/8/16, 2:30 AM, prasanta sadhukhan wrote:

            On 3/8/2016 2:17 AM, Phil Race wrote:

                I don't think starting a new thread can be right. That
                would re-invoke
                printerJob.print() which even if you can reuse a
                PrinterJob (something that
                was never set out in spec.) you are surely getting a
                new spool job .. not
                a continuation. There a couple of other things I am
                not sure about either.

                I've looked into this - only on Linux - and I believe
                the issue is that
                the test program has decided up-front how many pages
                it is going to
                print and it is paying no attention to the selected
                page ranges.
                Not what the 'user' asked for but it is perfectly
                within its rights to do so.

                However the 2D PrinterJob operates in a way where it
                calls back
                asking for the specific pages it wants to be printed
                and there the
                app. must comply. The PrinterJob terminates once it
                has done.

                In the case when the 2D PrinterJob is being used to
                'run' a
                PrintJob then it must *never* return until the
                application has
                called "end" - or some exception occurs.

                So we need to remove the elements that will cause the
                job to exit.

                ---
                a/src/java.desktop/share/classes/sun/print/PrintJob2D.java
                +++
                b/src/java.desktop/share/classes/sun/print/PrintJob2D.java
                @@ -995,6 +995,7 @@
                     public void run() {

                         try {
                +            attributes.remove(PageRanges.class);
                             printerJob.print(attributes);
                         } catch (PrinterException e) {
                             //REMIND: need to store this away and not
                rethrow it.
                diff --git
                a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
                b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
                ---
                a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
                +++
                b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
                @@ -1172,6 +1172,7 @@
                         pageRangesAttr =
                (PageRanges)attributes.get(PageRanges.class);
                         if (!isSupportedValue(pageRangesAttr,
                attributes)) {
                             pageRangesAttr = null;
                +            setPageRange(-1, -1);
                         } else {
                             if
                ((SunPageSelection)attributes.get(SunPageSelection.class)
                                      == SunPageSelection.RANGE) {


                This works for me on Linux although
                a) I have not tried Windows)

            I tried on windows. The NPE is not seen and it prints 2 pages.
            However, I am finding a strange issue with and without
            this fix too. The "Center" string is not printed in the
            1st page in both "Portrait" and "Landscape" mode (although
            the rectangles are printed) but is printed in the 2nd page.
            I do not find this issue in linux.

            Regards
            Prasanta

                b) I have not verified if there are no negative
                consequences from the 2nd change.

                -phil.

                On 03/01/2016 03:14 AM, prasanta sadhukhan wrote:

                    Hi Phil,

                    Please find an updated webrev:
                    http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.01/
                    
<http://cr.openjdk.java.net/%7Epsadhukhan/8066139/webrev.01/>

                    It seems if printerJobThread finished printing, it
                    will set graphicsToBeDrawn/graphicsDrawn ArrayList
                    to null resulting in getGraphics() returning null
                    in the 2nd iteration causing NPE so
                     I have modified printerJobThread#run so that when
                    it has finished printing, do not set the arrayList
                    to null but set a flag. In getGraphics(), I check
                    that flag and start a new printerJobThread to
                    handle the next printing.
                    I have tested "All" and "Pages" selection.

                    Regards
                    Prasanta

                    On 2/22/2016 1:35 PM, Philip Race wrote:

                        > It seems this behaviour is same in linux too
                        for this HighResTest testcase.

                        OK that is good information .. so is not
                        really a regression from 8061267
                        <https://bugs.openjdk.java.net/browse/JDK-8061267>
                        as that is not in
                        any way touching linux .. it is a pre-existing
                        issue in a code path that was not being tested.

                        -phil.

                        On 2/22/16, 11:59 AM, prasanta sadhukhan wrote:

                            Hi Phil,

                            >>Additionally, have you tried running the
                            original test case provided with 8061267
                            >> against your fix ?
                            The 8061267 testcase behaves similarly
                            before and after my fix.

                            >> If I manually select it, (ie select
                            that "Pages" radio button) then press print,
                            >> then voila, the NPE is back!
                            It seems this behaviour is same in linux
                            too for this HighResTest testcase.

                            Regards
                            Prasanta

                            On 2/20/2016 1:55 AM, Phil Race wrote:

                                I am having trouble building JDK 9 at
                                the moment so i applied 8061267 to
                                jdk8u-dev
                                and was able to reproduce the
                                regression and have a couple of
                                observations

                                - I am now seeing the NPE after the
                                first page as you did .. puzzling.
                                - I next applied your fix but still
                                see the NPE !

                                It appears that all your fix did is
                                stop the "PD_PAGENUMS"  flag being
                                automatically
                                set. If I manually select it, (ie
                                select that "Pages" radio button) then
                                press print,
                                then voila, the NPE is back!

                                -phil.


                                On 02/19/2016 10:53 AM, Phil Race wrote:

                                    I am not sure I can be correctly
                                    understanding the fix as the
                                    ramification seems
                                    to be that if the users wants to
                                    print only Page 3 of a 10 page
                                    document and so sets
                                    from page=3 and to page=3, that
                                    this request will be ignored and
                                    all pages will
                                    be printed .. can you test such a
                                    scenario.

                                    Additionally, have you tried
                                    running the original test case
                                    provided with 8061267
                                    against your fix ?

                                    Also when I ran the HighResTest on
                                    a current build I saw a null
                                    graphics on
                                    the very first call to
                                    getGraphics() which is different
                                    than what I interpret
                                    you as saying - you see the null
                                    *after* the first page is printed.

                                    -phil.

                                    On 02/19/2016 01:18 AM, prasanta
                                    sadhukhan wrote:

                                        Hi Phil, All,

                                        Bug:
                                        
https://bugs.openjdk.java.net/browse/JDK-8066139
                                        webrev:
                                        
http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.00/
                                        
<http://cr.openjdk.java.net/%7Epsadhukhan/8066139/webrev.00/>

                                        It was seen after fix of
                                        JDK-8061267
                                        
<https://bugs.openjdk.java.net/browse/JDK-8061267>:
                                        PrinterJob: Specified Page
                                        Ranges not displayed in
                                        Windows Native Print Dialog
                                        the
                                        
closed/java/awt/PrintJob/HighResTest/HighResTest.java
                                        was failing with NPE when
                                        PrinterJob.getGraphics() is
                                        called the 2nd time before
                                        calling PrinterJob.end().

                                        The above fix caused this
                                        regression because it sets the
                                        PD_PAGENUMS flag for windows
                                        PrintDlg struct which causes
                                        *Pages* radio button to be
                                        selected in print dialog.
                                        However, fromPage and toPage
                                        was both set to 1 so after the
                                        1st page is printed,
                                        RasterPrinterJob.print(attributes)
                                        finishes and
                                        graphicsToBeDrawn.closeWhenEmpty()
                                        gets called
                                        
http://hg.openjdk.java.net/jdk9/client/jdk/file/d8def65c6c00/src/java.desktop/share/classes/sun/print/PrintJob2D.java#l1006

                                        which sets the queue to null
                                        so when
                                        PrinterJob2D#getGraphics()
                                        calls graphicsToBeDrawn.pop()
                                        it sees queue to be null and
                                        sets graphics object to be null so
                                        PrinterJob.getGraphics() gets
                                        null and g.drawLine in
                                        testcase causes NPE since g is
                                        null.

                                        Fix was done to set the
                                        PD_PAGENUMS flag only when
                                        toPage is more than fromPage
                                        in which case, "All" will be
                                        selected in printer dialog and
                                        RasterPrinterJob.print() will
                                        finish only after printing all
                                        the pages.

                                        Regards
                                        Prasanta


Reply via email to