/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.core.service; import com.espertech.esper.client.StatementAwareUpdateListener; import com.espertech.esper.client.UpdateListener; import com.espertech.esper.util.CollectionUtil; /** * Provides update listeners for use by statement instances, and the management methods around these. * <p> * The collection of update listeners is based on copy-on-write: * When the engine dispatches events to a set of listeners, then while iterating through the set there * may be listeners added or removed (the listener may remove itself). * Additionally, events may be dispatched by multiple threads to the same listener. */ public class EPStatementListenerSet { private final static UpdateListener[] EMPTY_UPDLISTEN_ARRAY = new UpdateListener[0]; private final static StatementAwareUpdateListener[] EMPTY_UPDLISTENSA_ARRAY = new StatementAwareUpdateListener[0]; private Object subscriber; private String subscriberMethodName; private volatile UpdateListener[] listeners; private volatile StatementAwareUpdateListener[] stmtAwareListeners; /** * Ctor. */ public EPStatementListenerSet() { listeners = EMPTY_UPDLISTEN_ARRAY; stmtAwareListeners = EMPTY_UPDLISTENSA_ARRAY; } public EPStatementListenerSet(UpdateListener[] listeners, StatementAwareUpdateListener[] stmtAwareListeners) { this.listeners = listeners; this.stmtAwareListeners = stmtAwareListeners; } /** * Returns the set of listeners to the statement. * * @return statement listeners */ public UpdateListener[] getListeners() { return listeners; } /** * Returns the set of statement-aware listeners. * * @return statement-aware listeners */ public StatementAwareUpdateListener[] getStmtAwareListeners() { return stmtAwareListeners; } /** * Set the update listener set to use. * * @param listenerSet a collection of update listeners */ public void setListeners(EPStatementListenerSet listenerSet) { this.listeners = listenerSet.getListeners(); this.stmtAwareListeners = listenerSet.getStmtAwareListeners(); } /** * Add a listener to the statement. * * @param listener to add */ public synchronized void addListener(UpdateListener listener) { if (listener == null) { throw new IllegalArgumentException("Null listener reference supplied"); } for (UpdateListener existing : listeners) { if (existing == listener) { return; } } listeners = (UpdateListener[]) CollectionUtil.arrayExpandAddSingle(listeners, listener); } /** * Remove a listeners to a statement. * * @param listener to remove */ public synchronized void removeListener(UpdateListener listener) { if (listener == null) { throw new IllegalArgumentException("Null listener reference supplied"); } int index = -1; for (int i = 0; i < listeners.length; i++) { if (listeners[i] == listener) { index = i; break; } } if (index == -1) { return; } listeners = (UpdateListener[]) CollectionUtil.arrayShrinkRemoveSingle(listeners, index); } /** * Remove all listeners to a statement. */ public synchronized void removeAllListeners() { listeners = EMPTY_UPDLISTEN_ARRAY; stmtAwareListeners = EMPTY_UPDLISTENSA_ARRAY; } /** * Add a listener to the statement. * * @param listener to add */ public synchronized void addListener(StatementAwareUpdateListener listener) { if (listener == null) { throw new IllegalArgumentException("Null listener reference supplied"); } for (StatementAwareUpdateListener existing : stmtAwareListeners) { if (existing == listener) { return; } } stmtAwareListeners = (StatementAwareUpdateListener[]) CollectionUtil.arrayExpandAddSingle(stmtAwareListeners, listener); } /** * Remove a listeners to a statement. * * @param listener to remove */ public synchronized void removeListener(StatementAwareUpdateListener listener) { if (listener == null) { throw new IllegalArgumentException("Null listener reference supplied"); } int index = -1; for (int i = 0; i < stmtAwareListeners.length; i++) { if (stmtAwareListeners[i] == listener) { index = i; break; } } if (index == -1) { return; } stmtAwareListeners = (StatementAwareUpdateListener[]) CollectionUtil.arrayShrinkRemoveSingle(stmtAwareListeners, index); } /** * Sets a subscriber instance. * * @param subscriber is the subscriber to set * @param methodName method name */ public void setSubscriber(Object subscriber, String methodName) { this.subscriber = subscriber; this.subscriberMethodName = methodName; } /** * Returns the subscriber instance. * * @return subscriber */ public Object getSubscriber() { return subscriber; } public String getSubscriberMethodName() { return subscriberMethodName; } }