Source for java.beans.beancontext.BeanContext

   1: /* java.beans.beancontext.BeanContext
   2:    Copyright (C) 1999 Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10:  
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: 
  39: package java.beans.beancontext;
  40: 
  41: import java.beans.DesignMode;
  42: import java.beans.Visibility;
  43: import java.io.IOException;
  44: import java.io.InputStream;
  45: import java.net.URL;
  46: import java.util.Collection;
  47: 
  48: /**
  49:  * Acts as a container for sub-beans and as a sub-bean,
  50:  * so that an entire hierarchy of beans can be made up of
  51:  * <code>BeanContext</code>s.
  52:  * <P>
  53:  *
  54:  * Since I can't sprinkle the <code>Collections</code> interface
  55:  * documentation with special information for <code>BeanContext</code>
  56:  * implementors, I'll have to document special requirements for
  57:  * implementors of those functions here.
  58:  * <P>
  59:  *
  60:  * <code><strong>add()</strong></code> or <code>addAll()</code>:
  61:  * <br>
  62:  * <OL>
  63:  *   <LI>
  64:  *     May add any <code>Object</code> into the hierarchy as well as a
  65:  *     <code>BeanContextChild</code>, <code>BeanContext</code> or
  66:  *     <code>BeanContextProxy</code> object.
  67:  *     This way, any Bean can be in the hierarchy.
  68:  *   </LI>
  69:  *   <LI>
  70:  *     Must synchronize on <code>BeanContext.globalHierarchyLock</code>.
  71:  *   </LI>
  72:  *   <LI>
  73:  *     Don't add the <code>Object</code> if it's already there (only once
  74:  *     per <code>BeanContext</code>).
  75:  *   </LI>
  76:  *   <LI>
  77:  *     If it is a <code>BeanContextChild</code> implementor, call
  78:  *     <code>setBeanContext()</code> on it.  If it's a
  79:  *     <code>BeanContextProxy</code> implementor, call
  80:  *     <code>getBeanContextProxy().setBeanContext()</code> on it.
  81:  *     If <code>setBeanContext()</code> vetoes the change, back out
  82:  *     all changes so far and throw <code>IllegalStateException</code>.
  83:  *   </LI>
  84:  *   <LI>
  85:  *     If it (or its proxy) implements <code>Visibility</code>, call
  86:  *     <code>dontUseGui()</code> or <code>okToUseGui()</code> on it,
  87:  *     depending on whether you (the <code>BeanContext</code>) feel like
  88:  *     allowing it to use the GUI or not.
  89:  *   </LI>
  90:  *   <LI>
  91:  *     If it implements <code>BeanContextChild</code> or
  92:  *     <code>BeanContextProxy</code>, register yourself (the
  93:  *     <code>BeanContext</code>) as both a
  94:  *     <code>PropertyChangeListener</code> and
  95:  *     <code>VetoableChangeListener</code> on the "beanContext"
  96:  *     property (it may also add itself on any other properties it wishes
  97:  *     to).
  98:  *   </LI>
  99:  *   <LI>
 100:  *     If it is a listener or event source that you (the
 101:  *     <code>BeanContext</code>) are interested in, you may register
 102:  *     yourself to it or register it to you.
 103:  *   </LI>
 104:  *   <LI>
 105:  *     Fire a <code>java.beans.beancontext.BeanContextMembershipEvent</code>
 106:  *     before exiting.  <code>addAll()</code> should wait until everything
 107:  *     is done changing before firing the event (or events) so that if a
 108:  *     failure occurs, the backing-out process can proceed without any
 109:  *     events being fired at all.
 110:  *   </LI>
 111:  * </OL>
 112:  * <P>
 113:  *
 114:  * <code><strong>remove()</strong></code> or <code>removeAll()</code>:
 115:  * <br>
 116:  * <OL>
 117:  *   <LI>
 118:  *     Must synchronize on <code>BeanContext.globalHierarchyLock</code>.
 119:  *   </LI>
 120:  *   <LI>
 121:  *     If the specified <code>Object</code> is not a child of this
 122:  *     <code>BeanContext</code>, just exit without performing any actions.
 123:  *   </LI>
 124:  *   <LI>
 125:  *     Remove the <code>Object</code> from your collection of children.
 126:  *   </LI>
 127:  *   <LI>
 128:  *     If it is a <code>BeanContextChild</code> implementor, call
 129:  *     <code>setBeanContext(null)</code> on it.  If it's a
 130:  *     <code>BeanContextProxy</code> implementor, call
 131:  *     <code>getBeanContextProxy().setBeanContext(null)</code> on it.
 132:  *     If <code>setBeanContext()</code> vetoes the change, back out
 133:  *     all changes so far and throw <code>IllegalStateException</code>.
 134:  *   </LI>
 135:  *   <LI>
 136:  *     If you registered the <code>Object</code> to listen to you or
 137:  *     registered yourself as a listener on the <code>Object</code> during
 138:  *     <code>add()</code> or <code>addAll()</code>, undo the registration
 139:  *     bycalling the appropriate <code>removeListener()</code> method.
 140:  *   </LI>
 141:  *   <LI>
 142:  *     Fire a <code>java.beans.beancontext.BeanContextMembershipEvent</code>
 143:  *     before exiting.  <code>removeAll()</code> should wait until
 144:  *     everything is done changing before firing the event (or events) so
 145:  *     that if a failure occurs, the backing-out process can proceed
 146:  *     without any events being fired at all.
 147:  *   </LI>
 148:  * </OL>
 149:  * <P>
 150:  *
 151:  * <code>addAll()</code>, <code>removeAll()</code>,
 152:  * <code>retainAll()</code> and <code>clear()</code> do not need to be
 153:  * implemented, but may be if so desired.
 154:  * <P>
 155:  *
 156:  * Similarly, <code>Visibility</code> and <code>DesignMode</code> methods
 157:  * should propagate changed values to children that implement interfaces
 158:  * of the same name.
 159:  * <P>
 160:  *
 161:  * A hierarchy of beans is mainly useful so that different sets of beans
 162:  * can be established, each with their own set of resources.
 163:  *
 164:  * @author John Keiser
 165:  * @since JDK1.2
 166:  */
 167: 
 168: public interface BeanContext
 169:     extends Collection, BeanContextChild, Visibility, DesignMode {
 170: 
 171:     /**
 172:      * The global lock on changing any BeanContext hierarchy.
 173:      * It kinda sucks that there is only one lock, since there can be
 174:      * multiple hierarchies.  Oh well, I didn't design, I just code.
 175:      * <P>
 176:      *
 177:      * Methods that must (or do) synchronize on the global lock:
 178:      * <BR>
 179:      * <UL>
 180:      *   <LI>
 181:      *     Implementors of <CODE>BeanContext.add()</CODE> and <code>addAll()</code>
 182:      *   </LI>
 183:      * </UL>
 184:      * @fixme fill in the rest of the methods which use the global lock.
 185:      */
 186:     Object globalHierarchyLock = new Object();
 187: 
 188:     /** 
 189:      * Instantiate a Bean using this Bean's <code>ClassLoader</code>
 190:      * and this <code>BeanContext</code> as the parent.
 191:      * <P>
 192:      *
 193:      * This method exists mainly so that <code>BeanContext</code>
 194:      * implementations can perform extra actions on Beans that are
 195:      * created within them.
 196:      *
 197:      * @param beanName the name of the bean to instantiate
 198:      * @return the created Bean
 199:      *
 200:      * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String)
 201:      * @see java.beans.Beans#instantiate(java.lang.ClassLoader,java.lang.String,java.beans.beancontext.BeanContext)
 202:      * @exception IOException if there is an I/O problem during
 203:      *            instantiation.
 204:      * @exception ClassNotFoundException if a serialized Bean's class
 205:      *            is not found.
 206:      */
 207:     Object instantiateChild(String beanName)
 208:                         throws IOException,
 209:                                ClassNotFoundException;
 210: 
 211:     /**
 212:      * Get a resource.  The <code>BeanContext</code> will typically
 213:      * call <code>ClassLoader.getResource()</code>, but may do it any
 214:      * way it wants to.  This allows a <code>BeanContext</code> to
 215:      * have its own set of resources separate from the rest of the
 216:      * system.
 217:      * <P>
 218:      *
 219:      * Beans should call this method on their parent rather than the
 220:      * associated <code>ClassLoader</code> method.
 221:      * <P>
 222:      *
 223:      * I am assuming, but am not entirely sure, that if a
 224:      * <code>BeanContext</code> cannot find a resource, its
 225:      * responsibility is to call the <code>getResource</code> method
 226:      * of its parent <code>BeanContext</code>.
 227:      *
 228:      * @return a URL to the requested resource.
 229:      * @param resourceName the name of the resource requested.
 230:      * @param requestor a reference to the child requesting the resource.
 231:      * @see java.lang.ClassLoader#getResource(java.lang.String)
 232:      */
 233:     URL getResource(String resourceName, BeanContextChild requestor);
 234: 
 235:     /**
 236:      * Get a resource as a stream.  The <code>BeanContext</code> will
 237:      * typically call <code>ClassLoader.getResourceAsStream()</code>,
 238:      * but may do it any way it wants to.  This allows a
 239:      * <code>BeanContext</code>'s children to have their own set of
 240:      * resources separate from the rest of the system.
 241:      * <P>
 242:      *
 243:      * Beans should call this method on their parent rather than the
 244:      * associated <code>ClassLoader</code> method.
 245:      * <P>
 246:      *
 247:      * I am assuming, but am not entirely sure, that if a
 248:      * <code>BeanContext</code> cannot find a resource, its
 249:      * responsibility is to call the <code>getResourceAsStream</code>
 250:      * method of its parent <code>BeanContext</code>.
 251:      *
 252:      * @return the requested resource as a stream.
 253:      * @param resourceName the name of the resource requested.
 254:      * @param requestor a reference to the child requesting the resource.
 255:      * @see java.lang.ClassLoader#getResourceAsStream(java.lang.String)
 256:      */
 257:     InputStream getResourceAsStream(String resourceName, BeanContextChild requestor);
 258: 
 259:     /**
 260:      * Add a listener on changes to the membership of this
 261:      * <code>BeanContext</code> object.
 262:      * @param listener the listener to add.
 263:      */
 264:     void addBeanContextMembershipListener(BeanContextMembershipListener listener);
 265: 
 266:     /**
 267:      * Remove a listener on changes to the membership of this
 268:      * <code>BeanContext</code> object.
 269:      * @param listener the listener to remove.
 270:      */
 271:     void removeBeanContextMembershipListener(BeanContextMembershipListener listener);
 272: }