📄 beancontextservicessupport.java
字号:
while (i.hasNext() && serviceRequestors != null) { Map.Entry entry = (Map.Entry)i.next(); BeanContextServiceRevokedListener listener = (BeanContextServiceRevokedListener)entry.getValue(); if (revokeNow) { Object requestor = entry.getKey(); Map services = (Map)serviceRequestors.get(requestor); if (services != null) { Iterator i1 = services.entrySet().iterator(); while (i1.hasNext()) { Map.Entry tmp = (Map.Entry)i1.next(); BCSSCServiceRef serviceRef = (BCSSCServiceRef)tmp.getValue(); if (serviceRef.getServiceClassRef().equals(serviceClassRef) && isDelegated == serviceRef.isDelegated()) { i1.remove(); } } if (noMoreRefs = services.isEmpty()) { serviceRequestors.remove(requestor); } } if (noMoreRefs) serviceClassRef.removeRequestor(requestor); } listener.serviceRevoked(bcsre); } if (revokeNow && serviceClasses != null) { if (serviceClassRef.isEmpty()) serviceClasses.remove(serviceClass); if (serviceClasses.isEmpty()) serviceClasses = null; } if (serviceRequestors != null && serviceRequestors.isEmpty()) serviceRequestors = null; } // release all references for this child since it has been unnested. void cleanupReferences() { if (serviceRequestors == null) return; Iterator requestors = serviceRequestors.entrySet().iterator(); while(requestors.hasNext()) { Map.Entry tmp = (Map.Entry)requestors.next(); Object requestor = tmp.getKey(); Iterator services = ((Map)tmp.getValue()).entrySet().iterator(); requestors.remove(); while (services.hasNext()) { Map.Entry entry = (Map.Entry)services.next(); Object service = entry.getKey(); BCSSCServiceRef sref = (BCSSCServiceRef)entry.getValue(); BCSSCServiceClassRef scref = sref.getServiceClassRef(); BeanContextServiceProvider bcsp = sref.isDelegated() ? scref.getDelegateProvider() : scref.getServiceProvider(); scref.removeRequestor(requestor); services.remove(); while (sref.release() >= 0) { bcsp.releaseService(BeanContextServicesSupport.this.getBeanContextServicesPeer(), requestor, service); } } } serviceRequestors = null; serviceClasses = null; } void revokeAllDelegatedServicesNow() { if (serviceClasses == null) return; Iterator serviceClassRefs = new HashSet(serviceClasses.values()).iterator(); while (serviceClassRefs.hasNext()) { BCSSCServiceClassRef serviceClassRef = (BCSSCServiceClassRef)serviceClassRefs.next(); if (!serviceClassRef.isDelegated()) continue; Iterator i = serviceClassRef.cloneOfEntries(); BeanContextServiceRevokedEvent bcsre = new BeanContextServiceRevokedEvent(BeanContextServicesSupport.this.getBeanContextServicesPeer(), serviceClassRef.getServiceClass(), true); boolean noMoreRefs = false; while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); BeanContextServiceRevokedListener listener = (BeanContextServiceRevokedListener)entry.getValue(); Object requestor = entry.getKey(); Map services = (Map)serviceRequestors.get(requestor); if (services != null) { Iterator i1 = services.entrySet().iterator(); while (i1.hasNext()) { Map.Entry tmp = (Map.Entry)i1.next(); BCSSCServiceRef serviceRef = (BCSSCServiceRef)tmp.getValue(); if (serviceRef.getServiceClassRef().equals(serviceClassRef) && serviceRef.isDelegated()) { i1.remove(); } } if (noMoreRefs = services.isEmpty()) { serviceRequestors.remove(requestor); } } if (noMoreRefs) serviceClassRef.removeRequestor(requestor); listener.serviceRevoked(bcsre); if (serviceClassRef.isEmpty()) serviceClasses.remove(serviceClassRef.getServiceClass()); } } if (serviceClasses.isEmpty()) serviceClasses = null; if (serviceRequestors != null && serviceRequestors.isEmpty()) serviceRequestors = null; } /* * fields */ private transient HashMap serviceClasses; private transient HashMap serviceRequestors; } /** * <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 targetChild and peer are related by BeanContextProxy */ protected BCSChild createBCSChild(Object targetChild, Object peer) { return new BCSSChild(targetChild, peer); } /************************************************************************/ /** * subclasses may subclass this nested class to add behaviors for * each BeanContextServicesProvider. */ protected static class BCSSServiceProvider implements Serializable { BCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { super(); serviceProvider = bcsp; } protected BeanContextServiceProvider getServiceProvider() { return serviceProvider; } /* * fields */ protected BeanContextServiceProvider serviceProvider; } /** * subclasses can override this method to create new subclasses of * BCSSServiceProvider without having to overrride addService() in * order to instantiate. */ protected BCSSServiceProvider createBCSSServiceProvider(Class sc, BeanContextServiceProvider bcsp) { return new BCSSServiceProvider(sc, bcsp); } /************************************************************************/ /** * add a BeanContextServicesListener * * @throw new NullPointerException */ public void addBeanContextServicesListener(BeanContextServicesListener bcsl) { if (bcsl == null) throw new NullPointerException("bcsl"); synchronized(bcsListeners) { if (bcsListeners.contains(bcsl)) return; else bcsListeners.add(bcsl); } } /** * remove a BeanContextServicesListener */ public void removeBeanContextServicesListener(BeanContextServicesListener bcsl) { if (bcsl == null) throw new NullPointerException("bcsl"); synchronized(bcsListeners) { if (!bcsListeners.contains(bcsl)) return; else bcsListeners.remove(bcsl); } } /** * add a service */ public boolean addService(Class serviceClass, BeanContextServiceProvider bcsp) { return addService(serviceClass, bcsp, true); } /** * add a service */ protected boolean addService(Class serviceClass, BeanContextServiceProvider bcsp, boolean fireEvent) { 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; } } } /** * remove a service */ public void revokeService(Class serviceClass, BeanContextServiceProvider bcsp, boolean revokeCurrentServicesNow) { 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); } } /** * has a service, which may be delegated */ public synchronized boolean hasService(Class serviceClass) { 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); } } /************************************************************************/ /* * a nested subclass used to represent a proxy for serviceClasses delegated * to an enclosing BeanContext. */ protected class BCSSProxyServiceProvider implements BeanContextServiceProvider, BeanContextServiceRevokedListener { BCSSProxyServiceProvider(BeanContextServices bcs) { super(); nestingCtxt = bcs; } public Object getService(BeanContextServices bcs, Object requestor, Class serviceClass, Object serviceSelector) { Object service = null; try { service = nestingCtxt.getService(bcs, requestor, serviceClass, serviceSelector, this); } catch (TooManyListenersException tmle) { return null; } return service; } public void releaseService(BeanContextServices bcs, Object requestor, Object service) { nestingCtxt.releaseService(bcs, requestor, service); } public Iterator getCurrentServiceSelectors(BeanContextServices bcs, Class serviceClass) { return nestingCtxt.getCurrentServiceSelectors(serviceClass); } public void serviceRevoked(BeanContextServiceRevokedEvent bcsre) { Iterator i = bcsChildren(); // get the BCSChild values. while (i.hasNext()) { ((BCSSChild)i.next()).revokeService(bcsre.getServiceClass(), true, bcsre.isCurrentServiceInvalidNow()); } } /* * fields */ private BeanContextServices nestingCtxt; } /************************************************************************/ /** * obtain a service which may be delegated */ public Object getService(BeanContextChild child, Object requestor, Class serviceClass, Object serviceSelector, BeanContextServiceRevokedListener bcsrl) throws TooManyListenersException { 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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -