package org.marketcetera.core.publisher;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
/**
* Test implementation of {@link ISubscriber}.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: MockSubscriber.java 16154 2012-07-14 16:34:05Z colin $
* @since 0.43-SNAPSHOT
*/
public class MockSubscriber
implements ISubscriber
{
private boolean mInteresting = false;
private volatile Object mData = null;
private boolean mInterestingThrows = false;
private boolean mPublishThrows = false;
private int mCounter = 0;
private static int sCounter = 0;
private int mPublishCount = 0;
private List<Object> mPublications;
private volatile Thread mPublishThread = null;
private volatile Semaphore mReleaseSemaphore = null;
private volatile Semaphore mAcquireSemaphore = null;
public MockSubscriber()
{
this(true,
false,
false);
}
public MockSubscriber(boolean inInteresting,
boolean inInterestingThrows,
boolean inPublishThrows)
{
mInteresting = inInteresting;
mInterestingThrows = inInterestingThrows;
mPublishThrows = inPublishThrows;
mPublications = new ArrayList<Object>();
}
public boolean isInteresting(Object inData)
{
if(mInterestingThrows) {
throw new NullPointerException("This exception is expected"); //$NON-NLS-1$
}
return mInteresting;
}
public void publishTo(Object inData)
{
if(mAcquireSemaphore != null) {
try {
mAcquireSemaphore.acquire();
} catch (InterruptedException ignore) {
}
}
if(mPublishThrows) {
throw new NullPointerException("This exception is expected"); //$NON-NLS-1$
}
mData = inData;
mCounter = ++sCounter;
mPublishCount += 1;
mPublications.add(inData);
mPublishThread = Thread.currentThread();
if(mReleaseSemaphore != null) {
mReleaseSemaphore.release();
}
}
public int getPublishCount()
{
return mPublishCount;
}
public int getCounter()
{
return mCounter;
}
public Object getData()
{
return mData;
}
public boolean getInteresting()
{
return mInteresting;
}
public boolean getInterestingThrows()
{
return mInterestingThrows;
}
public boolean getPublishThrows()
{
return mPublishThrows;
}
public void setData(Object inData)
{
mData = inData;
}
public void setInteresting(boolean inInteresting)
{
mInteresting = inInteresting;
}
public void setInterestingThrows(boolean inInterestingThrows)
{
mInterestingThrows = inInterestingThrows;
}
public void setPublishThrows(boolean inPublishThrows)
{
mPublishThrows = inPublishThrows;
}
public List<Object> getPublications()
{
return mPublications;
}
public Thread getPublishThread()
{
return mPublishThread;
}
public void setReleaseSemaphore(Semaphore inReleaseSemaphore)
{
mReleaseSemaphore = inReleaseSemaphore;
}
public void setAcquireSemaphore(Semaphore inAcquireSemaphore)
{
mAcquireSemaphore = inAcquireSemaphore;
}
/**
* Sets the publishCount value.
*
* @param inPublishCount publish count value.
*/
public void setPublishCount(int inPublishCount)
{
mPublishCount = inPublishCount;
}
/**
* Resets the data collectors.
*
* <p>After calling this method, the subscriber will be returned
* to its initial creation state.
*/
public void reset()
{
setPublishCount(0);
setData(null);
mPublications.clear();
mPublishThread = null;
mReleaseSemaphore = null;
mAcquireSemaphore = null;
}
}