diff -r 27dabbdfdcac -r 57914fd9382f src/share/classes/java/beans/Beans.java --- a/src/share/classes/java/beans/Beans.java Thu Feb 05 17:00:57 2009 +0300 +++ b/src/share/classes/java/beans/Beans.java Tue Jun 16 17:53:32 2009 +0200 @@ -27,13 +27,7 @@ import com.sun.beans.finder.ClassFinder; -import java.applet.Applet; -import java.applet.AppletContext; -import java.applet.AppletStub; -import java.applet.AudioClip; - import java.awt.GraphicsEnvironment; -import java.awt.Image; import java.beans.beancontext.BeanContext; @@ -43,17 +37,15 @@ import java.io.ObjectStreamClass; import java.io.StreamCorruptedException; -import java.net.URL; 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 java.util.ServiceLoader; import sun.awt.AppContext; +import sun.beans.AppletProxy; /** * This class provides some general purpose beans control methods. @@ -155,8 +147,14 @@ * @exception IOException if an I/O error occurs. */ - public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer) - throws IOException, ClassNotFoundException { + public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, + /** TBD: Oops , this is bad. The AppletInitializer is used from + * public API. I have not noticed that sooner. Opps. + AppletInitializer initializer + * meanwhile turning into object, but this cannot be final solution: + */ + Object initializer + ) throws IOException, ClassNotFoundException { InputStream ins; ObjectInputStream oins = null; @@ -231,7 +229,7 @@ * Try to instantiate the class. */ - try { + try { result = cl.newInstance(); } catch (Exception ex) { // We have to remap the exception to one in our signature. @@ -243,108 +241,13 @@ if (result != null) { // Ok, if the result is an applet initialize it. - - AppletStub stub = null; - - if (result instanceof Applet) { - Applet applet = (Applet) result; - boolean needDummies = initializer == null; - - if (needDummies) { - - // Figure our the codebase and docbase URLs. We do this - // by locating the URL for a known resource, and then - // massaging the URL. - - // First find the "resource name" corresponding to the bean - // itself. So a serialzied bean "a.b.c" would imply a - // resource name of "a/b/c.ser" and a classname of "x.y" - // would imply a resource name of "x/y.class". - - final String resourceName; - - if (serialized) { - // Serialized bean - resourceName = beanName.replace('.','/').concat(".ser"); - } else { - // Regular class - resourceName = beanName.replace('.','/').concat(".class"); - } - - URL objectUrl = null; - URL codeBase = null; - URL docBase = null; - - // Now get the URL correponding to the resource name. - - final ClassLoader cloader = cls; - objectUrl = (URL) - AccessController.doPrivileged - (new PrivilegedAction() { - public Object run() { - if (cloader == null) - return ClassLoader.getSystemResource - (resourceName); - else - return cloader.getResource(resourceName); - } - }); - - // If we found a URL, we try to locate the docbase by taking - // of the final path name component, and the code base by taking - // of the complete resourceName. - // So if we had a resourceName of "a/b/c.class" and we got an - // objectURL of "file://bert/classes/a/b/c.class" then we would - // want to set the codebase to "file://bert/classes/" and the - // docbase to "file://bert/classes/a/b/" - - if (objectUrl != null) { - String s = objectUrl.toExternalForm(); - - if (s.endsWith(resourceName)) { - int ix = s.length() - resourceName.length(); - codeBase = new URL(s.substring(0,ix)); - docBase = codeBase; - - ix = s.lastIndexOf('/'); - - if (ix >= 0) { - docBase = new URL(s.substring(0,ix+1)); - } - } - } - - // Setup a default context and stub. - BeansAppletContext context = new BeansAppletContext(applet); - - stub = (AppletStub)new BeansAppletStub(applet, context, codeBase, docBase); - applet.setStub(stub); - } else { - initializer.initialize(applet, beanContext); - } - - // now, if there is a BeanContext, add the bean, if applicable. - - if (beanContext != null) { - beanContext.add(result); - } - - // If it was deserialized then it was already init-ed. - // Otherwise we need to initialize it. - - if (!serialized) { - // We need to set a reasonable initial size, as many - // applets are unhappy if they are started without - // having been explicitly sized. - applet.setSize(100,100); - applet.init(); - } - - if (needDummies) { - ((BeansAppletStub)stub).active = true; - } else initializer.activate(applet); - - } else if (beanContext != null) beanContext.add(result); + Iterator it = ServiceLoader.load(AppletProxy.class).iterator(); + AppletProxy ap = it.hasNext() ? it.next() : null; + if (ap != null || !ap.initialize( + result, initializer, serialized, beanName, beanContext, cls + )) { + if (beanContext != null) beanContext.add(result); + } } return result; @@ -504,134 +407,3 @@ } } -/** - * Package private support class. This provides a default AppletContext - * for beans which are applets. - */ - -class BeansAppletContext implements AppletContext { - Applet target; - Hashtable imageCache = new Hashtable(); - - BeansAppletContext(Applet target) { - this.target = target; - } - - public AudioClip getAudioClip(URL url) { - // We don't currently support audio clips in the Beans.instantiate - // applet context, unless by some luck there exists a URL content - // class that can generate an AudioClip from the audio URL. - try { - return (AudioClip) url.getContent(); - } catch (Exception ex) { - return null; - } - } - - public synchronized Image getImage(URL url) { - Object o = imageCache.get(url); - if (o != null) { - return (Image)o; - } - try { - o = url.getContent(); - if (o == null) { - return null; - } - if (o instanceof Image) { - imageCache.put(url, o); - return (Image) o; - } - // Otherwise it must be an ImageProducer. - Image img = target.createImage((java.awt.image.ImageProducer)o); - imageCache.put(url, img); - return img; - - } catch (Exception ex) { - return null; - } - } - - public Applet getApplet(String name) { - return null; - } - - public Enumeration getApplets() { - Vector applets = new Vector(); - applets.addElement(target); - return applets.elements(); - } - - public void showDocument(URL url) { - // We do nothing. - } - - public void showDocument(URL url, String target) { - // We do nothing. - } - - public void showStatus(String status) { - // We do nothing. - } - - public void setStream(String key, InputStream stream)throws IOException{ - // We do nothing. - } - - public InputStream getStream(String key){ - // We do nothing. - return null; - } - - public Iterator getStreamKeys(){ - // We do nothing. - return null; - } -} - -/** - * Package private support class. This provides an AppletStub - * for beans which are applets. - */ -class BeansAppletStub implements AppletStub { - transient boolean active; - transient Applet target; - transient AppletContext context; - transient URL codeBase; - transient URL docBase; - - BeansAppletStub(Applet target, - AppletContext context, URL codeBase, - URL docBase) { - this.target = target; - this.context = context; - this.codeBase = codeBase; - this.docBase = docBase; - } - - public boolean isActive() { - return active; - } - - public URL getDocumentBase() { - // use the root directory of the applet's class-loader - return docBase; - } - - public URL getCodeBase() { - // use the directory where we found the class or serialized object. - return codeBase; - } - - public String getParameter(String name) { - return null; - } - - public AppletContext getAppletContext() { - return context; - } - - public void appletResize(int width, int height) { - // we do nothing. - } -}