/* java.beans.beancontext.BeanContext
   Copyright (C) 1999 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.beancontext;

import java.beans.DesignMode;
import java.beans.Visibility;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;

/**
 * Acts as a container for sub-beans and as a sub-bean,
 * so that an entire hierarchy of beans can be made up of
 * <code>BeanContext</code>s.
 * <P>
 *
 * Since I can't sprinkle the <code>Collections</code> interface
 * documentation with special information for <code>BeanContext</code>
 * implementors, I'll have to document special requirements for
 * implementors of those functions here.
 * <P>
 *
 * <code><strong>add()</strong></code> or <code>addAll()</code>:
 * <br>
 * <OL>
 *   <LI>
 *     May add any <code>Object</code> into the hierarchy as well as a
 *     <code>BeanContextChild</code>, <code>BeanContext</code> or
 *     <code>BeanContextProxy</code> object.
 *     This way, any Bean can be in the hierarchy.
 *   </LI>
 *   <LI>
 *     Must synchronize on <code>BeanContext.globalHierarchyLock</code>.
 *   </LI>
 *   <LI>
 *     Don't add the <code>Object</code> if it's already there (only once
 *     per <code>BeanContext</code>).
 *   </LI>
 *   <LI>
 *     If it is a <code>BeanContextChild</code> implementor, call
 *     <code>setBeanContext()</code> on it.  If it's a
 *     <code>BeanContextProxy</code> implementor, call
 *     <code>getBeanContextProxy().setBeanContext()</code> on it.
 *     If <code>setBeanContext()</code> vetoes the change, back out
 *     all changes so far and throw <code>IllegalStateException</code>.
 *   </LI>
 *   <LI>
 *     If it (or its proxy) implements <code>Visibility</code>, call
 *     <code>dontUseGui()</code> or <code>okToUseGui()</code> on it,
 *     depending on whether you (the <code>BeanContext</code>) feel like
 *     allowing it to use the GUI or not.
 *   </LI>
 *   <LI>
 *     If it implements <code>BeanContextChild</code> or
 *     <code>BeanContextProxy</code>, register yourself (the
 *     <code>BeanContext</code>) as both a
 *     <code>PropertyChangeListener</code> and
 *     <code>VetoableChangeListener</code> on the "beanContext"
 *     property (it may also add itself on any other properties it wishes
 *     to).
 *   </LI>
 *   <LI>
 *     If it is a listener or event source that you (the
 *     <code>BeanContext</code>) are interested in, you may register
 *     yourself to it or register it to you.
 *   </LI>
 *   <LI>
 *     Fire a <code>java.beans.beancontext.BeanContextMembershipEvent</code>
 *     before exiting.  <code>addAll()</code> should wait until everything
 *     is done changing before firing the event (or events) so that if a
 *     failure occurs, the backing-out process can proceed without any
 *     events being fired at all.
 *   </LI>
 * </OL>
 * <P>
 *
 * <code><strong>remove()</strong></code> or <code>removeAll()</code>:
 * <br>
 * <OL>
 *   <LI>
 *     Must synchronize on <code>BeanContext.globalHierarchyLock</code>.
 *   </LI>
 *   <LI>
 *     If the specified <code>Object</code> is not a child of this
 *     <code>BeanContext</code>, just exit without performing any actions.
 *   </LI>
 *   <LI>
 *     Remove the <code>Object</code> from your collection of children.
 *   </LI>
 *   <LI>
 *     If it is a <code>BeanContextChild</code> implementor, call
 *     <code>setBeanContext(null)</code> on it.  If it's a
 *     <code>BeanContextProxy</code> implementor, call
 *     <code>getBeanContextProxy().setBeanContext(null)</code> on it.
 *     If <code>setBeanContext()</code> vetoes the change, back out
 *     all changes so far and throw <code>IllegalStateException</code>.
 *   </LI>
 *   <LI>
 *     If you registered the <code>Object</code> to listen to you or
 *     registered yourself as a listener on the <code>Object</code> during
 *     <code>add()</code> or <code>addAll()</code>, undo the registration
 *     bycalling the appropriate <code>removeListener()</code> method.
 *   </LI>
 *   <LI>
 *     Fire a <code>java.beans.beancontext.BeanContextMembershipEvent</code>
 *     before exiting.  <code>removeAll()</code> should wait until
 *     everything is done changing before firing the event (or events) so
 *     that if a failure occurs, the backing-out process can proceed
 *     without any events being fired at all.
 *   </LI>
 * </OL>
 * <P>
 *
 * <code>addAll()</code>, <code>removeAll()</code>,
 * <code>retainAll()</code> and <code>clear()</code> do not need to be
 * implemented, but may be if so desired.
 * <P>
 *
 * Similarly, <code>Visibility</code> and <code>DesignMode</code> methods
 * should propagate changed values to children that implement interfaces
 * of the same name.
 * <P>
 *
 * A hierarchy of beans is mainly useful so that different sets of beans
 * can be established, each with their own set of resources.
 *
 * @author John Keiser
 * @since JDK1.2
 */

