mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			369 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			369 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* java.beans.Beans
 | |
|    Copyright (C) 1998, 1999, 2004, 2005 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath 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 for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| package java.beans;
 | |
| 
 | |
| import gnu.java.beans.DummyAppletStub;
 | |
| import gnu.java.io.ClassLoaderObjectInputStream;
 | |
| 
 | |
| import java.applet.Applet;
 | |
| import java.beans.beancontext.BeanContext;
 | |
| import java.io.IOException;
 | |
| import java.io.ObjectInputStream;
 | |
| import java.net.URL;
 | |
| 
 | |
| /**
 | |
|  * <code>Beans</code> provides some helper methods that allow the basic
 | |
|  * operations of Bean-ness.
 | |
|  *
 | |
|  * @author John Keiser
 | |
|  * @author Robert Schuster
 | |
|  *
 | |
|  * @since 1.1
 | |
|  * @status updated to 1.4
 | |
|  *
 | |
|  */
 | |
| public class Beans
 | |
| {
 | |
|   static boolean designTime = false;
 | |
|   static boolean guiAvailable = true;
 | |
| 
 | |
|   /**
 | |
|    * Once again, we have a java.beans class with only
 | |
|    * static methods that can be instantiated.  When
 | |
|    * will the madness end? :)
 | |
|    */
 | |
|   public Beans()
 | |
|   {
 | |
|     // Does intentionally nothing here.
 | |
|   }
 | |
| 
 | |
|    /** Creates a bean.
 | |
|     * <p>This is a convenience method that calls <code>instantiate(cl, beanName, null, null)</code>.</p>
 | |
|     *
 | |
|     * @see instantiate(ClassLoader, String, BeanContext, AppletInitializer)
 | |
|     * @param cl ClassLoader to be used or <code>null</code> for the system classloader.
 | |
|     * @param beanName Name of a serialized bean or class name.
 | |
|     * @return A newly created bean.
 | |
|     * @throws IOException If access of an IO resource failed.
 | |
|     * @throws ClassNotFoundException If the class name is not known or does not lead to a proper bean class.
 | |
|     */
 | |
|     public static Object instantiate(ClassLoader cl, String beanName)
 | |
|         throws IOException, ClassNotFoundException
 | |
|     {
 | |
|         return instantiate(cl, beanName, null, null);
 | |
|     }
 | |
| 
 | |
|    /** Creates a bean.
 | |
|     *
 | |
|     * <p>This is a convenience method that calls <code>instantiate(cl, beanName, beanContext, null)</code>.</p>
 | |
|     *
 | |
|     * @see instantiate(ClassLoader, String, BeanContext, AppletInitializer)
 | |
|     * @param cl ClassLoader to be used or <code>null</code> for the system classloader.
 | |
|     * @param beanName Name of a serialized bean or class name.
 | |
|     * @param beanContext Context to which the newly created Bean should be added.
 | |
|     * @return A newly created bean.
 | |
|     * @throws IOException If access of an IO resource failed.
 | |
|     * @throws ClassNotFoundException If the class name is not known or does not lead to a proper bean class.
 | |
|     */
 | |
|     public static Object instantiate(
 | |
|         ClassLoader cl,
 | |
|         String beanName,
 | |
|         BeanContext beanContext)
 | |
|         throws IOException, ClassNotFoundException
 | |
|     {
 | |
|         return instantiate(cl, beanName, beanContext, null);
 | |
|     }
 | |
| 
 | |
|    /** Instantiates a bean according to Beans 1.0.
 | |
|     *
 | |
|     * <p>In Beans 1.0 the instantiation scheme is as follows:</p>
 | |
|     * <p>The name should be dot-separated (e.g "place.for.beans.myBean") and indicate either a
 | |
|     * serialized object or a class name. In the first case all dots in the name are replaced with
 | |
|     * slashes ('/') and ".ser" is appended ("place.for.beans.myBean" becomes "place/for/beans/myBean.ser").
 | |
|     * The bean is then loaded as an application or system resource depending on whether a
 | |
|     * <code>ClassLoader</code> was provided.</p>
 | |
|     *
 | |
|     * <p>If no such resource exists or if it contains no bean the name is interpreted as a class name of
 | |
|     * which an instance is then created.</p>
 | |
|     *
 | |
|     * <p>If a <code>BeanContext</code> instance is available the created bean is added to it.</p>
 | |
|     *
 | |
|     * <p>If the created Bean is an <code>Applet</code> or subclass and an <code>AppletInitializer</code>
 | |
|     * instance is available the applet is initialized and afterwards activated using the initializer. Additionally
 | |
|     * every instantiated <code>Applet</code> bean is initialized using the {@link Applet.init} method.
 | |
|     * Furthermore every applet gets a default <code>AppletStub</code>. The <code>Applet</code>'s
 | |
|     * document base is the location of the ".ser" file if it was deserialized or the location of its class
 | |
|     * file if it was instantiated.</p>
 | |
|     *
 | |
|     * <p>A <code>ClassNotFoundException</code> is not only thrown when a class name was unknown
 | |
|     * but even when the class has public no-argument constructor
 | |
|     * (<code>IllegalAccessException</code> is wrapped) or an exception is thrown while
 | |
|     * invoking such a constructor (causing exception is wrapped).</p>
 | |
|     *
 | |
|     * @param cl ClassLoader to be used or <code>null</code> for the system classloader.
 | |
|     * @param beanName Name of a serialized bean or class name.
 | |
|     * @param beanContext Context to which the newly created Bean should be added.
 | |
|     * @param initializer The AppletInitializer which is used for initializing <code>Applet</code> beans.
 | |
|     * @return A newly created bean.
 | |
|     * @throws IOException If access of an IO resource failed.
 | |
|     * @throws ClassNotFoundException If the class name is not known or does not lead to a proper bean class.
 | |
|     */
 | |
|    public static Object instantiate(
 | |
|         ClassLoader cl,
 | |
|         String beanName,
 | |
|         BeanContext beanContext,
 | |
|         AppletInitializer initializer)
 | |
|         throws IOException, ClassNotFoundException
 | |
|    {
 | |
|         Object bean = null;
 | |
|         URL beanLocation = null;
 | |
|         URL classLocation = null;
 | |
| 
 | |
|         // Converts bean name into a resource name (eg. "a.b.c" -> "a/b/c").
 | |
|         String resourceName = beanName.replace('.', '/');
 | |
| 
 | |
|         /* Tries to get an input stream of the Bean, reading it as a system resource
 | |
|          * if no ClassLoader is present or as an application resource if a classloader
 | |
|          * is given.
 | |
|          */
 | |
|         beanLocation =
 | |
|             (cl == null)
 | |
|                 ? ClassLoader.getSystemResource(resourceName + ".ser")
 | |
|                 : cl.getResource(resourceName + ".ser");
 | |
| 
 | |
|         // Reads the serialized Bean from the returned URL.
 | |
|         if (beanLocation != null)
 | |
|         {
 | |
|             // Deserializes the bean instance.
 | |
|             ObjectInputStream ois =
 | |
|                 (cl == null)
 | |
|                     ? new ObjectInputStream(beanLocation.openStream())
 | |
|                     : new ClassLoaderObjectInputStream(
 | |
|                         beanLocation.openStream(),
 | |
|                         cl);
 | |
| 
 | |
|             bean = ois.readObject();
 | |
| 
 | |
|             /* Implementation note: The result of ObjectInputStream.readObject()
 | |
|             * may have been null at this point (its a valid value to deserialize)
 | |
|             * and we explicitly want to try instantiation in such a case
 | |
|             * (this is important for compatibility).
 | |
|             */
 | |
|         }
 | |
| 
 | |
|         // Instantiates the Bean using reflective instantiation if it has not been created yet.
 | |
|         if (bean == null)
 | |
|         {
 | |
|             // Makes sure that the deserialization was NOT done.
 | |
|             beanLocation = null;
 | |
| 
 | |
|             Class beanClass;
 | |
|             if (cl == null)
 | |
|             {
 | |
|                 beanClass = Class.forName(beanName);
 | |
|                 classLocation =
 | |
|                     ClassLoader.getSystemResource(resourceName + ".class");
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 beanClass = cl.loadClass(beanName);
 | |
|                 classLocation = cl.getResource(resourceName + ".class");
 | |
|             }
 | |
| 
 | |
|             // Instantiates and optionally registers the new bean.
 | |
|             try
 | |
|             {
 | |
|                 bean = beanClass.newInstance();
 | |
|             }
 | |
|             catch(Exception e) {
 | |
|                 /* Wraps all kinds of Exceptions in a ClassNotFoundException (this behavior
 | |
|                  * matches with official >= 1.5, this was different for <=1.4)
 | |
|                  */
 | |
|                 throw new ClassNotFoundException(null, e);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /* Applet beans are treated in the following way:
 | |
|          * - all AppletS get a default AppletStub
 | |
|          * - all AppletS are initialized using the AppletInitializer instance (if it is available)
 | |
|          * - as every other Bean Applets are added to a BeanContext if one is available
 | |
|          * - each instantiated Applet is initialized using Applet.init() (this is not done for deserialized ones)
 | |
|          * - finally AppletS get activated using the AppletInitializerS activate-Method
 | |
|          *
 | |
|          * The order of operations is important for compatibility.
 | |
|          */
 | |
|         Applet applet = null;
 | |
|         if (bean instanceof Applet)
 | |
|         {
 | |
|             // Makes a second instanceof call unneccessary (instanceof is expensive).
 | |
|             applet = (Applet) bean;
 | |
| 
 | |
|             /* The AppletStub's code and document base is set as follows:
 | |
|              * The code base is always the URL from where the class data originated
 | |
|              * (without the package name).
 | |
|              * If the Applet was deserialized the document base is the location of
 | |
|              * the serialized instance (usually the ".ser" file) otherwise its the URL
 | |
|              * from where the class data originated (usually the absolute directory
 | |
|              * location of the ".class" file).
 | |
|              */
 | |
|             applet.setStub(
 | |
|                 new DummyAppletStub(
 | |
|                     applet
 | |
|                         .getClass()
 | |
|                         .getProtectionDomain()
 | |
|                         .getCodeSource()
 | |
|                         .getLocation(),
 | |
|                     (beanLocation == null) ? classLocation : beanLocation));
 | |
| 
 | |
|             // Runs the Applet's initialization using an AppletInitializer.
 | |
|             if (initializer != null)
 | |
|             {
 | |
|                 initializer.initialize(applet, beanContext);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Adds the new bean to its BeanContext.
 | |
|         if (beanContext != null)
 | |
|         {
 | |
|             beanContext.add(bean);
 | |
|         }
 | |
| 
 | |
|         if (applet != null)
 | |
|         {
 | |
| 
 | |
|             // Initializes an instantiated (not deserialized) Applet using its own method.
 | |
|             if (beanLocation == null)
 | |
|             {
 | |
|                 applet.init();
 | |
|             }
 | |
| 
 | |
|             // Runs the Applet's activation using an AppletInitializer.
 | |
|             if (initializer != null)
 | |
|             {
 | |
|                 initializer.activate(applet);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return bean;
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Returns the Bean as a different class type.
 | |
|     * This should be used instead of casting to get a new
 | |
|     * type view of a Bean, because in the future there may
 | |
|     * be new types of Bean, even Beans spanning multiple
 | |
|     * Objects.
 | |
|     *
 | |
|     * @param bean the Bean to cast.
 | |
|     * @param newClass the Class to cast it to.
 | |
|     *
 | |
|     * @return the Bean as a new view, or if the operation
 | |
|     *         could not be performed, the Bean itself.
 | |
|     */
 | |
|    public static Object getInstanceOf(Object bean, Class<?> newClass)
 | |
|    {
 | |
|         return bean;
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Determines whether the Bean can be cast to a different
 | |
|     * class type.
 | |
|     * This should be used instead of instanceof to determine
 | |
|     * a Bean's castability, because in the future there may
 | |
|     * be new types of Bean, even Beans spanning multiple
 | |
|     * Objects.
 | |
|     *
 | |
|     * @param bean the Bean to cast.
 | |
|     * @param newBeanClass the Class to cast it to.
 | |
|     *
 | |
|     * @return whether the Bean can be cast to the class type
 | |
|     *         in question.
 | |
|     */
 | |
|    public static boolean isInstanceOf(Object bean, Class<?> newBeanClass)
 | |
|    {
 | |
|        return newBeanClass.isInstance(bean);
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Returns whether the GUI is available to use.
 | |
|     * <p>Defaults to true.</p>
 | |
|     *
 | |
|     * @return whether the GUI is available to use.
 | |
|     */
 | |
|    public static boolean isGuiAvailable()
 | |
|    {
 | |
|        return guiAvailable;
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Returns whether it is design time.  Design time means
 | |
|     * we are in a RAD tool.
 | |
|     * <p>Defaults to false.</p>
 | |
|     *
 | |
|     * @return whether it is design time.
 | |
|     */
 | |
|    public static boolean isDesignTime()
 | |
|    {
 | |
|        return designTime;
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Sets whether the GUI is available to use.
 | |
|     *
 | |
|     * @param guiAvailable whether the GUI is available to use.
 | |
|     */
 | |
|    public static void setGuiAvailable(boolean guiAvailable)
 | |
|        throws SecurityException
 | |
|    {
 | |
|         Beans.guiAvailable = guiAvailable;
 | |
|    }
 | |
| 
 | |
|    /**
 | |
|     * Sets whether it is design time.  Design time means we
 | |
|     * are in a RAD tool.
 | |
|     *
 | |
|     * @param designTime whether it is design time.
 | |
|     */
 | |
|    public static void setDesignTime(boolean designTime)
 | |
|        throws SecurityException
 | |
|    {
 | |
|        Beans.designTime = designTime;
 | |
|    }
 | |
| 
 | |
| }
 |