1 package org.openflow.util;
3 import java.util.HashSet;
4 import java.util.Hashtable;
9 * The following implement a producer/consumer design pattern in which both
10 * producers and consumers explicitly employ a centralized registration
11 * mechanism, and java Interfaces are used as contracts.<br>
13 public class ProducerConsumer {
18 protected static ProducerConsumer singleton;
23 protected ProducerConsumer() {
24 producerMap = new Hashtable<Class<?>, Set<IProducer>>();
31 // Interface/IProducer map
32 protected Map<Class<?>, Set<IProducer>> producerMap;
38 protected void _registerConsumer(Object consumer, Class<?>[] interfaces,
40 Set<Class<?>> iUniqueSet) {
41 // *...Process all interfaces...*/
42 for (Class<?> iface : interfaces) {
44 // *...Protect against repeated interfaces...*/
45 if (!iUniqueSet.contains(iface)) {
46 iUniqueSet.add(iface);
48 Set<IProducer> producers = producerMap.get(iface);
50 if (producers != null) {
51 for (IProducer producer : producers)
52 producer.registerConsumer(iface, consumer);
57 _registerConsumer(consumer, iface.getInterfaces(), iSet,
63 protected void _registerConsumer(Object consumer, Class<?> clazz,
65 Set<Class<?>> iUniqueSet) {
67 // *...Process all interfaces...*/
68 _registerConsumer(consumer, clazz.getInterfaces(), iSet,
71 // *...Recurse the class hierarchy...*/
72 _registerConsumer(consumer, clazz.getSuperclass(), iSet,
77 protected int _deregisterConsumer(Object consumer,
78 Class<?>[] interfaces,
79 Set<Class<?>> iUniqueSet) {
82 // *...Process all interfaces...*/
83 for (Class<?> iface : interfaces) {
85 // *...Protect against repeated interfaces...*/
86 if (!iUniqueSet.contains(iface)) {
87 iUniqueSet.add(iface);
89 Set<IProducer> producers = producerMap.get(iface);
91 if (producers != null) {
92 for (IProducer producer : producers)
93 producer.deregisterConsumer(iface, consumer);
99 count += _deregisterConsumer(consumer,
100 iface.getInterfaces(),
108 protected int _deregisterConsumer(Object consumer, Class<?> clazz,
109 Set<Class<?>> iUniqueSet) {
113 // *...Process all interfaces...*/
114 count += _deregisterConsumer(consumer, clazz.getInterfaces(),
117 // *...Recurse the class hierarchy...*/
118 count += _deregisterConsumer(consumer, clazz.getSuperclass(),
130 * @return singleton ProducerConsumer
132 public static synchronized ProducerConsumer getSingleton() {
133 if (singleton == null) singleton = new ProducerConsumer();
143 * Producer registration
146 * object that implements IProducer
148 * interface supported by the producer
149 * @return whether there was a previously registered producer, or true if
150 * one or more the arguments were invalid
152 public boolean registerProducer(IProducer producer, Class<?> iface) {
153 if (producer != null && iface != null && iface.isInterface()) {
154 Set<IProducer> producers = producerMap.get(iface);
156 if (producers == null) {
157 producers = new HashSet<IProducer>();
158 producerMap.put(iface, producers);
161 return producers.add(producer);
167 * Producer deregistration
170 * object that implements IProducer
172 * interface supported by the producer
173 * @return whether the interface/producer pair was removed, or false if one
174 * or more the arguments were invalid
176 public boolean deregisterProducer(IProducer producer, Class<?> iface) {
177 if (producer != null && iface != null && iface.isInterface()) {
178 Set<IProducer> producers = producerMap.get(iface);
180 if (producers != null) return producers.remove(producer);
191 * Consumer registration
194 * object that implements producer-specific interfaces
195 * @return set of supported interfaces
197 public Set<Class<?>> registerConsumer(Object consumer) {
198 Set<Class<?>> iSet = new HashSet<Class<?>>();
200 if (consumer != null)
201 _registerConsumer(consumer,
202 consumer.getClass(), iSet,
203 new HashSet<Class<?>>());
209 * Consumer deregistration
212 * object to deregister
213 * @return number of unregistered interfaces
215 public int deregisterConsumer(Object consumer) {
216 if (consumer != null)
217 return _deregisterConsumer(consumer, consumer.getClass(),
218 new HashSet<Class<?>>());