package org.marketcetera.core.notifications;
import java.util.concurrent.ExecutionException;
import org.marketcetera.core.ClassVersion;
import org.marketcetera.core.publisher.ISubscriber;
import org.marketcetera.core.publisher.PublisherEngine;
import org.marketcetera.util.log.SLF4JLoggerProxy;
/* $License$ */
/**
* Collects and dispenses <code>INotification</code> objects produced.
*
* <p>This implementation is responsible for collating and distributing <code>INotification</code>
* objects generated. Objects interested in receiving <code>INotification</code> objects should
* register for them as follows:
* <pre>
* NotificationManager.getNotificationManager().subscribe(ISubscriber);
* </pre>
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: NotificationManager.java 16841 2014-02-20 19:59:04Z colin $
* @since 0.8.0
*/
@ClassVersion("$Id: NotificationManager.java 16841 2014-02-20 19:59:04Z colin $")
public class NotificationManager
implements INotificationManager
{
/**
* singleton instance of <code>NotificationManager</code>
*/
private static final INotificationManager sNotificationManager = new NotificationManager();
/**
* manages subscriptions and publications
*/
private final PublisherEngine mPublisher = new PublisherEngine();
/**
* Gets the <code>INotificationManager</code> instance.
*
* @return an <code>INotificationManager</code> value
*/
public static INotificationManager getNotificationManager()
{
return sNotificationManager;
}
/**
* Create a new NotificationManager instance.
*/
private NotificationManager()
{
// create a special subscriber that is notified of every publication
subscribe(new NotificationLogger());
}
/* (non-Javadoc)
* @see org.marketcetera.core.notifications.INotificationManager#subscribe(org.marketcetera.core.publisher.ISubscriber)
*/
@Override
public void subscribe(ISubscriber inSubscriber)
{
mPublisher.subscribe(inSubscriber);
}
/* (non-Javadoc)
* @see org.marketcetera.core.notifications.INotificationManager#unsubscribe(org.marketcetera.core.publisher.ISubscriber)
*/
@Override
public void unsubscribe(ISubscriber inSubscriber)
{
mPublisher.unsubscribe(inSubscriber);
}
/* (non-Javadoc)
* @see org.marketcetera.core.notifications.INotificationManager#publish(org.marketcetera.core.notifications.INotification)
*/
@Override
public void publish(INotification inNotification)
{
getPublisher().publish(inNotification);
}
/* (non-Javadoc)
* @see org.marketcetera.core.publisher.IPublisher#publishAndWait(java.lang.Object)
*/
@Override
public void publishAndWait(Object inData)
throws InterruptedException, ExecutionException
{
getPublisher().publishAndWait(inData);
}
/* (non-Javadoc)
* @see org.marketcetera.core.publisher.IPublisher#publish(java.lang.Object)
*/
@Override
public void publish(Object inData)
{
getPublisher().publish(inData);
}
/* (non-Javadoc)
* @see org.marketcetera.core.publisher.IPublisher#getSubscriptionCount()
*/
@Override
public int getSubscriptionCount()
{
return mPublisher.getSubscriptionCount();
}
/**
* Gets the <code>PublisherEngine</code> for this object.
*
* @return a <code>PublisherEngine</code> value
*/
private PublisherEngine getPublisher()
{
return mPublisher;
}
/**
* Logs all notifications to a particular logger category.
*
* <p>All notifications are logged at <code>INFO</code> level to
* <code>org.marketcetera.notifications.log</code>.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: NotificationManager.java 16841 2014-02-20 19:59:04Z colin $
* @since 0.8.0
*/
@ClassVersion("$Id: NotificationManager.java 16841 2014-02-20 19:59:04Z colin $") //$NON-NLS-1$
private static class NotificationLogger
implements ISubscriber
{
/**
* the special category to use for notifications
*/
private static final String CATEGORY = "notifications.log"; //$NON-NLS-1$
/* (non-Javadoc)
* @see org.marketcetera.core.publisher.ISubscriber#isInteresting(java.lang.Object)
*/
@Override
public boolean isInteresting(Object inData)
{
return inData instanceof INotification;
}
/* (non-Javadoc)
* @see org.marketcetera.core.publisher.ISubscriber#publishTo(java.lang.Object)
*/
@Override
public void publishTo(Object inData)
{
SLF4JLoggerProxy.info(CATEGORY,
inData.toString());
}
}
}