Frames | No Frames |
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: }