package org.cloudname.samples.service;
import java.util.ArrayList;
import java.util.List;
/**
* A simple publish/subscribe pattern to distribute events and log entries to the
* web socket stream.
*
* @author stalehd@gmail.com
*/
public class NotificationPublisher {
private List<String> allNotifications = new ArrayList<>();
/**
* Listener for subscriptions.
*/
public interface SubscriptionListener {
void onItemPublished(final String item);
}
private final List<SubscriptionListener> subscribers = new ArrayList<>();
private final Object syncObject = new Object();
/**
* Publish an item to subscribers.
*/
public void publish(final String item) {
synchronized (syncObject) {
allNotifications.add(item);
for (final SubscriptionListener listener : subscribers) {
try {
listener.onItemPublished(item);
} catch (final Exception ex) {
// ignore
}
}
}
}
/**
* Subscribe to events.
*/
public void subscribe(final SubscriptionListener listener) {
synchronized (syncObject) {
subscribers.add(listener);
// Resend old notifications
for (final String str : allNotifications) {
try {
listener.onItemPublished(str);
} catch (final Exception exception) {
// ignore
}
}
}
}
}