package org.prevayler.implementation.publishing; import org.prevayler.foundation.Cool; import org.prevayler.implementation.TransactionTimestamp; import java.util.LinkedList; /** * An assyncronous buffer for transaction subscribers. */ public class POBox implements TransactionSubscriber, Runnable { private final LinkedList _queue=new LinkedList(); private final TransactionSubscriber _delegate; private final Object _emptynessMonitor=new Object(); public POBox( TransactionSubscriber delegate){ _delegate=delegate; Cool.startDaemon(this); } public synchronized void receive( TransactionTimestamp transactionTimestamp){ _queue.add(transactionTimestamp); notify(); } public void run(){ while (true) { TransactionTimestamp notification=waitForNotification(); _delegate.receive(notification); } } private synchronized TransactionTimestamp waitForNotification(){ while (_queue.size() == 0) { synchronized (_emptynessMonitor) { _emptynessMonitor.notify(); } Cool.wait(this); } return (TransactionTimestamp)_queue.removeFirst(); } public void waitToEmpty(){ synchronized (_emptynessMonitor) { while (_queue.size() != 0) Cool.wait(_emptynessMonitor); } } }