/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata.live;
import java.util.Set;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.FudgeMsgEnvelope;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.Lifecycle;
import com.opengamma.id.ExternalScheme;
import com.opengamma.transport.ByteArrayFudgeMessageReceiver;
import com.opengamma.transport.FudgeMessageReceiver;
import com.opengamma.transport.jms.JmsByteArrayMessageDispatcher;
import com.opengamma.util.jms.JmsConnector;
import com.opengamma.util.jms.JmsTopicContainer;
/**
* Listens to JMS messages announcing that market data providers have become available and invokes
* {@link #notificationReceived}.
*/
/* package */ abstract class AvailabilityNotificationListener implements Lifecycle {
/** Logger */
private static final Logger s_logger = LoggerFactory.getLogger(LiveDataAvailabilityNotificationListener.class);
/** For receiving JMS messages. */
private final JmsTopicContainer _jmsTopicContainer;
/**
* @param topic The topic for {@link MarketDataAvailabilityNotification} messages
* @param jmsConnector For receiving JMS messages
*/
public AvailabilityNotificationListener(String topic, JmsConnector jmsConnector) {
ByteArrayFudgeMessageReceiver receiver = new ByteArrayFudgeMessageReceiver(new Receiver());
JmsByteArrayMessageDispatcher dispatcher = new JmsByteArrayMessageDispatcher(receiver);
_jmsTopicContainer = jmsConnector.getTopicContainerFactory().create(topic, dispatcher);
}
@Override
public void start() {
_jmsTopicContainer.start();
}
@Override
public void stop() {
_jmsTopicContainer.stop();
}
@Override
public boolean isRunning() {
return _jmsTopicContainer.isRunning();
}
/**
* Invoked when notification is received that a market data provider is available.
* @param schemes The schemes handled by the newly available provider
*/
protected abstract void notificationReceived(Set<ExternalScheme> schemes);
/**
* Receives {@link MarketDataAvailabilityNotification}s via Fudge and calls {@link LiveDataFactory#resubscribe}
* on each of its factories.
*/
private final class Receiver implements FudgeMessageReceiver {
@Override
public void messageReceived(FudgeContext fudgeContext, FudgeMsgEnvelope msgEnvelope) {
FudgeDeserializer deserializer = new FudgeDeserializer(fudgeContext);
FudgeMsg msg = msgEnvelope.getMessage();
MarketDataAvailabilityNotification notification =
deserializer.fudgeMsgToObject(MarketDataAvailabilityNotification.class, msg);
s_logger.info("Received notification of market data availability: {}", notification);
Set<ExternalScheme> schemes = notification.getSchemes();
notificationReceived(schemes);
}
}
}