001    package biz.hammurapi.jms.adapter;
002    
003    import java.util.ArrayList;
004    import java.util.Collection;
005    
006    /**
007     * Broadcasts object to registered processors.
008     * Adapter client code can lookup listener and register
009     * a processor.
010     * @author Pavel
011     *
012     */
013    public class BroadcastingProcessor implements Processor {
014            
015            private Collection processors = new ArrayList();
016            
017            public synchronized void addProcessor(Processor processor) {
018                    processors.add(processor);
019            }
020    
021            public synchronized void removeProcessor(Processor processor) {
022                    processors.remove(processor);
023            }
024            
025            /**
026             * Collects non-null returns from registered processors and returns them as collection
027             * Returns null if collection is empty.
028             */
029            public Object process(Object obj) throws Exception {
030                    Collection ret = new ArrayList();
031                    Processor[] pa;
032                    synchronized (processors) {
033                            pa = (Processor[]) processors.toArray(new Processor[processors.size()]);
034                    }
035                    
036                    for (int i=0; i<pa.length; ++i) {
037                            Object r = pa[i].process(obj);
038                            if (r!=null) {
039                                    ret.add(r);
040                            }
041                    }
042                    
043                    return ret.isEmpty() ? null : ret;
044            }
045    
046    }