Reviewer needed: backport of "S6669869: Beans.isDesignTime() and other queries should be per-AppContext" into IcedTea6 HEAD

Dr Andrew John Hughes ahughes at redhat.com
Wed Jul 27 11:12:23 PDT 2011


On 15:16 Wed 27 Jul     , Pavel Tisnovsky wrote:
> Greetings,
> 
> is it possible to push the backport of fix "S6669869:
> Beans.isDesignTime() and other queries should be per-AppContext"
> into IcedTea6 HEAD please?
> 
> The behaviour of this fix was checked on RHELs.
> 
> Please note, that the fix seems to be long and difficult, but in fact
> the changes are quite simple (four lines of code contains the fix, other
> changes are just caused by not using full class names with theirs packages).
> 

Ugh, I wish they wouldn't create such noisy changesets.

> 
> Here's ChangeLog entry:
> 
> 2011-07-27  Pavel Tisnovsky  <ptisnovs at redhat.com>
> 
>         * Makefile.am: added new patch
>         * NEWS: updated with backport
>         *
> patches/openjdk/6669869-Beans_isDesignTime_should_be_per-AppContext.patch:
>         Backport of 6669869.
> 
> 
> Can anybody please review this change?
> 

I'm not sure about this.  Won't it change the runtime behaviour of these methods?

> Thank you in advance,
> Pavel
> 
> 

