Constructors Summary |
---|
public BeanContextServicesSupport(BeanContextServices peer, Locale lcle, boolean dTime, boolean visible)
Construct a BeanContextServicesSupport instance
super(peer, lcle, dTime, visible);
|
public BeanContextServicesSupport(BeanContextServices peer, Locale lcle, boolean dtime)Create an instance using the specified Locale and design mode.
this (peer, lcle, dtime, true);
|
public BeanContextServicesSupport(BeanContextServices peer, Locale lcle)Create an instance using the specified locale
this (peer, lcle, false, true);
|
public BeanContextServicesSupport(BeanContextServices peer)Create an instance with a peer
this (peer, null, false, true);
|
public BeanContextServicesSupport()Create an instance that is not a delegate of another object
this (null, null, false, true);
|
Methods Summary |
---|
public void | addBeanContextServicesListener(java.beans.beancontext.BeanContextServicesListener bcsl)/
/**
add a BeanContextServicesListener
if (bcsl == null) throw new NullPointerException("bcsl");
synchronized(bcsListeners) {
if (bcsListeners.contains(bcsl))
return;
else
bcsListeners.add(bcsl);
}
|
public boolean | addService(java.lang.Class serviceClass, java.beans.beancontext.BeanContextServiceProvider bcsp)add a service
return addService(serviceClass, bcsp, true);
|
protected boolean | addService(java.lang.Class serviceClass, java.beans.beancontext.BeanContextServiceProvider bcsp, boolean fireEvent)add a service
if (serviceClass == null) throw new NullPointerException("serviceClass");
if (bcsp == null) throw new NullPointerException("bcsp");
synchronized(BeanContext.globalHierarchyLock) {
if (services.containsKey(serviceClass))
return false;
else {
services.put(serviceClass, createBCSSServiceProvider(serviceClass, bcsp));
if (bcsp instanceof Serializable) serializable++;
if (!fireEvent) return true;
BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass);
fireServiceAdded(bcssae);
synchronized(children) {
Iterator i = children.keySet().iterator();
while (i.hasNext()) {
Object c = i.next();
if (c instanceof BeanContextServices) {
((BeanContextServicesListener)c).serviceAvailable(bcssae);
}
}
}
return true;
}
}
|
protected synchronized void | bcsPreDeserializationHook(java.io.ObjectInputStream ois)called from BeanContextSupport readObject before it deserializes the
children ...
This class will deserialize any Serializable BeanContextServiceProviders
serialized earlier thus making them available to the children when they
deserialized.
subclasses may envelope this method to insert their own serialization
processing that has to occur prior to serialization of the children
serializable = ois.readInt();
int count = serializable;
while (count > 0) {
services.put(ois.readObject(), ois.readObject());
count--;
}
|
protected synchronized void | bcsPreSerializationHook(java.io.ObjectOutputStream oos)called from BeanContextSupport writeObject before it serializes the
children ...
This class will serialize any Serializable BeanContextServiceProviders
herein.
subclasses may envelope this method to insert their own serialization
processing that has to occur prior to serialization of the children
oos.writeInt(serializable);
if (serializable <= 0) return;
int count = 0;
Iterator i = services.entrySet().iterator();
while (i.hasNext() && count < serializable) {
Map.Entry entry = (Map.Entry)i.next();
BCSSServiceProvider bcsp = null;
try {
bcsp = (BCSSServiceProvider)entry.getValue();
} catch (ClassCastException cce) {
continue;
}
if (bcsp.getServiceProvider() instanceof Serializable) {
oos.writeObject(entry.getKey());
oos.writeObject(bcsp);
count++;
}
}
if (count != serializable)
throw new IOException("wrote different number of service providers than expected");
|
protected void | childJustRemovedHook(java.lang.Object child, BCSChild bcsc)called from superclass child removal operations after a child
has been successfully removed. called with child synchronized.
This subclass uses this hook to immediately revoke any services
being used by this child if it is a BeanContextChild.
subclasses may envelope this method in order to implement their
own child removal side-effects.
BCSSChild bcssc = (BCSSChild)bcsc;
bcssc.cleanupReferences();
|
protected BCSChild | createBCSChild(java.lang.Object targetChild, java.lang.Object peer)
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.
return new BCSSChild(targetChild, peer);
|
protected java.beans.beancontext.BeanContextServicesSupport$BCSSServiceProvider | createBCSSServiceProvider(java.lang.Class sc, java.beans.beancontext.BeanContextServiceProvider bcsp)subclasses can override this method to create new subclasses of
BCSSServiceProvider without having to overrride addService() in
order to instantiate.
return new BCSSServiceProvider(sc, bcsp);
|
protected final void | fireServiceAdded(java.lang.Class serviceClass)Fires a BeanContextServiceEvent notifying of a new service.
BeanContextServiceAvailableEvent bcssae = new BeanContextServiceAvailableEvent(getBeanContextServicesPeer(), serviceClass);
fireServiceAdded(bcssae);
|
protected final void | fireServiceAdded(java.beans.beancontext.BeanContextServiceAvailableEvent bcssae)Fires a BeanContextServiceAvailableEvent indicating that a new
service has become available.
Object[] copy;
synchronized (bcsListeners) { copy = bcsListeners.toArray(); }
for (int i = 0; i < copy.length; i++) {
((BeanContextServicesListener)copy[i]).serviceAvailable(bcssae);
}
|
protected final void | fireServiceRevoked(java.beans.beancontext.BeanContextServiceRevokedEvent bcsre)Fires a BeanContextServiceEvent notifying of a service being revoked.
Object[] copy;
synchronized (bcsListeners) { copy = bcsListeners.toArray(); }
for (int i = 0; i < copy.length; i++) {
((BeanContextServiceRevokedListener)copy[i]).serviceRevoked(bcsre);
}
|
protected final void | fireServiceRevoked(java.lang.Class serviceClass, boolean revokeNow)Fires a BeanContextServiceRevokedEvent
indicating that a particular service is
no longer available.
Object[] copy;
BeanContextServiceRevokedEvent bcsre = new BeanContextServiceRevokedEvent(getBeanContextServicesPeer(), serviceClass, revokeNow);
synchronized (bcsListeners) { copy = bcsListeners.toArray(); }
for (int i = 0; i < copy.length; i++) {
((BeanContextServicesListener)copy[i]).serviceRevoked(bcsre);
}
|
public java.beans.beancontext.BeanContextServices | getBeanContextServicesPeer()Gets the BeanContextServices associated with this
BeanContextServicesSupport.
return (BeanContextServices)getBeanContextChildPeer();
|
protected static final java.beans.beancontext.BeanContextServicesListener | getChildBeanContextServicesListener(java.lang.Object child)Gets the BeanContextServicesListener (if any) of the specified
child.
try {
return (BeanContextServicesListener)child;
} catch (ClassCastException cce) {
return null;
}
|
public java.util.Iterator | getCurrentServiceClasses()
return new BCSIterator(services.keySet().iterator());
|
public java.util.Iterator | getCurrentServiceSelectors(java.lang.Class serviceClass)
BCSSServiceProvider bcsssp = (BCSSServiceProvider)services.get(serviceClass);
return bcsssp != null ? new BCSIterator(bcsssp.getServiceProvider().getCurrentServiceSelectors(getBeanContextServicesPeer(), serviceClass)) : null;
|
public java.lang.Object | getService(java.beans.beancontext.BeanContextChild child, java.lang.Object requestor, java.lang.Class serviceClass, java.lang.Object serviceSelector, java.beans.beancontext.BeanContextServiceRevokedListener bcsrl)/
/**
obtain a service which may be delegated
if (child == null) throw new NullPointerException("child");
if (serviceClass == null) throw new NullPointerException("serviceClass");
if (requestor == null) throw new NullPointerException("requestor");
if (bcsrl == null) throw new NullPointerException("bcsrl");
Object service = null;
BCSSChild bcsc;
BeanContextServices bcssp = getBeanContextServicesPeer();
synchronized(BeanContext.globalHierarchyLock) {
synchronized(children) { bcsc = (BCSSChild)children.get(child); }
if (bcsc == null) throw new IllegalArgumentException("not a child of this context"); // not a child ...
BCSSServiceProvider bcsssp = (BCSSServiceProvider)services.get(serviceClass);
if (bcsssp != null) {
BeanContextServiceProvider bcsp = bcsssp.getServiceProvider();
service = bcsp.getService(bcssp, requestor, serviceClass, serviceSelector);
if (service != null) { // do bookkeeping ...
try {
bcsc.usingService(requestor, service, serviceClass, bcsp, false, bcsrl);
} catch (TooManyListenersException tmle) {
bcsp.releaseService(bcssp, requestor, service);
throw tmle;
} catch (UnsupportedOperationException uope) {
bcsp.releaseService(bcssp, requestor, service);
throw uope; // unchecked rt exception
}
return service;
}
}
if (proxy != null) {
// try to delegate ...
service = proxy.getService(bcssp, requestor, serviceClass, serviceSelector);
if (service != null) { // do bookkeeping ...
try {
bcsc.usingService(requestor, service, serviceClass, proxy, true, bcsrl);
} catch (TooManyListenersException tmle) {
proxy.releaseService(bcssp, requestor, service);
throw tmle;
} catch (UnsupportedOperationException uope) {
proxy.releaseService(bcssp, requestor, service);
throw uope; // unchecked rt exception
}
return service;
}
}
}
return null;
|
public synchronized boolean | hasService(java.lang.Class serviceClass)has a service, which may be delegated
if (serviceClass == null) throw new NullPointerException("serviceClass");
synchronized(BeanContext.globalHierarchyLock) {
if (services.containsKey(serviceClass)) return true;
BeanContextServices bcs = null;
try {
bcs = (BeanContextServices)getBeanContext();
} catch (ClassCastException cce) {
return false;
}
return bcs == null ? false : bcs.hasService(serviceClass);
}
|
public void | initialize()called by BeanContextSupport superclass during construction and
deserialization to initialize subclass transient state.
subclasses may envelope this method, but should not override it or
call it directly.
super.initialize();
services = new HashMap(serializable + 1);
bcsListeners = new ArrayList(1);
|
protected synchronized void | initializeBeanContextResources()called from setBeanContext to notify a BeanContextChild
to allocate resources obtained from the nesting BeanContext.
subclasses may envelope this method to implement their own semantics.
super.initializeBeanContextResources();
BeanContext nbc = getBeanContext();
if (nbc == null) return;
try {
BeanContextServices bcs = (BeanContextServices)nbc;
proxy = new BCSSProxyServiceProvider(bcs);
} catch (ClassCastException cce) {
// do nothing ...
}
|
private synchronized void | readObject(java.io.ObjectInputStream ois)deserialize the instance
ois.defaultReadObject();
deserialize(ois, (Collection)bcsListeners);
|
protected synchronized void | releaseBeanContextResources()called from setBeanContext to notify a BeanContextChild
to release resources obtained from the nesting BeanContext.
This method revokes any services obtained from its parent.
subclasses may envelope this method to implement their own semantics.
Object[] bcssc;
super.releaseBeanContextResources();
synchronized(children) {
if (children.isEmpty()) return;
bcssc = children.values().toArray();
}
for (int i = 0; i < bcssc.length; i++) {
((BCSSChild)bcssc[i]).revokeAllDelegatedServicesNow();
}
proxy = null;
|
public void | releaseService(java.beans.beancontext.BeanContextChild child, java.lang.Object requestor, java.lang.Object service)release a service
if (child == null) throw new NullPointerException("child");
if (requestor == null) throw new NullPointerException("requestor");
if (service == null) throw new NullPointerException("service");
BCSSChild bcsc;
synchronized(BeanContext.globalHierarchyLock) {
synchronized(children) { bcsc = (BCSSChild)children.get(child); }
if (bcsc != null)
bcsc.releaseService(requestor, service);
else
throw new IllegalArgumentException("child actual is not a child of this BeanContext");
}
|
public void | removeBeanContextServicesListener(java.beans.beancontext.BeanContextServicesListener bcsl)remove a BeanContextServicesListener
if (bcsl == null) throw new NullPointerException("bcsl");
synchronized(bcsListeners) {
if (!bcsListeners.contains(bcsl))
return;
else
bcsListeners.remove(bcsl);
}
|
public void | revokeService(java.lang.Class serviceClass, java.beans.beancontext.BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow)remove a service
if (serviceClass == null) throw new NullPointerException("serviceClass");
if (bcsp == null) throw new NullPointerException("bcsp");
synchronized(BeanContext.globalHierarchyLock) {
if (!services.containsKey(serviceClass)) return;
BCSSServiceProvider bcsssp = (BCSSServiceProvider)services.get(serviceClass);
if (!bcsssp.getServiceProvider().equals(bcsp))
throw new IllegalArgumentException("service provider mismatch");
services.remove(serviceClass);
if (bcsp instanceof Serializable) serializable--;
Iterator i = bcsChildren(); // get the BCSChild values.
while (i.hasNext()) {
((BCSSChild)i.next()).revokeService(serviceClass, false, revokeCurrentServicesNow);
}
fireServiceRevoked(serviceClass, revokeCurrentServicesNow);
}
|
public void | serviceAvailable(java.beans.beancontext.BeanContextServiceAvailableEvent bcssae)BeanContextServicesListener callback, propagates event to all
currently registered listeners and BeanContextServices children,
if this BeanContextService does not already implement this service
itself.
subclasses may override or envelope this method to implement their
own propagation semantics.
synchronized(BeanContext.globalHierarchyLock) {
if (services.containsKey(bcssae.getServiceClass())) return;
fireServiceAdded(bcssae);
Iterator i;
synchronized(children) {
i = children.keySet().iterator();
}
while (i.hasNext()) {
Object c = i.next();
if (c instanceof BeanContextServices) {
((BeanContextServicesListener)c).serviceAvailable(bcssae);
}
}
}
|
public void | serviceRevoked(java.beans.beancontext.BeanContextServiceRevokedEvent bcssre)BeanContextServicesListener callback, propagates event to all
currently registered listeners and BeanContextServices children,
if this BeanContextService does not already implement this service
itself.
subclasses may override or envelope this method to implement their
own propagation semantics.
synchronized(BeanContext.globalHierarchyLock) {
if (services.containsKey(bcssre.getServiceClass())) return;
fireServiceRevoked(bcssre);
Iterator i;
synchronized(children) {
i = children.keySet().iterator();
}
while (i.hasNext()) {
Object c = i.next();
if (c instanceof BeanContextServices) {
((BeanContextServicesListener)c).serviceRevoked(bcssre);
}
}
}
|
private synchronized void | writeObject(java.io.ObjectOutputStream oos)serialize the instance
oos.defaultWriteObject();
serialize(oos, (Collection)bcsListeners);
|