6669869: Beans.isDesignTime() and other queries should be per-AppContext

Reviewed-by: peterz, rupashka
This commit is contained in:
Sergey Malenkov 2009-02-05 17:00:57 +03:00
parent 837ece487d
commit 8f96eb9cea
3 changed files with 158 additions and 43 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -27,26 +27,41 @@ package java.beans;
import com.sun.beans.finder.ClassFinder; 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.awt.GraphicsEnvironment;
import java.awt.Image;
import java.beans.AppletInitializer;
import java.beans.beancontext.BeanContext; import java.beans.beancontext.BeanContext;
import java.io.*; import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor; import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.StreamCorruptedException;
import java.net.URL; 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. * This class provides some general purpose beans control methods.
*/ */
public class Beans { public class Beans {
private static final Object DESIGN_TIME = new Object();
private static final Object GUI_AVAILABLE = new Object();
/** /**
* <p> * <p>
@ -59,12 +74,12 @@ public class Beans {
* @param beanName the name of the bean within the class-loader. * @param beanName the name of the bean within the class-loader.
* For example "sun.beanbox.foobah" * 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. * 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); return Beans.instantiate(cls, beanName, null, null);
} }
@ -80,12 +95,12 @@ public class Beans {
* For example "sun.beanbox.foobah" * For example "sun.beanbox.foobah"
* @param beanContext The BeanContext in which to nest the new bean * @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. * 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); return Beans.instantiate(cls, beanName, beanContext, null);
} }
@ -135,19 +150,19 @@ public class Beans {
* @param beanContext The BeanContext in which to nest the new bean * @param beanContext The BeanContext in which to nest the new bean
* @param initializer The AppletInitializer for 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. * 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) public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
throws java.io.IOException, ClassNotFoundException { throws IOException, ClassNotFoundException {
java.io.InputStream ins; InputStream ins;
java.io.ObjectInputStream oins = null; ObjectInputStream oins = null;
Object result = null; Object result = null;
boolean serialized = false; boolean serialized = false;
java.io.IOException serex = null; IOException serex = null;
// If the given classloader is null, we check if an // If the given classloader is null, we check if an
// system classloader is available and (if so) // system classloader is available and (if so)
@ -166,8 +181,8 @@ public class Beans {
// Try to find a serialized object with this name // Try to find a serialized object with this name
final String serName = beanName.replace('.','/').concat(".ser"); final String serName = beanName.replace('.','/').concat(".ser");
final ClassLoader loader = cls; final ClassLoader loader = cls;
ins = (InputStream)java.security.AccessController.doPrivileged ins = (InputStream)AccessController.doPrivileged
(new java.security.PrivilegedAction() { (new PrivilegedAction() {
public Object run() { public Object run() {
if (loader == null) if (loader == null)
return ClassLoader.getSystemResourceAsStream(serName); return ClassLoader.getSystemResourceAsStream(serName);
@ -185,7 +200,7 @@ public class Beans {
result = oins.readObject(); result = oins.readObject();
serialized = true; serialized = true;
oins.close(); oins.close();
} catch (java.io.IOException ex) { } catch (IOException ex) {
ins.close(); ins.close();
// Drop through and try opening the class. But remember // Drop through and try opening the class. But remember
// the exception in case we can't find the class either. // the exception in case we can't find the class either.
@ -264,8 +279,8 @@ public class Beans {
final ClassLoader cloader = cls; final ClassLoader cloader = cls;
objectUrl = (URL) objectUrl = (URL)
java.security.AccessController.doPrivileged AccessController.doPrivileged
(new java.security.PrivilegedAction() { (new PrivilegedAction() {
public Object run() { public Object run() {
if (cloader == null) if (cloader == null)
return ClassLoader.getSystemResource return ClassLoader.getSystemResource
@ -377,10 +392,11 @@ public class Beans {
* @return True if we are running in an application construction * @return True if we are running in an application construction
* environment. * environment.
* *
* @see java.beans.DesignMode * @see DesignMode
*/ */
public static boolean isDesignTime() { public static boolean isDesignTime() {
return designTime; Object value = AppContext.getAppContext().get(DESIGN_TIME);
return (value instanceof Boolean) && (Boolean) value;
} }
/** /**
@ -393,11 +409,12 @@ public class Beans {
* false in a server environment or if an application is * false in a server environment or if an application is
* running as part of a batch job. * running as part of a batch job.
* *
* @see java.beans.Visibility * @see Visibility
* *
*/ */
public static boolean isGuiAvailable() { 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 @@ public class Beans {
if (sm != null) { if (sm != null) {
sm.checkPropertiesAccess(); sm.checkPropertiesAccess();
} }
designTime = isDesignTime; AppContext.getAppContext().put(DESIGN_TIME, Boolean.valueOf(isDesignTime));
} }
/** /**
@ -449,14 +466,7 @@ public class Beans {
if (sm != null) { if (sm != null) {
sm.checkPropertiesAccess(); sm.checkPropertiesAccess();
} }
guiAvailable = isGuiAvailable; AppContext.getAppContext().put(GUI_AVAILABLE, Boolean.valueOf(isGuiAvailable));
}
private static boolean designTime;
private static boolean guiAvailable;
static {
guiAvailable = !GraphicsEnvironment.isHeadless();
} }
} }
@ -501,7 +511,7 @@ class ObjectInputStreamWithLoader extends ObjectInputStream
class BeansAppletContext implements AppletContext { class BeansAppletContext implements AppletContext {
Applet target; Applet target;
java.util.Hashtable imageCache = new java.util.Hashtable(); Hashtable imageCache = new Hashtable();
BeansAppletContext(Applet target) { BeansAppletContext(Applet target) {
this.target = target; this.target = target;
@ -546,8 +556,8 @@ class BeansAppletContext implements AppletContext {
return null; return null;
} }
public java.util.Enumeration getApplets() { public Enumeration getApplets() {
java.util.Vector applets = new java.util.Vector(); Vector applets = new Vector();
applets.addElement(target); applets.addElement(target);
return applets.elements(); return applets.elements();
} }
@ -573,7 +583,7 @@ class BeansAppletContext implements AppletContext {
return null; return null;
} }
public java.util.Iterator getStreamKeys(){ public Iterator getStreamKeys(){
// We do nothing. // We do nothing.
return null; return null;
} }

View file

@ -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");
}
}
}

View file

@ -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");
}
}
}