* Class responsible for distributing update information
* to all registered listeners
*/
-public class UpdateMessageBroker
+public abstract class UpdateMessageBroker
{
- private DataSubscriber[] _subscribers;
- private int _subscriberNum = 0;
- private static final int MAXIMUM_NUMBER_SUBSCRIBERS = 4;
+ private static final int MAXIMUM_NUMBER_SUBSCRIBERS = 8;
+ /** Array of all subscribers */
+ private static DataSubscriber[] _subscribers = new DataSubscriber[MAXIMUM_NUMBER_SUBSCRIBERS];
+ /** Index from which to start looking for an empty slot*/
+ private static int _searchStartIndex = 0;
+ /** Enable/disabled flag */
+ private static boolean _enabled = true;
/**
- * Constructor
- * @param inTrack Track object
+ * Add a data subscriber to the list
+ * @param inSub DataSubscriber to add
*/
- public UpdateMessageBroker()
+ public static void addSubscriber(DataSubscriber inSub)
{
- _subscribers = new DataSubscriber[MAXIMUM_NUMBER_SUBSCRIBERS];
+ // Loop looking for first null entry
+ for (int i=_searchStartIndex; i<MAXIMUM_NUMBER_SUBSCRIBERS; i++)
+ {
+ if (_subscribers[i] == null)
+ {
+ _subscribers[i] = inSub;
+ _searchStartIndex = i+1;
+ break;
+ }
+ }
}
-
/**
- * Add a data subscriber to the list
- * @param inSub DataSubscriber to add
+ * Remove the given subscriber from the list
+ * @param inSub subscriber to remove
*/
- public void addSubscriber(DataSubscriber inSub)
+ public static void removeSubscriber(DataSubscriber inSub)
{
- _subscribers[_subscriberNum] = inSub;
- _subscriberNum++;
+ for (int i=0; i<MAXIMUM_NUMBER_SUBSCRIBERS; i++)
+ {
+ if (_subscribers[i] == inSub)
+ {
+ _subscribers[i] = null;
+ // Could break out of the loop here but we want to make sure we remove all of them
+ }
+ }
+ _searchStartIndex = 0; // for the next add, start from beginning to ensure all gaps are filled
}
+ /**
+ * Enable or disable the messaging (to allow temporary disabling for multiple operations)
+ * @param inEnabled false to disable, true to enable again
+ */
+ public static void enableMessaging(boolean inEnabled)
+ {
+ _enabled = inEnabled;
+ }
/**
* Send a message to all subscribers that
* the data has been updated
*/
- public void informSubscribers()
+ public static void informSubscribers()
{
informSubscribers(DataSubscriber.ALL);
}
* Send message to all subscribers
* @param inChange Change that occurred
*/
- public void informSubscribers(byte inChange)
+ public static void informSubscribers(byte inChange)
{
+ // TODO: Launch separate thread so that whatever caused the inform can finish
+ if (!_enabled) return;
for (int i=0; i<_subscribers.length; i++)
{
if (_subscribers[i] != null)
}
}
}
+
+ /**
+ * Send message to all subscribers
+ * @param inMessage message to display informing of action completed
+ */
+ public static void informSubscribers(String inMessage)
+ {
+ if (!_enabled) return;
+ for (int i=0; i<_subscribers.length; i++)
+ {
+ if (_subscribers[i] != null)
+ {
+ _subscribers[i].actionCompleted(inMessage);
+ }
+ }
+ }
}