package org.marketcetera.client.jms;
import java.io.Serializable;
import javax.jms.BytesMessage;
import javax.jms.ObjectMessage;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.marketcetera.util.log.SLF4JLoggerProxy;
import org.springframework.jms.support.converter.MessageConversionException;
import org.springframework.jms.support.converter.MessageConverter;
import quickfix.InvalidMessage;
public class JMSFIXMessageConverter implements MessageConverter {
private static final String FIX_PREAMBLE = "8=FIX"; //$NON-NLS-1$
boolean serializeToString = true;
public static final String BYTES_MESSAGE_CHARSET = "UTF-16"; //$NON-NLS-1$
public JMSFIXMessageConverter() {
}
public boolean isSerializeToString() {
return serializeToString;
}
public void setSerializeToString(boolean serializeToString) {
this.serializeToString = serializeToString;
}
public Object fromMessage(Message message) throws JMSException, MessageConversionException {
quickfix.Message qfMessage = null;
if(message instanceof TextMessage) {
SLF4JLoggerProxy.debug(this, "Received JMS msg: {}", message); //$NON-NLS-1$
// todo: handle validation when creating quickfix message
try {
qfMessage = new quickfix.Message(((TextMessage)message).getText());
} catch (InvalidMessage e) {
// bug #501 - want to log here
Messages.ERROR_JMS_MESSAGE_CONVERSION.error(this, e.getMessage());
throw new MessageConversionException(Messages.ERROR_JMS_MESSAGE_CONVERSION.getText(e.getMessage()), e);
}
} else if (message instanceof BytesMessage){
SLF4JLoggerProxy.debug(this, "Received JMS msg: {}", message); //$NON-NLS-1$
try {
BytesMessage bytesMessage = ((BytesMessage)message);
int length = (int)bytesMessage.getBodyLength();
byte [] buf = new byte[length];
bytesMessage.readBytes(buf);
String possibleString = new String(buf, BYTES_MESSAGE_CHARSET);
if (possibleString.startsWith(FIX_PREAMBLE)){
qfMessage = new quickfix.Message(possibleString);
}
} catch (Exception ex){
// bug #501 - want to log here
Messages.ERROR_JMS_MESSAGE_CONVERSION.error(this, ex.getMessage());
throw new MessageConversionException(Messages.ERROR_JMS_MESSAGE_CONVERSION.getText(ex.getMessage()), ex);
}
} else if (message instanceof ObjectMessage) {
return (quickfix.Message)((ObjectMessage)message).getObject();
}
return qfMessage;
}
/** Converts from the ORS to the JMS queue format - ie from a FIX Message -> JMS message */
public Message toMessage(Object message, Session session) throws JMSException, MessageConversionException {
javax.jms.Message jmsMessage = null;
if (serializeToString){
jmsMessage = session.createTextMessage(message.toString());
} else if (message instanceof Serializable) {
Serializable serializable = (Serializable) message;
jmsMessage = session.createObjectMessage(serializable);
}
return jmsMessage;
}
}