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 }