package context.arch.enactor; import context.arch.comm.DataObject; import context.arch.storage.Attributes; /** * An event multicaster, for thread-safe enactor event broadcasting. * * @author alann */ class EnactorListenerMulticaster implements EnactorListener { private final EnactorListener a, b; EnactorListenerMulticaster(EnactorListener a, EnactorListener b) { this.a = a; this.b = b; } static EnactorListener add(EnactorListener a, EnactorListener b) { return addInternal(a, b); } static EnactorListener remove(EnactorListener l, EnactorListener oldl) { return removeInternal(l, oldl); } private EnactorListener remove(EnactorListener oldl) { if (oldl == a) return b; if (oldl == b) return a; EnactorListener a2 = removeInternal(a, oldl); EnactorListener b2 = removeInternal(b, oldl); if (a2 == a && b2 == b) { return this; // it's not here } return addInternal(a2, b2); } private static EnactorListener addInternal(EnactorListener a, EnactorListener b) { if (a == null) return b; if (b == null) return a; return new EnactorListenerMulticaster(a, b); } private static EnactorListener removeInternal(EnactorListener l, EnactorListener oldl) { if (l == oldl || l == null) { return null; } else if (l instanceof EnactorListenerMulticaster) { return ((EnactorListenerMulticaster)l).remove(oldl); } else { return l; // it's not here } } public void componentEvaluated(EnactorComponentInfo eci) { // System.out.println("EnactorListenerMulticaster componentEvaluated " + a + " | " + b); a.componentEvaluated(eci); b.componentEvaluated(eci); } public void componentAdded(EnactorComponentInfo eci, Attributes paramAtts) { a.componentAdded(eci, paramAtts); b.componentAdded(eci, paramAtts); } public void componentRemoved(EnactorComponentInfo eci, Attributes paramAtts) { a.componentRemoved(eci, paramAtts); b.componentRemoved(eci, paramAtts); } public void parameterValueChanged(EnactorParameter parameter, Attributes validAtts, Object value) { a.parameterValueChanged(parameter, validAtts, value); b.parameterValueChanged(parameter, validAtts, value); } public void serviceExecuted(EnactorComponentInfo eci, String serviceName, String functionName, Attributes input, DataObject returnDataObject) { a.serviceExecuted(eci, serviceName, functionName, input, returnDataObject); b.serviceExecuted(eci, serviceName, functionName, input, returnDataObject); } }