Jumbo patch:

* Imported beans and serialization
* Updated IA-64 port
* Miscellaneous bug fixes

From-SVN: r34028
This commit is contained in:
Tom Tromey
2000-05-19 17:55:34 +00:00
parent 021c89ed68
commit 6c80c45e30
125 changed files with 18458 additions and 560 deletions
@@ -0,0 +1,261 @@
/* 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.Collection;
import java.beans.Visibility;
import java.beans.DesignMode;
import java.net.URL;
import java.io.InputStream;
import java.io.IOException;
/**
* 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.
*/
public static final 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.lang.BeanContext)
* @exception IOException if there is an I/O problem during
* instantiation.
* @exception ClassNotFoundException if a serialized Bean's class
* is not found.
*/
public 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)
*/
public 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)
*/
public 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.
*/
public void addBeanContextMembershipListener(BeanContextMembershipListener listener);
/**
* Remove a listener on changes to the membership of this
* <code>BeanContext</code> object.
* @param listener the listener to remove.
*/
public void removeBeanContextMembershipListener(BeanContextMembershipListener listener);
}
@@ -0,0 +1,162 @@
/* java.beans.beancontext.BeanContextChild
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.beans.PropertyChangeListener;
import java.beans.VetoableChangeListener;
import java.beans.PropertyVetoException;
/**
* Beans implement this to get information about the execution environment and its services and to be placed in the hierarchy.
* <P>
*
* The difference between a <code>BeanContext</code> and a
* <code>BeanContextChild</code>, mainly, is that a
* <code>BeanContext</code> may be a parent.
* <P>
*
* <code>BeanContextChild</code> instances will be serialized at some
* point in their life, but you need to make sure your bean context does
* not contain a serializable reference (directly or indirectly) to the
* parent <code>BeanContext</code>, to any of the other
* <code>BeanContext</code>s in the tree, or to any resources obtained
* via the <code>BeanContextServices</code> interface. One way to do this
* is to mark any fields that contain such references as
* <code>transient</code>. Another way is to use a custom serializer.
* <P>
*
* If you do not do this, when the <code>BeanContext</code> is serialized,
* all the other <code>BeanContext</code>s and other unnecessary things
* will be serialized along with it.
* <P>
*
* Before dying, a <code>BeanContextChild</code> should call
* <code>getBeanContext().remove(this)</code> to detach from the
* hierarchy and exit cleanly.
*
* @author John Keiser
* @since JDK1.2
* @see java.beans.beancontext.BeanContext
*/
public interface BeanContextChild {
/**
* Set the parent <code>BeanContext</code>.
* <P>
*
* This method is called from <code>BeanContext.add()</code> and
* should not be called directly.
* <P>
*
* When this Object is being added to a new BeanContext or moved
* from an old one, a non-null value will be passed in.
* <P>
*
* When this Object is being removed from the current
* <code>BeanContext</code>, <code>setBeanContext()</code> will
* receive the parameter <code>null</code>.
* <P>
*
* When being removed from the current <code>BeanContext</code>,
* it is the <code>BeanContextChild</code>'s responsibility to
* release all services it has obtained.
* <P>
*
* This change should generate <code>PropertyChangeEvent</code>
* and <code>VetoableChangeEvent</code>s with the property name
* "beanContext". If the change is vetoed, it must re-throw the
* exception and not change anything. In this way, the parent
* <code>BeanContextChild</code>, who has registered himself with
* you, will have a chance to remove this child from its
* collection.
* <P>
*
* If the Bean does not wish to change the parent or be removed
* from one, it may throw the <code>PropertyVetoException</code>.
* If you veto a <code>setBeanContext(null)</code> call, then you
* should try your hardest to remedy whatever problem is keeping
* you from being removed from the <code>BeanContext</code> so
* that you can <em>not</em> veto it the next time.
* Otherwise, nasty pathological recursion stuff could occur in
* certain situations.
* <P>
*
* If you do veto the change, you must first back out any changes
* you made prior to the veto. Best not to make any such changes
* prior to the veto in the first place.
* <P>
*
* This method is called from <code>BeanContext.add()</code> and
* should not be called directly.
*
* @param parent the new parent for the <code>BeanContextChild</code>,
* or <code>null</code> to signify removal from a tree.
* @exception PropertyVetoException if the
* <code>BeanContextChild</code> implementor does not
* wish to have its parent changed.
*/
public void setBeanContext(BeanContext parent)
throws PropertyVetoException;
/**
* Get the parent <code>BeanContext</code>.
* @return the parent <code>BeanContext</code>.
*/
public BeanContext getBeanContext();
/**
* Add a listener that will be notified when a specific property changes.
* @param prop the name of the property to listen on
* @param listener the listener to listen on the property.
*/
public void addPropertyChangeListener(String prop, PropertyChangeListener listener);
/**
* Remove a listener to a certain property.
* @param prop the name of the property being listened on
* @param listener the listener listening on the property.
*/
public void removePropertyChangeListener(String prop, PropertyChangeListener listener);
/**
* Add a listener that will be notified when a specific property
* change is requested (a PropertyVetoException may be thrown) as
* well as after the change is successfully made.
*
* @param prop the name of the property to listen on
* @param listener the listener to listen on the property.
*/
public void addVetoableChangeListener(String prop, VetoableChangeListener listener);
/**
* Remove a listener to a certain property.
* @param prop the name of the property being listened on
* @param listener the listener listening on the property.
*/
public void removeVetoableChangeListener(String prop, VetoableChangeListener listener);
}
@@ -0,0 +1,49 @@
/* java.beans.beancontext.BeanContextChildComponentProxy
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.awt.Component;
/**
* Interface for <code>BeanContextChild</code>s which wish to associate an
* AWT component with them. The proxy is provided because the
* <code>addPropertyChangeListener()</code> method would conflict with
* <code>Component</code> if you tried to extend.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextChildComponentProxy {
/**
* Get the <code>Component</code> associated with this <code>BeanContextChild</code>.
* @return the <code>Component</code> associated with this
* <code>BeanContextChild</code>.
*/
public Component getComponent();
}
@@ -0,0 +1,356 @@
/* java.beans.beancontext.BeanContextChildSupport
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.beans.PropertyChangeListener;
import java.beans.VetoableChangeListener;
import java.beans.PropertyVetoException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeSupport;
import java.beans.VetoableChangeSupport;
import java.io.Serializable;
/**
* Support for creating a <code>BeanContextChild</code>.
* This class contains the most common implementations of the methods in
* the <code>BeanContextChild</code>
*
* @specnote This class is not very well specified. I had to "fill in the
* blanks" in most places with what I thought was reasonable
* behavior. If there are problems, let me know.
*
* @author John Keiser
* @since JDK1.2
* @see java.beans.beancontext.BeanContextChild
*/
public class BeanContextChildSupport implements BeanContextChild, BeanContextServicesListener, Serializable {
/**
* The peer on which to perform <code>set</code> actions.
* This is here so that this class can be used as a peer.
* <P>
*
* When extending this class, this variable will be set to
* <code>this</code>.
*/
public BeanContextChild beanContextChildPeer;
/**
* The parent <code>BeanContext</code>.
*/
protected transient BeanContext beanContext;
/**
* If <code>setBeanContext()</code> was vetoed once before, this
* is set to <code>true</code> so that the next time, vetoes will
* be ignored.
*/
protected transient boolean rejectedSetBCOnce;
/**
* Listeners are registered here and events are fired through here.
*/
protected PropertyChangeSupport pcSupport;
/**
* Listeners are registered here and events are fired through here.
*/
protected VetoableChangeSupport vcSupport;
/**
* Create a new <code>BeanContextChildSupport</code> with itself as the peer.
* This is meant to be used when you subclass
* <code>BeanContextChildSupport</code> to create your child.
*/
public BeanContextChildSupport() {
this(null);
};
/**
* Create a new <code>BeanContextChildSupport</code> with the specified peer.
* @param peer the peer to use, or <code>null</code> to specify
* <code>this</code>.
*/
public BeanContextChildSupport(BeanContextChild peer) {
if(peer == null) {
peer = this;
}
beanContextChildPeer = peer;
pcSupport = new PropertyChangeSupport(peer);
vcSupport = new VetoableChangeSupport(peer);
}
/**
* Set the parent <code>BeanContext</code>.
* <P>
*
* When this Object is being added to a new BeanContext or moved
* from an old one, a non-null value will be passed in.
* <P>
*
* When this Object is being removed from the current
* <code>BeanContext</code>, <code>setBeanContext()</code> will
* receive the parameter <code>null</code>.
* <P>
*
* Order of events:
* <OL>
* <LI>
* If the new <code>BeanContext</code> is the same as the old
* one, nothing happens.
* </LI>
* <LI>
* If the change has not been rejected or vetoed before, call
* <code>validatePendingSetBeanContext()</code>. If this call
* returns <code>false</code>, the change is rejected and a
* <code>PropertyVetoException</code> is thrown.
* </LI>
* <LI>
* If the change has not been rejected or vetoed before,
* <code>VetoableChangeEvent</code>s are fired with the name
* <code>"beanContext"</code>, using the
* <code>fireVetoableChange()</code> method. If a veto
* occurs, reversion events are fired using the same method,
* the change is rejected, and the veto is rethrown.
* </LI>
* <LI>
* <code>releaseBeanContextResources()</code> is called.
* </LI>
* <LI>
* The change is made.
* </LI>
* <LI>
* <code>PropertyChangeEvent</code>s are fired using the
* <code>firePropertyChange()</code> method.
* </LI>
* <LI>
* <code>initializeBeanContextResources()</code> is called.
* </LI>
* </OL>
* <P>
*
* @param newBeanContext the new parent for the
* <code>BeanContextChild</code>, or <code>null</code> to
* signify removal from a tree.
* @exception PropertyVetoException if the
* <code>BeanContextChild</code> implementor does not
* wish to have its parent changed.
*/
public void setBeanContext(BeanContext newBeanContext)
throws PropertyVetoException {
synchronized(beanContextChildPeer) {
if(newBeanContext == beanContext)
return;
if(!rejectedSetBCOnce) {
if(!validatePendingSetBeanContext(newBeanContext)) {
rejectedSetBCOnce = true;
throw new PropertyVetoException("validatePendingSetBeanContext() rejected change",
new PropertyChangeEvent(beanContextChildPeer, "beanContext", beanContext, newBeanContext));
}
try {
fireVetoableChange("beanContext", beanContext, newBeanContext);
} catch(PropertyVetoException e) {
rejectedSetBCOnce = true;
throw e;
}
}
releaseBeanContextResources();
beanContext = newBeanContext;
rejectedSetBCOnce = false;
firePropertyChange("beanContext", beanContext, newBeanContext);
initializeBeanContextResources();
}
}
/**
* Get the parent <code>BeanContext</code>.
* @return the parent <code>BeanContext</code>.
*/
public BeanContext getBeanContext() {
return beanContext;
}
/**
* Get the peer (or <code>this</code> if there is no peer).
* @return the peer, or <code>this</code> if there is no peer.
*/
public BeanContextChild getBeanContextChildPeer() {
return beanContextChildPeer;
}
/**
* Determine whether there is a peer.
* This is true iff <code>getBeanContextChildPeer() == this</code>.
* @return whether there is a peer.
*/
public boolean isDelegated() {
return beanContextChildPeer == this;
}
/**
* Add a listener that will be notified when a specific property changes.
* @param propertyName the name of the property to listen on.
* @param listener the listener to listen on the property.
*/
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
pcSupport.addPropertyChangeListener(propertyName, listener);
}
/**
* Remove a listener to a certain property.
*
* @param propertyName the name of the property being listened on.
* @param listener the listener listening on the property.
*/
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
pcSupport.removePropertyChangeListener(propertyName, listener);
}
/**
* Add a listener that will be notified when a specific property
* change is requested (a PropertyVetoException may be thrown) as
* well as after the change is successfully made.
*
* @param propertyName the name of the property to listen on.
* @param listener the listener to listen on the property.
*/
public void addVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
vcSupport.addVetoableChangeListener(propertyName, listener);
}
/**
* Remove a listener to a certain property.
*
* @param propertyName the name of the property being listened on
* @param listener the listener listening on the property.
*/
public void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener) {
vcSupport.removeVetoableChangeListener(propertyName, listener);
}
/**
* Fire a property change.
*
* @param propertyName the name of the property that changed
* @param oldVal the old value of the property
* @param newVal the new value of the property
*/
public void firePropertyChange(String propertyName, Object oldVal, Object newVal) {
pcSupport.firePropertyChange(propertyName, oldVal, newVal);
}
/**
* Fire a vetoable property change.
*
* @param propertyName the name of the property that changed
* @param oldVal the old value of the property
* @param newVal the new value of the property
* @exception PropertyVetoException if the change is vetoed.
*/
public void fireVetoableChange(String propertyName, Object oldVal, Object newVal)
throws PropertyVetoException {
vcSupport.fireVetoableChange(propertyName, oldVal, newVal);
}
/**
* Called by <code>BeanContextServices.revokeService()</code> to indicate that a service has been revoked.
* If you have a reference to such a service, it should be
* discarded and may no longer function properly.
* <code>getService()</code> will no longer work on the specified
* service class after this event has been fired.
* <P>
*
* <EM>This method is meant to be overriden.</EM>
* <code>BeanContextChildSupport</code>'s implementation does
* nothing.
*
* @param event the service revoked event.
* @see java.beans.beancontext.BeanContextServices#revokeService(java.lang.Class,java.beans.beancontext.BeanContextServiceProvider,boolean)
*/
public void serviceRevoked(BeanContextServiceRevokedEvent event) {
}
/**
* Called by <code>BeanContextServices</code> whenever a service is made available.
* <P>
*
* <EM>This method is meant to be overriden.</EM>
* <code>BeanContextChildSupport</code>'s implementation does
* nothing.
*
* @param event the service revoked event, with useful information
* about the new service.
*/
public void serviceAvailable(BeanContextServiceAvailableEvent event) {
}
/**
* Called by <code>setBeanContext()</code> to determine whether the set should be rejected.
* <P>
*
* <EM>This method is meant to be overriden.</EM>
* <code>BeanContextChildSupport</code>'s implementation simply
* returns <code>true</code>.
*
* @param newBeanContext the new parent.
* @return whether to allow the parent to be changed to the new
* value.
*/
public boolean validatePendingSetBeanContext(BeanContext newBeanContext) {
return true;
}
/**
* Called by <code>setBeanContext()</code> to release resources of a what will soon no longer be the parent.
* <P>
*
* <EM>This method is meant to be overriden.</EM>
* <code>BeanContextChildSupport</code>'s implementation does
* nothing.
*/
protected void releaseBeanContextResources() {
}
/**
* Called by <code>setBeanContext()</code> to grab resources when the parent has been set.
* <P>
*
* <EM>This method is meant to be overriden.</EM>
* <code>BeanContextChildSupport</code>'s implementation does
* nothing.
*/
protected void initializeBeanContextResources() {
}
}
@@ -0,0 +1,52 @@
/* java.beans.beancontext.BeanContextContainerProxy
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.awt.Container;
/**
* Interface for <code>BeanContext</code>s which wish to associate an
* AWT container with them. The proxy is provided because the
* <code>addPropertyChangeListener()</code> and <code>add()</code> methods
* would conflict with <code>Component</code> and <code>Container</code>
* if you tried to extend.
*
* @specnote It is unclear whether anything besides <code>BeanContext</code>s
* are allowed to implement this interface.
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextContainerProxy {
/**
* Get the <code>Container</code> associated with this <code>BeanContext</code>.
* @return the <code>Container</code> associated with this
* <code>BeanContext</code>.
*/
public Container getContainer();
}
@@ -0,0 +1,91 @@
/* java.beans.beancontext.BeanContextEvent
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.EventObject;
/**
* Generic superclass for events fired by <code>BeanContext</code>s.
*
* @author John Keiser
* @since JDK1.2
*/
public abstract class BeanContextEvent extends EventObject {
/**
* The <code>BeanContext</code> that most recently passed this
* event on.
*/
protected BeanContext propagatedFrom;
/**
* Create a new event, from the specified <code>BeanContext</code>.
* <code>propagatedFrom</code> will be initialized to
* <code>null</code>.
*
* @param source the source of the event.
*/
protected BeanContextEvent(BeanContext source) {
super(source);
}
/**
* Get the <code>BeanContext</code> that originated this event.
* @return the originator of this event.
*/
public BeanContext getBeanContext() {
return (BeanContext)getSource();
}
/**
* Get the most recent propagator of this event.
* If this value is <code>null</code>, you have received the event
* straight from the source.
*
* @return the most recent propagator of this event.
*/
public BeanContext getPropagatedFrom() {
return propagatedFrom;
}
/**
* Tell whether this event has been propagated.
* @return <code>true</code> iff <code>getPropagatedFrom() != null</code>.
*/
public boolean isPropagated() {
return propagatedFrom != null;
}
/**
* Set the most recent propagator of this event.
* @param propagator the most recent propagator of this event.
*/
public void setPropagatedFrom(BeanContext propagator) {
propagatedFrom = propagator;
}
}
@@ -0,0 +1,102 @@
/* java.beans.beancontext.BeanContextMembershipEvent
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.Collection;
import java.util.Arrays;
import java.util.Iterator;
/**
* Event fired when children are added to or removed from a <code>BeanContext</code>.
* Whether they were added or removed depends entirely on which method
* of the listener interface was called.
*
* @author John Keiser
* @since JDK1.2
* @see java.beans.beancontext.BeanContextMembershipListener
*/
public class BeanContextMembershipEvent extends BeanContextEvent {
/**
* The children that were added or removed.
*/
protected Collection children;
/**
* Create a new membership event.
* @param context the event source.
* @param children the children added to or removed from the source.
*/
public BeanContextMembershipEvent(BeanContext context, Collection children) {
super(context);
this.children = children;
}
/**
* Create a new membership event.
* @param context the event source.
* @param children the children added to or removed from the source.
*/
public BeanContextMembershipEvent(BeanContext context, Object[] children) {
super(context);
this.children = Arrays.asList(children);
}
/**
* The number of children removed or added.
* @return the number of children removed or added.
*/
public int size() {
return children.size();
}
/**
* An iterator that will step through all the children.
* @return an iterator over all the children.
*/
public Iterator iterator() {
return children.iterator();
}
/**
* An array of the children.
* @return an array of the children.
*/
public Object[] toArray() {
return children.toArray();
}
/**
* Tell whether the <code>Object</code> is one of the children added or removed.
* @param child the child to check.
* @return whether the <code>Object</code> is added or removed.
*/
public boolean contains(Object child) {
return children.contains(child);
}
}
@@ -0,0 +1,59 @@
/* java.beans.beancontext.BeanContextMembershipListener
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.EventListener;
/**
* This is the interface to which <code>BeanContextMembershipEvent</code>s are sent.
* This happens when children are added to or removed from a
* <code>BeanContext</code>.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextMembershipListener extends EventListener {
/**
* When beans are added to a <code>BeanContext</code>,
* this method is called to fire the event.
*
* @param event the event, including which children were added.
* @see java.beans.beancontext.BeanContext#add(java.lang.Object)
*/
public void childrenAdded(BeanContextMembershipEvent event);
/**
* When beans are removed from a <code>BeanContext</code>,
* this method is called to fire the event.
*
* @param event the event, including which children were removed.
* @see java.beans.beancontext.BeanContext#remove(java.lang.Object)
*/
public void childrenRemoved(BeanContextMembershipEvent event);
}
@@ -0,0 +1,54 @@
/* java.beans.beancontext.BeanContextProxy
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
/**
* Beans that wish to have a <code>BeanContextChild</code> or <code>BeanContext</code> associated with them
* but do not wish to implement those interfaces directly, can implement this interface.
* <P>
*
* Don't shoot yourself in the foot: if you already implement
* <code>BeanContextChild</code>, directly or indirectly, the whole
* workings of this package will be unpredictable because it is
* indeterminate as to whether the <code>BeanContextChild</code> is used
* in preference to its proxy or vice versa.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextProxy {
/**
* Return the <code>BeanContextChild</code> associated with this
* <code>Object</code>.
*
* @return the <code>BeanContextChild</code> associated with this
* <code>Object</code>.
*/
public BeanContextChild getBeanContextProxy();
}
@@ -0,0 +1,84 @@
/* java.beans.beancontext.BeanContextServiceAvailableEvent
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.Iterator;
/**
* Event fired when new services become available through a <code>BeanContextServices</code>.
*
* @author John Keiser
* @since JDK1.2
* @see java.beans.beancontext.BeanContextServicesListener
*/
public class BeanContextServiceAvailableEvent extends BeanContextEvent {
/**
* The <code>Class</code> representing the service which is now
* available.
*/
protected Class serviceClass;
/**
* Create a new service available event.
* @param services the <code>BeanContextServices</code> through
* which the service is available. This is also the source
* of the event.
* @param serviceClass the service class that is now available.
*/
public BeanContextServiceAvailableEvent(BeanContextServices services, Class serviceClass) {
super(services);
this.serviceClass = serviceClass;
}
/**
* Get the current service selectors of the service class.
* This is identical to <code>getSourceAsBeanContextServices().getCurrentServiceSelectors(getServiceClass())</code>
* @return the current service selectors of the service class.
*/
public Iterator getCurrentServiceSelectors() {
return getSourceAsBeanContextServices().getCurrentServiceSelectors(serviceClass);
}
/**
* Get the newly available service class.
* @return the service class.
*/
public Class getServiceClass() {
return serviceClass;
}
/**
* Get the <code>BeanContextServices</code> through which the new service is available.
* @return the <code>BeanContextServices</code> through which the
* new service is available.
*/
public BeanContextServices getSourceAsBeanContextServices() {
return (BeanContextServices)getSource();
}
}
@@ -0,0 +1,129 @@
/* java.beans.beancontext.BeanContextServiceProvider
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.Iterator;
/**
* An actual factory for services.
* <P>
*
* It is the <code>BeanContextServiceProvider</code>'s responsibility to
* register itself with whatever <code>BeanContextServices</code> object
* it wishes to provide services through using the
* <code>addService()</code> method.
* <P>
*
* If for some reason it can no longer provide services for a particular
* class, this class must invoke
* <code>BeanContextServices.revokeService(serviceClass,this,true)</code>
* for all the places it has registered the service.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextServiceProvider {
/**
* Get a service.
* Called from <code>BeanContextServices.getService().
* <P>
*
* If the requested service class is not available, or if this
* <code>BeanContextServiceProvider</code> chooses not honor the
* request for some reason, then this method will return
* <code>null</code>.
* <P>
*
* This method may throw unchecked exceptions, so watch out.
*
* @param services the <code>BeanContextServices</code> that wants
* to get the service. Only weak references to this will
* be retained, and it will never be changed, only queried
* in a read-only manner.
* @param requestor the actual requestor of the service. Only
* weak references to this will be retained, and it will
* never be changed, only queried in a read-only manner.
* @param serviceClass the <code>Class</code> of the service being
* requested.
* @param serviceSelector a parameter to customize the service
* returned with.
* @return an instance of <code>serviceClass</code> (such that
* <code>instanceof</code> serviceClass is true), or
* <code>null</code>.
* @see java.beans.beancontext.BeanContextServices#getService(java.beans.beancontext.BeanContextChild,java.lang.Object,java.lang.Class,java.lang.Object,java.beans.beancontext.BeanContextServiceRevokedListener)
*/
public Object getService(BeanContextServices services, Object requestor, Class serviceClass, Object serviceSelector);
/**
* Release the service.
* <P>
*
* Called by <code>BeanContextServices.releaseService()</code>.
* <P>
*
* Most <code>BeanContextServiceProvider</code>s won't have to do
* anything here.
*
* @param services the <code>BeanContextServices</code> that wants
* to release the service. Only weak references to this will
* be retained, and it will never be changed, only queried
* in a read-only manner.
* @param requestor the original requestor of the service.
* @param service the service to relinquish
* @see java.beans.beancontext.BeanContextServices#releaseService(java.beans.beancontext.BeanContextChild,java.lang.Object,java.lang.Object)
*/
public void releaseService(BeanContextServices services, Object requestor, Object service);
/**
* Get a list of valid service selectors for the specified service class.
* This method is called from
* <code>BeanContextServices.getCurrentServiceSelectors()</code>.
* <P>
*
* If the specified service class does not have a finite number of
* valid service selectors, it should return <code>null</code>.
* If it takes a general <code>Integer</code> parameter, for
* example, you may as well return <code>null</code> or the poor
* soul who called this method will be iterating all day.
* <P>
*
* If it has no valid service selectors, it should still return an empty
* <code>Iterator</code>.
*
* @param services the <code>BeanContextServices</code> that wants
* to get the service selectors. Only weak references to this will
* be retained, and it will never be changed, only queried
* in a read-only manner.
* @param serviceClass the service class to get selectors for.
* @return a list of valid service selectors for the service
* class, or <code>null</code>.
* @see java.beans.beancontext.BeanContextServices#getCurrentServiceSelectors(java.lang.Class)
*/
public Iterator getCurrentServiceSelectors(BeanContextServices services, Class serviceClass);
}
@@ -0,0 +1,49 @@
/* java.beans.beancontext.BeanContextServiceProviderBeanInfo
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.beans.BeanInfo;
/**
* <code>BeanContextServiceProvider</code>s implement this to provide information about all of the services they provide.
* <P>
*
* This is apparently so that you can import a bunch of services into a
* RAD tool and it will know about all of them and export them to the
* user in a readable manner.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextServiceProviderBeanInfo extends BeanInfo {
/**
* Get <code>BeanInfo</code>s for all of the service classes of this <code>BeanInfoServiceProvider</code>.
* @return <code>BeanInfo</code>s for all provided service classes.
*/
public BeanInfo[] getServicesBeanInfo();
}
@@ -0,0 +1,99 @@
/* java.beans.beancontext.BeanContextServiceRevokedEvent
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
/**
* Event fired when services are revoked from a <code>BeanContextServices</code>.
*
* @author John Keiser
* @since JDK1.2
* @see java.beans.beancontext.BeanContextServiceRevokedListener
*/
public class BeanContextServiceRevokedEvent extends BeanContextEvent {
/**
* The <code>Class</code> representing the service which is now
* available.
*/
protected Class serviceClass;
private boolean revokeNow;
/**
* Create a new service revoked event.
* @param services the <code>BeanContextServices</code> through
* which the service was available. This is also the source
* of the event.
* @param serviceClass the service class that is now revoked.
* @param revokeNow whether the revocation is immediate for all
* classes or just a suggestion.
*/
public BeanContextServiceRevokedEvent(BeanContextServices services, Class serviceClass, boolean revokeNow) {
super(services);
this.serviceClass = serviceClass;
this.revokeNow = revokeNow;
}
/**
* Get the revoked service class.
* @return the service class.
*/
public Class getServiceClass() {
return serviceClass;
}
/**
* Tell whether the revoked service class is the same as the specified class.
* Identical to <code>getServiceClass().equals(c)</code>.
* @param c the class to compare.
* @return whether the clases are equal.
*/
public boolean isServiceClass(Class c) {
return serviceClass.equals(c);
}
/**
* Get the <code>BeanContextServices</code> through which the service was available.
* @return the <code>BeanContextServices</code> through which the
* service was available.
*/
public BeanContextServices getSourceAsBeanContextServices() {
return (BeanContextServices)getSource();
}
/**
* Tell whether current instances of the revoked service are usable or not.
* This is determined by whether the service was revoked
* immediately.
*
* @return whether current instances of the revoked service are
* usable.
*/
public boolean isCurrentServiceInvalidNow() {
return revokeNow;
}
}
@@ -0,0 +1,51 @@
/* java.beans.beancontext.BeanContextServiceRevokedListener
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.EventListener;
/**
* Listens for service revoke events.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextServiceRevokedListener extends EventListener {
/**
* Called by <code>BeanContextServices.revokeService()</code> to indicate that a service has been revoked.
* If you have a reference to such a service, it should be
* discarded and may no longer function properly.
* <code>getService()</code> will no longer work on the specified
* service class after this event has been fired.
*
* @param event the service revoked event.
* @see java.beans.beancontext.BeanContextServices#revokeService(java.lang.Class,java.beans.beancontext.BeanContextServiceProvider,boolean)
*/
public void serviceRevoked(BeanContextServiceRevokedEvent event);
}
@@ -0,0 +1,195 @@
/* java.beans.beancontext.BeanContextServices
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
import java.util.Iterator;
/**
* Allows a <code>BeanContext</code> to provide services to its children.
*
* @specnote it is unclear whether a <code>BeanContextServices</code>
* should delegate unhandled requests to parents. I assume so.
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextServices extends BeanContext, BeanContextServicesListener {
/**
* Register a service to make it available to others.
* This class may refuse to add the service based on whatever
* information it can gather, including whether the service
* provider is trusted.
*
* @param serviceClass the service class.
* @param provider the factory that will actually provide the service.
* @return whether the service was added or not.
*/
public boolean addService(Class serviceClass, BeanContextServiceProvider provider);
/**
* Make it so that no one else can use this service.
* <P>
*
* If <code>revokeNow</code> is <code>false</code>, the only
* effect of this method is to make all subsequent calls to
* <code>getService()</code> on this service class fail.
* <P>
*
* If it is <code>true</code>, a message is also sent out to all
* listeners on the service and all references to it are released.
*
* @param serviceClass the service class to revoke.
* @param provider the service provider providing the service class.
* @param revokeNow whether to release all current references to
* the service.
*/
public void revokeService(Class serviceClass, BeanContextServiceProvider provider, boolean revokeNow);
/**
* Release your copy of this service.
* <P>
*
* If all copies of the service's class have been relinquished by
* the requestor, the <code>BeanContextServiceRevokedListener</code>
* previously registered by <code>getService()</code> will be
* unregistered.
*
* @param requestorChild the original <code>BeanContextChild</code>
* requesting the service.
* @param requestor the original requestor of the service.
* @param service the service to relinquish
* @see #getService(java.beans.beancontext.BeanContextChild,java.lang.Object,java.lang.Class,java.lang.Object,java.beans.beancontext.BeanContextServiceRevokedListener)
*/
public void releaseService(BeanContextChild requestorChild, Object requestor, Object service);
/**
* Get a service from this <code>BeanContextServices</code>.
* <P>
*
* The specified listener will be registered to receive a
* revocation notice for the specified serviceClass. One
* notification per service class per requestor object will be
* sent.
* <P>
*
* The listener will be unregistered when all services that were
* obtained by that requestor for that service class are released.
* <P>
*
* If the requested service class is not available, or if this
* <code>BeanContextServices</code> object chooses not honor the
* request because the service class has been revoked or for some
* other reason, then this method will return <code>null</code>.
* <P>
*
* This method may throw unchecked exceptions, so watch out.
*
* @specnote it is not specified what happens when two subsequent
* calls are made to <code>getService()</code> with the
* same requestor object and service class but different
* listeners. Which listener is to be notified?
*
* @param requestorChild the <code>BeanContextChild</code>
* associated with the requestor. Typically this will be
* the same as the requestor itself, but since any
* <code>Object</code>, even one outside the hierarchy, may
* make a request, this parameter is necessary. Only weak
* references to this will be retained, and it will never
* be changed, only queried in a read-only manner.
* @param requestor the actual requestor of the service. Only
* weak references to this will be retained, and it will
* never be changed, only queried in a read-only manner.
* @param serviceClass the <code>Class</code> of the service being
* requested.
* @param serviceSelector a parameter to customize the service
* returned with.
* @param listener a listener that will be notified if the service
* being requested is revoked.
* @return an instance of <code>serviceClass</code> (such that
* <code>instanceof</code> serviceClass is true), or
* <code>null</code>.
*/
public Object getService(BeanContextChild requestorChild, Object requestor, Class serviceClass, Object serviceSelector, BeanContextServiceRevokedListener listener);
/**
* Get a list of all service classes supported.
* <P>
*
* This method must synchronize on
* <code>BeanContext.globalHierarchyLock</code>.
*
* @return a list of all service classes supported.
* @see java.beans.beancontext.BeanContext#globalHierarchyLock
*/
public Iterator getCurrentServiceClasses();
/**
* Get a list of valid service selectors for the specified service class.
* <P>
*
* If the specified service class does not have a finite number of
* valid service selectors, it should return <code>null</code>.
* If it takes a general <code>Integer</code> parameter, for
* example, you may as well return <code>null</code> or the poor
* soul who called this method will be iterating all day.
* <P>
*
* If it has no valid service selectors, it should still return an empty
* <code>Iterator</code>.
*
* @param serviceClass the service class to get selectors for.
* @return a list of valid service selectors for the service
* class, or <code>null</code>.
*/
public Iterator getCurrentServiceSelectors(Class serviceClass);
/**
* Tell whether the specified service class is available.
* Iff getService() could return a non-null value for the
* specified service, this method will return <code>true</code>.
*
* @param serviceClass the service class to check on.
* @return whether the specified service class is availabe.
*/
public boolean hasService(Class serviceClass);
/**
* Add a listener on all adds and removes of services.
* @param listener the listener to add.
*/
public void addBeanContextServicesListener(BeanContextServicesListener listener);
/**
* Remove a listener on all adds and removes of services.
* @specnote it is not certain whether this should remove this
* listener if it was specified in
* <code>getService()</code>.
* @param listener the listener to add.
*/
public void removeBeanContextServicesListener(BeanContextServicesListener listener);
}
@@ -0,0 +1,45 @@
/* java.beans.beancontext.BeanContextServicesListener
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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
As a special exception, if you link this library with other files to
produce an executable, this library does not by itself cause the
resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why the
executable file might be covered by the GNU General Public License. */
package java.beans.beancontext;
/**
* Listens for service add and revoke events.
*
* @author John Keiser
* @since JDK1.2
*/
public interface BeanContextServicesListener extends BeanContextServiceRevokedListener {
/**
* Called by <code>BeanContextServices</code> whenever a service is made available.
*
* @param event the service revoked event, with useful information
* about the new service.
*/
public void serviceAvailable(BeanContextServiceAvailableEvent event);
}