public interface BeanContext
	extends Collection, BeanContextChild, Visibility, DesignMode {

	/**
	 * The global lock on changing any BeanContext hierarchy.
	 * It kinda sucks that there is only one lock, since there can be
	 * multiple hierarchies.  Oh well, I didn't design, I just code.
	 * <P>
	 *
	 * Methods that must (or do) synchronize on the global lock:
	 * <BR>
	 * <UL>
	 *   <LI>
	 *     Implementors of <CODE>BeanContext.add()</CODE> and <code>addAll()</code>
	 *   </LI>
	 * </UL>
	 * @fixme fill in the rest of the methods which use the global lock.
	 */
	Object globalHierarchyLock = new Object();

	/** 
	 * Instantiate a Bean using this Bean's <code>ClassLoader</code>
	 * and this <code>BeanContext</code> as the parent.
	 * <P>
	 *
	 * This method exists mainly so that <code>BeanContext</code>
	 * implementations can perform extra actions on Beans that are
	 * created within them.
	 *
	 * @param beanName the name of the bean to instantiate
	 * @return the created Bean
	 *
	 * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String)
	 * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String,java.beans.beancontext.BeanContext)
	 * @exception IOException if there is an I/O problem during
	 *            instantiation.
	 * @exception ClassNotFoundException if a serialized Bean's class
	 *            is not found.
	 */
	Object instantiateChild(String beanName)
                        throws IOException,
                               ClassNotFoundException;

	/**
	 * Get a resource.  The <code>BeanContext</code> will typically
	 * call <code>ClassLoader.getResource()</code>, but may do it any
	 * way it wants to.  This allows a <code>BeanContext</code> to
	 * have its own set of resources separate from the rest of the
	 * system.
	 * <P>
	 *
	 * Beans should call this method on their parent rather than the
	 * associated <code>ClassLoader</code> method.
	 * <P>
	 *
	 * I am assuming, but am not entirely sure, that if a
	 * <code>BeanContext</code> cannot find a resource, its
	 * responsibility is to call the <code>getResource</code> method
	 * of its parent <code>BeanContext</code>.
	 *
	 * @return a URL to the requested resource.
	 * @param resourceName the name of the resource requested.
	 * @param requestor a reference to the child requesting the resource.
	 * @see java.lang.ClassLoader#getResource(java.lang.String)
	 */
	URL getResource(String resourceName, BeanContextChild requestor);

	/**
	 * Get a resource as a stream.  The <code>BeanContext</code> will
	 * typically call <code>ClassLoader.getResourceAsStream()</code>,
	 * but may do it any way it wants to.  This allows a
	 * <code>BeanContext</code>'s children to have their own set of
	 * resources separate from the rest of the system.
	 * <P>
	 *
	 * Beans should call this method on their parent rather than the
	 * associated <code>ClassLoader</code> method.
	 * <P>
	 *
	 * I am assuming, but am not entirely sure, that if a
	 * <code>BeanContext</code> cannot find a resource, its
	 * responsibility is to call the <code>getResourceAsStream</code>
	 * method of its parent <code>BeanContext</code>.
	 *
	 * @return the requested resource as a stream.
	 * @param resourceName the name of the resource requested.
	 * @param requestor a reference to the child requesting the resource.
	 * @see java.lang.ClassLoader#getResourceAsStream(java.lang.String)
	 */
	InputStream getResourceAsStream(String resourceName, BeanContextChild requestor);

	/**
	 * Add a listener on changes to the membership of this
	 * <code>BeanContext</code> object.
	 * @param listener the listener to add.
	 */
	void addBeanContextMembershipListener(BeanContextMembershipListener listener);

	/**
	 * Remove a listener on changes to the membership of this
	 * <code>BeanContext</code> object.
	 * @param listener the listener to remove.
	 */
	void removeBeanContextMembershipListener(BeanContextMembershipListener listener);
}
