/* * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.beans.beancontext; import java.awt.Component;import java.awt.Container; import java.beans.Beans;import java.beans.AppletInitializer; import java.beans.DesignMode; import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeSupport; import java.beans.VetoableChangeListener;import java.beans.VetoableChangeSupport;import java.beans.PropertyVetoException; import java.beans.Visibility; import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable; import java.net.URL; import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Locale;import java.util.Map; /** * This helper class provides a utility implementation of the * java.beans.beancontext.BeanContext interface. * </p> * <p> * Since this class directly implements the BeanContext interface, the class * can, and is intended to be used either by subclassing this implementation, * or via ad-hoc delegation of an instance of this class from another. * </p> * * @author Laurence P. G. Cable * @since 1.2 */public class BeanContextSupport extends BeanContextChildSupport implements BeanContext, Serializable, PropertyChangeListener, VetoableChangeListener { // Fix for bug 4282900 to pass JCK regression test static final long serialVersionUID = -4879613978649577204L; /** * * Construct a BeanContextSupport instance * * * @param peer The peer <tt>BeanContext</tt> we are * supplying an implementation for, * or <tt>null</tt> * if this object is its own peer * @param lcle The current Locale for this BeanContext. If * <tt>lcle</tt> is <tt>null</tt>, the default locale * is assigned to the <tt>BeanContext</tt> instance. * @param dTime The initial state, * <tt>true</tt> if in design mode, * <tt>false</tt> if runtime. * @param visible The initial visibility. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle, boolean dTime, boolean visible) { super(peer); locale = lcle != null ? lcle : Locale.getDefault(); designTime = dTime; okToUseGui = visible; initialize(); } /** * Create an instance using the specified Locale and design mode. * * @param peer The peer <tt>BeanContext</tt> we * are supplying an implementation for, * or <tt>null</tt> if this object is its own peer * @param lcle The current Locale for this <tt>BeanContext</tt>. If * <tt>lcle</tt> is <tt>null</tt>, the default locale * is assigned to the <tt>BeanContext</tt> instance. * @param dtime The initial state, <tt>true</tt> * if in design mode, * <tt>false</tt> if runtime. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle, boolean dtime) { this (peer, lcle, dtime, true); } /** * Create an instance using the specified locale * * @param peer The peer BeanContext we are * supplying an implementation for, * or <tt>null</tt> if this object * is its own peer * @param lcle The current Locale for this * <tt>BeanContext</tt>. If * <tt>lcle</tt> is <tt>null</tt>, * the default locale * is assigned to the <tt>BeanContext</tt> * instance. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle) { this (peer, lcle, false, true); } /** * Create an instance using with a default locale * * @param peer The peer <tt>BeanContext</tt> we are * supplying an implementation for, * or <tt>null</tt> if this object * is its own peer */ public BeanContextSupport(BeanContext peer) { this (peer, null, false, true); } /** * Create an instance that is not a delegate of another object */ public BeanContextSupport() { this (null, null, false, true); } /** * Gets the instance of <tt>BeanContext</tt> that * this object is providing the implementation for. * @return the BeanContext instance */ public BeanContext getBeanContextPeer() { return (BeanContext)getBeanContextChildPeer(); } /** * <p> * The instantiateChild method is a convenience hook * in BeanContext to simplify * the task of instantiating a Bean, nested, * into a <tt>BeanContext</tt>. * </p> * <p> * The semantics of the beanName parameter are defined by java.beans.Beans.instantate. * </p> * * @param beanName the name of the Bean to instantiate within this BeanContext * @throws IOException if there is an I/O error when the bean is being deserialized * @throws ClassNotFoundException if the class * identified by the beanName parameter is not found * @return the new object */ public Object instantiateChild(String beanName) throws IOException, ClassNotFoundException { BeanContext bc = getBeanContextPeer(); return Beans.instantiate(bc.getClass().getClassLoader(), beanName, bc); } /** * Gets the number of children currently nested in * this BeanContext. * * @return number of children */ public int size() { synchronized(children) { return children.size(); } } /** * Reports whether or not this * <tt>BeanContext</tt> is empty. * A <tt>BeanContext</tt> is considered * empty when it contains zero * nested children. * @return if there are not children */ public boolean isEmpty() { synchronized(children) { return children.isEmpty(); } } /** * Determines whether or not the specified object * is currently a child of this <tt>BeanContext</tt>. * @param o the Object in question * @return if this object is a child */ public boolean contains(Object o) { synchronized(children) { return children.containsKey(o); } } /** * Determines whether or not the specified object * is currently a child of this <tt>BeanContext</tt>. * @param o the Object in question * @return if this object is a child */ public boolean containsKey(Object o) { synchronized(children) { return children.containsKey(o); } } /** * Gets all JavaBean or <tt>BeanContext</tt> instances * currently nested in this <tt>BeanContext</tt>. * @return an <tt>Iterator</tt> of the nested children */ public Iterator iterator() { synchronized(children) { return new BCSIterator(children.keySet().iterator()); } } /** * Gets all JavaBean or <tt>BeanContext</tt> * instances currently nested in this BeanContext. */ public Object[] toArray() { synchronized(children) { return children.keySet().toArray(); } } /** * Gets an array containing all children of * this <tt>BeanContext</tt> that match * the types contained in arry. * @param arry The array of object * types that are of interest. * @return an array of children */ public Object[] toArray(Object[] arry) { synchronized(children) { return children.keySet().toArray(arry); } } /************************************************************************/ /** * protected final subclass that encapsulates an iterator but implements * a noop remove() method. */ protected static final class BCSIterator implements Iterator { BCSIterator(Iterator i) { super(); src = i; } public boolean hasNext() { return src.hasNext(); } public Object next() { return src.next(); } public void remove() { /* do nothing */ } private Iterator src; } /************************************************************************/ /* * protected nested class containing per child information, an instance * of which is associated with each child in the "children" hashtable. * subclasses can extend this class to include their own per-child state. * * Note that this 'value' is serialized with the corresponding child 'key' * when the BeanContextSupport is serialized. */ protected class BCSChild implements Serializable { private static final long serialVersionUID = -5815286101609939109L; BCSChild(Object bcc, Object peer) { super(); child = bcc; proxyPeer = peer; } Object getChild() { return child; } void setRemovePending(boolean v) { removePending = v; } boolean isRemovePending() { return removePending; } boolean isProxyPeer() { return proxyPeer != null; } Object getProxyPeer() { return proxyPeer; } /* * fields */ private Object child; private Object proxyPeer; private transient boolean removePending; } /** * <p> * Subclasses can override this method to insert their own subclass * of Child without having to override add() or the other Collection * methods that add children to the set. * </p> * * @param targetChild the child to create the Child on behalf of * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy */ protected BCSChild createBCSChild(Object targetChild, Object peer) { return new BCSChild(targetChild, peer); } /************************************************************************/ /** * Adds/nests a child within this <tt>BeanContext</tt>. * <p> * Invoked as a side effect of java.beans.Beans.instantiate(). * If the child object is not valid for adding then this method * throws an IllegalStateException. * </p> * * * @param targetChild The child objects to nest * within this <tt>BeanContext</tt> * @return true if the child was added successfully. * @see #validatePendingAdd */ public boolean add(Object targetChild) { if (targetChild == null) throw new IllegalArgumentException(); // The specification requires that we do nothing if the child // is already nested herein. if (children.containsKey(targetChild)) return false; // test before locking synchronized(BeanContext.globalHierarchyLock) { if (children.containsKey(targetChild)) return false; // check again if (!validatePendingAdd(targetChild)) { throw new IllegalStateException(); } // The specification requires that we invoke setBeanContext() on the // newly added child if it implements the java.beans.beancontext.BeanContextChild interface BeanContextChild cbcc = getChildBeanContextChild(targetChild); BeanContextChild bccp = null; synchronized(targetChild) { if (targetChild instanceof BeanContextProxy) { bccp = ((BeanContextProxy)targetChild).getBeanContextProxy(); if (bccp == null) throw new NullPointerException("BeanContextPeer.getBeanContextProxy()"); } BCSChild bcsc = createBCSChild(targetChild, bccp); BCSChild pbcsc = null; synchronized (children) { children.put(targetChild, bcsc); if (bccp != null) children.put(bccp, pbcsc = createBCSChild(bccp, targetChild)); } if (cbcc != null) synchronized(cbcc) { try { cbcc.setBeanContext(getBeanContextPeer()); } catch (PropertyVetoException pve) { synchronized (children) { children.remove(targetChild); if (bccp != null) children.remove(bccp); } throw new IllegalStateException(); } cbcc.addPropertyChangeListener("beanContext", childPCL); cbcc.addVetoableChangeListener("beanContext", childVCL); } Visibility v = getChildVisibility(targetChild); if (v != null) { if (okToUseGui) v.okToUseGui(); else v.dontUseGui(); } if (getChildSerializable(targetChild) != null) serializable++; childJustAddedHook(targetChild, bcsc); if (bccp != null) { v = getChildVisibility(bccp); if (v != null) { if (okToUseGui) v.okToUseGui(); else v.dontUseGui(); } if (getChildSerializable(bccp) != null) serializable++; childJustAddedHook(bccp, pbcsc); } } // The specification requires that we fire a notification of the change fireChildrenAdded(new BeanContextMembershipEvent(getBeanContextPeer(), bccp == null ? new Object[] { targetChild } : new Object[] { targetChild, bccp } )); } return true; } /** * Removes a child from this BeanContext. If the child object is not * for adding then this method throws an IllegalStateException. * @param targetChild The child objects to remove * @see #validatePendingRemove */ public boolean remove(Object targetChild) { return remove(targetChild, true); } /** * internal remove used when removal caused by * unexpected <tt>setBeanContext</tt> or * by <tt>remove()</tt> invocation. * @param targetChild the JavaBean, BeanContext, or Object to be removed * @param callChildSetBC used to indicate that * the child should be notified that it is no * longer nested in this <tt>BeanContext</tt>. */ protected boolean remove(Object targetChild, boolean callChildSetBC) { if (targetChild == null) throw new IllegalArgumentException(); synchronized(BeanContext.globalHierarchyLock) {Lines 1–500 of 1393. Load more
/* * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.beans.beancontext; import java.awt.Component; import java.awt.Container; import java.beans.Beans; import java.beans.AppletInitializer; import java.beans.DesignMode; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.beans.VetoableChangeListener; import java.beans.VetoableChangeSupport; import java.beans.PropertyVetoException; import java.beans.Visibility; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Locale; import java.util.Map; /** * This helper class provides a utility implementation of the * java.beans.beancontext.BeanContext interface. * </p> * <p> * Since this class directly implements the BeanContext interface, the class * can, and is intended to be used either by subclassing this implementation, * or via ad-hoc delegation of an instance of this class from another. * </p> * * @author Laurence P. G. Cable * @since 1.2 */ public class BeanContextSupport extends BeanContextChildSupport implements BeanContext, Serializable, PropertyChangeListener, VetoableChangeListener { // Fix for bug 4282900 to pass JCK regression test static final long serialVersionUID = -4879613978649577204L; /** * * Construct a BeanContextSupport instance * * * @param peer The peer <tt>BeanContext</tt> we are * supplying an implementation for, * or <tt>null</tt> * if this object is its own peer * @param lcle The current Locale for this BeanContext. If * <tt>lcle</tt> is <tt>null</tt>, the default locale * is assigned to the <tt>BeanContext</tt> instance. * @param dTime The initial state, * <tt>true</tt> if in design mode, * <tt>false</tt> if runtime. * @param visible The initial visibility. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle, boolean dTime, boolean visible) { super(peer); locale = lcle != null ? lcle : Locale.getDefault(); designTime = dTime; okToUseGui = visible; initialize(); } /** * Create an instance using the specified Locale and design mode. * * @param peer The peer <tt>BeanContext</tt> we * are supplying an implementation for, * or <tt>null</tt> if this object is its own peer * @param lcle The current Locale for this <tt>BeanContext</tt>. If * <tt>lcle</tt> is <tt>null</tt>, the default locale * is assigned to the <tt>BeanContext</tt> instance. * @param dtime The initial state, <tt>true</tt> * if in design mode, * <tt>false</tt> if runtime. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle, boolean dtime) { this (peer, lcle, dtime, true); } /** * Create an instance using the specified locale * * @param peer The peer BeanContext we are * supplying an implementation for, * or <tt>null</tt> if this object * is its own peer * @param lcle The current Locale for this * <tt>BeanContext</tt>. If * <tt>lcle</tt> is <tt>null</tt>, * the default locale * is assigned to the <tt>BeanContext</tt> * instance. * @see java.util.Locale#getDefault() * @see java.util.Locale#setDefault(java.util.Locale) */ public BeanContextSupport(BeanContext peer, Locale lcle) { this (peer, lcle, false, true); } /** * Create an instance using with a default locale * * @param peer The peer <tt>BeanContext</tt> we are * supplying an implementation for, * or <tt>null</tt> if this object * is its own peer */ public BeanContextSupport(BeanContext peer) { this (peer, null, false, true); } /** * Create an instance that is not a delegate of another object */ public BeanContextSupport() { this (null, null, false, true); } /** * Gets the instance of <tt>BeanContext</tt> that * this object is providing the implementation for. * @return the BeanContext instance */ public BeanContext getBeanContextPeer() { return (BeanContext)getBeanContextChildPeer(); } /** * <p> * The instantiateChild method is a convenience hook * in BeanContext to simplify * the task of instantiating a Bean, nested, * into a <tt>BeanContext</tt>. * </p> * <p> * The semantics of the beanName parameter are defined by java.beans.Beans.instantate. * </p> * * @param beanName the name of the Bean to instantiate within this BeanContext * @throws IOException if there is an I/O error when the bean is being deserialized * @throws ClassNotFoundException if the class * identified by the beanName parameter is not found * @return the new object */ public Object instantiateChild(String beanName) throws IOException, ClassNotFoundException { BeanContext bc = getBeanContextPeer(); return Beans.instantiate(bc.getClass().getClassLoader(), beanName, bc); } /** * Gets the number of children currently nested in * this BeanContext. * * @return number of children */ public int size() { synchronized(children) { return children.size(); } } /** * Reports whether or not this * <tt>BeanContext</tt> is empty. * A <tt>BeanContext</tt> is considered * empty when it contains zero * nested children. * @return if there are not children */ public boolean isEmpty() { synchronized(children) { return children.isEmpty(); } } /** * Determines whether or not the specified object * is currently a child of this <tt>BeanContext</tt>. * @param o the Object in question * @return if this object is a child */ public boolean contains(Object o) { synchronized(children) { return children.containsKey(o); } } /** * Determines whether or not the specified object * is currently a child of this <tt>BeanContext</tt>. * @param o the Object in question * @return if this object is a child */ public boolean containsKey(Object o) { synchronized(children) { return children.containsKey(o); } } /** * Gets all JavaBean or <tt>BeanContext</tt> instances * currently nested in this <tt>BeanContext</tt>. * @return an <tt>Iterator</tt> of the nested children */ public Iterator iterator() { synchronized(children) { return new BCSIterator(children.keySet().iterator()); } } /** * Gets all JavaBean or <tt>BeanContext</tt> * instances currently nested in this BeanContext. */ public Object[] toArray() { synchronized(children) { return children.keySet().toArray(); } } /** * Gets an array containing all children of * this <tt>BeanContext</tt> that match * the types contained in arry. * @param arry The array of object * types that are of interest. * @return an array of children */ public Object[] toArray(Object[] arry) { synchronized(children) { return children.keySet().toArray(arry); } } /************************************************************************/ /** * protected final subclass that encapsulates an iterator but implements * a noop remove() method. */ protected static final class BCSIterator implements Iterator { BCSIterator(Iterator i) { super(); src = i; } public boolean hasNext() { return src.hasNext(); } public Object next() { return src.next(); } public void remove() { /* do nothing */ } private Iterator src; } /************************************************************************/ /* * protected nested class containing per child information, an instance * of which is associated with each child in the "children" hashtable. * subclasses can extend this class to include their own per-child state. * * Note that this 'value' is serialized with the corresponding child 'key' * when the BeanContextSupport is serialized. */ protected class BCSChild implements Serializable { private static final long serialVersionUID = -5815286101609939109L; BCSChild(Object bcc, Object peer) { super(); child = bcc; proxyPeer = peer; } Object getChild() { return child; } void setRemovePending(boolean v) { removePending = v; } boolean isRemovePending() { return removePending; } boolean isProxyPeer() { return proxyPeer != null; } Object getProxyPeer() { return proxyPeer; } /* * fields */ private Object child; private Object proxyPeer; private transient boolean removePending; } /** * <p> * Subclasses can override this method to insert their own subclass * of Child without having to override add() or the other Collection * methods that add children to the set. * </p> * * @param targetChild the child to create the Child on behalf of * @param peer the peer if the tragetChild and the peer are related by an implementation of BeanContextProxy */ protected BCSChild createBCSChild(Object targetChild, Object peer) { return new BCSChild(targetChild, peer); } /************************************************************************/ /** * Adds/nests a child within this <tt>BeanContext</tt>. * <p> * Invoked as a side effect of java.beans.Beans.instantiate(). * If the child object is not valid for adding then this method * throws an IllegalStateException. * </p> * * * @param targetChild The child objects to nest * within this <tt>BeanContext</tt> * @return true if the child was added successfully. * @see #validatePendingAdd */ public boolean add(Object targetChild) { if (targetChild == null) throw new IllegalArgumentException(); // The specification requires that we do nothing if the child // is already nested herein. if (children.containsKey(targetChild)) return false; // test before locking synchronized(BeanContext.globalHierarchyLock) { if (children.containsKey(targetChild)) return false; // check again if (!validatePendingAdd(targetChild)) { throw new IllegalStateException(); } // The specification requires that we invoke setBeanContext() on the // newly added child if it implements the java.beans.beancontext.BeanContextChild interface BeanContextChild cbcc = getChildBeanContextChild(targetChild); BeanContextChild bccp = null; synchronized(targetChild) { if (targetChild instanceof BeanContextProxy) { bccp = ((BeanContextProxy)targetChild).getBeanContextProxy(); if (bccp == null) throw new NullPointerException("BeanContextPeer.getBeanContextProxy()"); } BCSChild bcsc = createBCSChild(targetChild, bccp); BCSChild pbcsc = null; synchronized (children) { children.put(targetChild, bcsc); if (bccp != null) children.put(bccp, pbcsc = createBCSChild(bccp, targetChild)); } if (cbcc != null) synchronized(cbcc) { try { cbcc.setBeanContext(getBeanContextPeer()); } catch (PropertyVetoException pve) { synchronized (children) { children.remove(targetChild); if (bccp != null) children.remove(bccp); } throw new IllegalStateException(); } cbcc.addPropertyChangeListener("beanContext", childPCL); cbcc.addVetoableChangeListener("beanContext", childVCL); } Visibility v = getChildVisibility(targetChild); if (v != null) { if (okToUseGui) v.okToUseGui(); else v.dontUseGui(); } if (getChildSerializable(targetChild) != null) serializable++; childJustAddedHook(targetChild, bcsc); if (bccp != null) { v = getChildVisibility(bccp); if (v != null) { if (okToUseGui) v.okToUseGui(); else v.dontUseGui(); } if (getChildSerializable(bccp) != null) serializable++; childJustAddedHook(bccp, pbcsc); } } // The specification requires that we fire a notification of the change fireChildrenAdded(new BeanContextMembershipEvent(getBeanContextPeer(), bccp == null ? new Object[] { targetChild } : new Object[] { targetChild, bccp } )); } return true; } /** * Removes a child from this BeanContext. If the child object is not * for adding then this method throws an IllegalStateException. * @param targetChild The child objects to remove * @see #validatePendingRemove */ public boolean remove(Object targetChild) { return remove(targetChild, true); } /** * internal remove used when removal caused by * unexpected <tt>setBeanContext</tt> or * by <tt>remove()</tt> invocation. * @param targetChild the JavaBean, BeanContext, or Object to be removed * @param callChildSetBC used to indicate that * the child should be notified that it is no * longer nested in this <tt>BeanContext</tt>. */ protected boolean remove(Object targetChild, boolean callChildSetBC) { if (targetChild == null) throw new IllegalArgumentException(); synchronized(BeanContext.globalHierarchyLock) {