package edu.harvard.mcb.leschziner.storage.localstorage; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import com.hazelcast.core.ICollection; import com.hazelcast.core.ItemEvent; import com.hazelcast.core.ItemEventType; import com.hazelcast.core.ItemListener; public class EventBlockingQueue<E> extends LinkedBlockingQueue<E> implements ICollection<E> { /** * */ private static final long serialVersionUID = -8333359858822876327L; private final String name; private final List<ItemListener<E>> listeners; public EventBlockingQueue(String name) { this.name = name; listeners = new LinkedList<ItemListener<E>>(); } @Override public void destroy() { // This isn't all that useful this.clear(); } @Override public Object getId() { return hashCode(); } @Override public InstanceType getInstanceType() { return InstanceType.QUEUE; } @Override public void addItemListener(ItemListener<E> arg0, boolean arg1) { listeners.add(arg0); } @Override public String getName() { return name; } @Override public void removeItemListener(ItemListener<E> arg0) { listeners.remove(arg0); } @Override public boolean add(E e) { if (super.add(e)) { // Notify listeners notifyListenersOfAdd(e); return true; } return false; } @Override public boolean addAll(Collection<? extends E> c) { if (super.addAll(c)) { // Notify listeners notifyListenersOfAdd(c); return true; } return false; } private void notifyListenersOfAdd(E added) { for (ItemListener<E> listener : listeners) { listener.itemAdded(new ItemEvent<E>("q:" + name, ItemEventType.ADDED, added)); } } private void notifyListenersOfAdd(Collection<? extends E> added) { for (E add : added) { notifyListenersOfAdd(add); } } }