> diff -r a6ba1170da98 Makefile.am
> --- a/Makefile.am	Mon Jul 25 13:44:57 2011 +0200
> +++ b/Makefile.am	Wed Jul 27 14:53:06 2011 +0200
> @@ -369,7 +369,8 @@
>  	patches/openjdk/4917091-javac_rejects_array_over_128_in_length.patch \
>  	patches/openjdk/6390045-error_cannot_access_java_lang_void.patch \
>  	patches/openjdk/6752638-preferLocaleFonts_throws_NPE.patch \
> -	patches/openjdk/5047314-Collator_compare_runs_indefinitely.patch
> +	patches/openjdk/5047314-Collator_compare_runs_indefinitely.patch \
> +	patches/openjdk/6669869-Beans_isDesignTime_should_be_per-AppContext.patch
>  
>  if WITH_RHINO
>  ICEDTEA_PATCHES += \
> diff -r a6ba1170da98 NEWS
> --- a/NEWS	Mon Jul 25 13:44:57 2011 +0200
> +++ b/NEWS	Wed Jul 27 14:53:06 2011 +0200
> @@ -362,6 +362,7 @@
>    - S6390045: Unexpected error "cannot access java.lang.Void" with '-target cldc1.0' with -source >=1.5
>    - S6752638: java.awt.GraphicsEnvironment.preferLocaleFonts() throws NPE on Linux
>    - S5047314: [Col] Collator.compare() runs indefinitely for a certain set of Thai strings
> +  - S6669869: Beans.isDesignTime() and other queries should be per-AppContext
>  * Allow selection of test suites using the jtreg_checks argument e.g. jtreg_checks="langtools"
>  * CACAO
>    - Threadlist & threadobject improvements.
> diff -r a6ba1170da98 patches/openjdk/6669869-Beans_isDesignTime_should_be_per-AppContext.patch
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/patches/openjdk/6669869-Beans_isDesignTime_should_be_per-AppContext.patch	Wed Jul 27 14:53:06 2011 +0200
> @@ -0,0 +1,346 @@
> +# HG changeset patch
> +# User malenkov
> +# Date 1233842457 -10800
> +# Node ID 27dabbdfdcacc855219955f4eb610856b13d4543
> +# Parent  62a84e564a8c9686b19b9bc09d76f8c9c41ab264
> +6669869: Beans.isDesignTime() and other queries should be per-AppContext
> +Reviewed-by: peterz, rupashka
> +
> +diff -r 62a84e564a8c -r 27dabbdfdcac src/share/classes/java/beans/Beans.java
> +--- openjdk.orig/jdk/src/share/classes/java/beans/Beans.java	Thu Feb 05 14:48:10 2009 +0300
> ++++ openjdk/jdk/src/share/classes/java/beans/Beans.java	Thu Feb 05 17:00:57 2009 +0300
> +@@ -27,26 +27,41 @@
> + 
> + import com.sun.beans.finder.ClassFinder;
> + 
> +-import java.applet.*;
> ++import java.applet.Applet;
> ++import java.applet.AppletContext;
> ++import java.applet.AppletStub;
> ++import java.applet.AudioClip;
> + 
> +-import java.awt.*;
> +-
> +-import java.beans.AppletInitializer;
> ++import java.awt.GraphicsEnvironment;
> ++import java.awt.Image;
> + 
> + import java.beans.beancontext.BeanContext;
> + 
> +-import java.io.*;
> +-
> +-import java.lang.reflect.Constructor;
> ++import java.io.IOException;
> ++import java.io.InputStream;
> ++import java.io.ObjectInputStream;
> ++import java.io.ObjectStreamClass;
> ++import java.io.StreamCorruptedException;
> + 
> + import java.net.URL;
> +-import java.lang.reflect.Array;
> ++
> ++import java.security.AccessController;
> ++import java.security.PrivilegedAction;
> ++
> ++import java.util.Enumeration;
> ++import java.util.Hashtable;
> ++import java.util.Iterator;
> ++import java.util.Vector;
> ++
> ++import sun.awt.AppContext;
> + 
> + /**
> +  * This class provides some general purpose beans control methods.
> +  */
> + 
> + public class Beans {
> ++    private static final Object DESIGN_TIME = new Object();
> ++    private static final Object GUI_AVAILABLE = new Object();
> + 
> +     /**
> +      * <p>
> +@@ -59,12 +74,12 @@
> +      * @param     beanName    the name of the bean within the class-loader.
> +      *                        For example "sun.beanbox.foobah"
> +      *
> +-     * @exception java.lang.ClassNotFoundException if the class of a serialized
> ++     * @exception ClassNotFoundException if the class of a serialized
> +      *              object could not be found.
> +-     * @exception java.io.IOException if an I/O error occurs.
> ++     * @exception IOException if an I/O error occurs.
> +      */
> + 
> +-    public static Object instantiate(ClassLoader cls, String beanName) throws java.io.IOException, ClassNotFoundException {
> ++    public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException {
> +         return Beans.instantiate(cls, beanName, null, null);
> +     }
> + 
> +@@ -80,12 +95,12 @@
> +      *                        For example "sun.beanbox.foobah"
> +      * @param     beanContext The BeanContext in which to nest the new bean
> +      *
> +-     * @exception java.lang.ClassNotFoundException if the class of a serialized
> ++     * @exception ClassNotFoundException if the class of a serialized
> +      *              object could not be found.
> +-     * @exception java.io.IOException if an I/O error occurs.
> ++     * @exception IOException if an I/O error occurs.
> +      */
> + 
> +-    public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws java.io.IOException, ClassNotFoundException {
> ++    public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException {
> +         return Beans.instantiate(cls, beanName, beanContext, null);
> +     }
> + 
> +@@ -135,19 +150,19 @@
> +      * @param     beanContext The BeanContext in which to nest the new bean
> +      * @param     initializer The AppletInitializer for the new bean
> +      *
> +-     * @exception java.lang.ClassNotFoundException if the class of a serialized
> ++     * @exception ClassNotFoundException if the class of a serialized
> +      *              object could not be found.
> +-     * @exception java.io.IOException if an I/O error occurs.
> ++     * @exception IOException if an I/O error occurs.
> +      */
> + 
> +     public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
> +-                        throws java.io.IOException, ClassNotFoundException {
> ++                        throws IOException, ClassNotFoundException {
> + 
> +-        java.io.InputStream ins;
> +-        java.io.ObjectInputStream oins = null;
> ++        InputStream ins;
> ++        ObjectInputStream oins = null;
> +         Object result = null;
> +         boolean serialized = false;
> +-        java.io.IOException serex = null;
> ++        IOException serex = null;
> + 
> +         // If the given classloader is null, we check if an
> +         // system classloader is available and (if so)
> +@@ -166,8 +181,8 @@
> +         // Try to find a serialized object with this name
> +         final String serName = beanName.replace('.','/').concat(".ser");
> +         final ClassLoader loader = cls;
> +-        ins = (InputStream)java.security.AccessController.doPrivileged
> +-            (new java.security.PrivilegedAction() {
> ++        ins = (InputStream)AccessController.doPrivileged
> ++            (new PrivilegedAction() {
> +                 public Object run() {
> +                     if (loader == null)
> +                         return ClassLoader.getSystemResourceAsStream(serName);
> +@@ -185,7 +200,7 @@
> +                 result = oins.readObject();
> +                 serialized = true;
> +                 oins.close();
> +-            } catch (java.io.IOException ex) {
> ++            } catch (IOException ex) {
> +                 ins.close();
> +                 // Drop through and try opening the class.  But remember
> +                 // the exception in case we can't find the class either.
> +@@ -264,8 +279,8 @@
> + 
> +                     final ClassLoader cloader = cls;
> +                     objectUrl = (URL)
> +-                        java.security.AccessController.doPrivileged
> +-                        (new java.security.PrivilegedAction() {
> ++                        AccessController.doPrivileged
> ++                        (new PrivilegedAction() {
> +                             public Object run() {
> +                                 if (cloader == null)
> +                                     return ClassLoader.getSystemResource
> +@@ -377,10 +392,11 @@
> +      * @return  True if we are running in an application construction
> +      *          environment.
> +      *
> +-     * @see java.beans.DesignMode
> ++     * @see DesignMode
> +      */
> +     public static boolean isDesignTime() {
> +-        return designTime;
> ++        Object value = AppContext.getAppContext().get(DESIGN_TIME);
> ++        return (value instanceof Boolean) && (Boolean) value;
> +     }
> + 
> +     /**
> +@@ -393,11 +409,12 @@
> +      *     false in a server environment or if an application is
> +      *     running as part of a batch job.
> +      *
> +-     * @see java.beans.Visibility
> ++     * @see Visibility
> +      *
> +      */
> +     public static boolean isGuiAvailable() {
> +-        return guiAvailable;
> ++        Object value = AppContext.getAppContext().get(GUI_AVAILABLE);
> ++        return (value instanceof Boolean) ? (Boolean) value : !GraphicsEnvironment.isHeadless();
> +     }
> + 
> +     /**
> +@@ -423,7 +440,7 @@
> +         if (sm != null) {
> +             sm.checkPropertiesAccess();
> +         }
> +-        designTime = isDesignTime;
> ++        AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
> +     }
> + 
> +     /**
> +@@ -449,14 +466,7 @@
> +         if (sm != null) {
> +             sm.checkPropertiesAccess();
> +         }
> +-        guiAvailable = isGuiAvailable;
> +-    }
> +-
> +-
> +-    private static boolean designTime;
> +-    private static boolean guiAvailable;
> +-    static {
> +-        guiAvailable = !GraphicsEnvironment.isHeadless();
> ++        AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
> +     }
> + }
> + 
> +@@ -501,7 +511,7 @@
> + 
> + class BeansAppletContext implements AppletContext {
> +     Applet target;
> +-    java.util.Hashtable imageCache = new java.util.Hashtable();
> ++    Hashtable imageCache = new Hashtable();
> + 
> +     BeansAppletContext(Applet target) {
> +         this.target = target;
> +@@ -546,8 +556,8 @@
> +         return null;
> +     }
> + 
> +-    public java.util.Enumeration getApplets() {
> +-        java.util.Vector applets = new java.util.Vector();
> ++    public Enumeration getApplets() {
> ++        Vector applets = new Vector();
> +         applets.addElement(target);
> +         return applets.elements();
> +     }
> +@@ -573,7 +583,7 @@
> +         return null;
> +     }
> + 
> +-    public java.util.Iterator getStreamKeys(){
> ++    public Iterator getStreamKeys(){
> +         // We do nothing.
> +         return null;
> +     }
> +diff -r 62a84e564a8c -r 27dabbdfdcac test/java/beans/Beans/6669869/TestDesignTime.java
> +--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> ++++ openjdk/jdk/test/java/beans/Beans/6669869/TestDesignTime.java	Thu Feb 05 17:00:57 2009 +0300
> +@@ -0,0 +1,52 @@
> ++/*
> ++ * Copyright 2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
> ++ * CA 95054 USA or visit www.sun.com if you need additional information or
> ++ * have any questions.
> ++ */
> ++
> ++/*
> ++ * @test
> ++ * @bug 6669869
> ++ * @summary Tests DesignTime property in different application contexts
> ++ * @author Sergey Malenkov
> ++ */
> ++
> ++import java.beans.Beans;
> ++import sun.awt.SunToolkit;
> ++
> ++public class TestDesignTime implements Runnable {
> ++    public static void main(String[] args) throws InterruptedException {
> ++        if (Beans.isDesignTime()) {
> ++            throw new Error("unexpected DesignTime property");
> ++        }
> ++        Beans.setDesignTime(!Beans.isDesignTime());
> ++        ThreadGroup group = new ThreadGroup("$$$");
> ++        Thread thread = new Thread(group, new TestDesignTime());
> ++        thread.start();
> ++        thread.join();
> ++    }
> ++
> ++    public void run() {
> ++        SunToolkit.createNewAppContext();
> ++        if (Beans.isDesignTime()) {
> ++            throw new Error("shared DesignTime property");
> ++        }
> ++    }
> ++}
> +diff -r 62a84e564a8c -r 27dabbdfdcac test/java/beans/Beans/6669869/TestGuiAvailable.java
> +--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> ++++ openjdk/jdk/test/java/beans/Beans/6669869/TestGuiAvailable.java	Thu Feb 05 17:00:57 2009 +0300
> +@@ -0,0 +1,53 @@
> ++/*
> ++ * Copyright 2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
> ++ * CA 95054 USA or visit www.sun.com if you need additional information or
> ++ * have any questions.
> ++ */
> ++
> ++/*
> ++ * @test
> ++ * @bug 6669869
> ++ * @summary Tests GuiAvailable property in different application contexts
> ++ * @author Sergey Malenkov
> ++ */
> ++
> ++import java.awt.GraphicsEnvironment;
> ++import java.beans.Beans;
> ++import sun.awt.SunToolkit;
> ++
> ++public class TestGuiAvailable implements Runnable {
> ++    public static void main(String[] args) throws InterruptedException {
> ++        if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
> ++            throw new Error("unexpected GuiAvailable property");
> ++        }
> ++        Beans.setGuiAvailable(!Beans.isGuiAvailable());
> ++        ThreadGroup group = new ThreadGroup("$$$");
> ++        Thread thread = new Thread(group, new TestGuiAvailable());
> ++        thread.start();
> ++        thread.join();
> ++    }
> ++
> ++    public void run() {
> ++        SunToolkit.createNewAppContext();
> ++        if (Beans.isGuiAvailable() == GraphicsEnvironment.isHeadless()) {
> ++            throw new Error("shared GuiAvailable property");
> ++        }
> ++    }
> ++}


-- 
Andrew :)

Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)

Support Free Java!
Contribute to GNU Classpath and IcedTea
http://www.gnu.org/software/classpath
http://icedtea.classpath.org
PGP Key: F5862A37 (https://keys.indymedia.org/)
Fingerprint = EA30 D855 D50F 90CD F54D  0698 0713 C3ED F586 2A37



More information about the distro-pkg-dev mailing list