/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.transport;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsg;
import com.opengamma.transport.jms.JmsByteArrayRequestSender;
import com.opengamma.transport.jms.JmsEndPointDescriptionProvider;
import com.opengamma.transport.socket.SocketEndPointDescriptionProvider;
import com.opengamma.transport.socket.SocketFudgeRequestSender;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.SingletonFactoryBean;
import com.opengamma.util.jms.JmsConnector;
/**
* Creates a {@link FudgeRequestSender} based on an end-point description. An end-point could be a determined at runtime by a REST request to another host, or specified statically. Examples of end
* points include TCP/IP host/socket pairs, REST URLs, and JMS topic names.
*/
public class FudgeRequestSenderFactoryBean extends SingletonFactoryBean<FudgeRequestSender> {
private FudgeContext _fudgeContext;
private EndPointDescriptionProvider _endPointDescriptionProvider;
private JmsConnector _jmsConnector;
public void setFudgeContext(final FudgeContext fudgeContext) {
_fudgeContext = fudgeContext;
}
public FudgeContext getFudgeContext() {
return _fudgeContext;
}
public void setEndPointDescription(final EndPointDescriptionProvider endPoint) {
_endPointDescriptionProvider = endPoint;
}
public EndPointDescriptionProvider getEndPointDescription() {
return _endPointDescriptionProvider;
}
public void setJmsConnector(final JmsConnector jmsConnector) {
_jmsConnector = jmsConnector;
}
public JmsConnector getJmsConnector() {
return _jmsConnector;
}
private FudgeMsg resolveEndPointDescription() {
if (_endPointDescriptionProvider != null) {
ArgumentChecker.notNullInjected(getFudgeContext(), "fudgeContext");
return _endPointDescriptionProvider.getEndPointDescription(getFudgeContext());
} else {
return null;
}
}
private FudgeRequestSender createSocketFudgeRequestSender(final FudgeMsg endPoint) {
final SocketFudgeRequestSender sender = new SocketFudgeRequestSender(getFudgeContext());
sender.setServer(endPoint);
return sender;
}
private FudgeRequestSender createJmsFudgeRequestSender(final FudgeMsg endPoint) {
ArgumentChecker.notNullInjected(getJmsConnector(), "jmsConnector");
final String topic = endPoint.getString(JmsEndPointDescriptionProvider.TOPIC_KEY);
return new ByteArrayFudgeRequestSender(new JmsByteArrayRequestSender(topic, getJmsConnector().getJmsTemplateTopic()), getFudgeContext());
}
@Override
protected FudgeRequestSender createObject() {
final FudgeMsg endPoint = resolveEndPointDescription();
ArgumentChecker.notNullInjected(endPoint, "endPointDescription");
if (SocketEndPointDescriptionProvider.TYPE_VALUE.equals(endPoint.getString(SocketEndPointDescriptionProvider.TYPE_KEY))) {
return createSocketFudgeRequestSender(endPoint);
}
if (JmsEndPointDescriptionProvider.TYPE_VALUE.equals(endPoint.getString(JmsEndPointDescriptionProvider.TYPE_KEY))) {
return createJmsFudgeRequestSender(endPoint);
}
throw new IllegalArgumentException("Don't know how to create end-point " + endPoint);
}
}