/*******************************************************************************
* Copyright (C) 2013, 2014, International Business Machines Corporation
* All Rights Reserved
*******************************************************************************/
package com.ibm.streamsx.messaging.jms;
import java.util.List;
import javax.jms.BytesMessage;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
//import com.ibm.rmi.corba.ObjectManager; ... not used
import com.ibm.streams.operator.Tuple;
import com.ibm.streams.operator.OutputTuple;
import com.ibm.streams.operator.Type.MetaType;
//Empty message class is used in JMSSink/JMSSource to send/receive
// control message to the JMSPorvider to test initial connectivity.
class EmptyMessageHandler extends JMSMessageHandlerImpl {
// Constructor
EmptyMessageHandler(List<NativeSchema> nativeSchemaObjects) {
super(nativeSchemaObjects);
}
// Used by JMSSink to convert an incoming tuple to JMS MEssage
public Message convertTupleToMessage(Tuple tuple, Session session) throws JMSException {
synchronized (session) {
// simply create a new JMSMEssage and return
return session.createMessage();
}
}
// Used by JMSSource to convert an incoming JMS Message to a tuple
public MessageAction convertMessageToTuple(Message message, OutputTuple tuple) {
MetaType attrType = tuple.getStreamSchema().getAttribute(0).getType().getMetaType();
// if the first attribute is a RString, encode message information into
// the rstring
if (attrType == MetaType.RSTRING) {
try {
String msgId = message.getJMSMessageID();
long expiration = message.getJMSExpiration();
String type = getMessageType(message);
String deliveryModeStr = getDeliveryMode(message);
// format is "messagetype, msgid, deliveryMode, expiration"
StringBuilder builder = new StringBuilder();
builder.append(type);
builder.append(","); //$NON-NLS-1$
builder.append(msgId);
builder.append(","); //$NON-NLS-1$
builder.append(deliveryModeStr);
builder.append(","); //$NON-NLS-1$
builder.append(expiration);
tuple.setString(0, builder.toString());
} catch (JMSException e) {
}
}
return MessageAction.SUCCESSFUL_MESSAGE;
}
private String getMessageType(Message message) {
if (message instanceof BytesMessage)
return "bytes"; //$NON-NLS-1$
else if (message instanceof StreamMessage)
return "streams"; //$NON-NLS-1$
else if (message instanceof MapMessage)
return "map"; //$NON-NLS-1$
else if (message instanceof TextMessage)
return "text"; //$NON-NLS-1$
else if (message instanceof ObjectMessage)
return "object"; //$NON-NLS-1$
else if (message instanceof Message)
return "empty"; //$NON-NLS-1$
return "unknown"; //$NON-NLS-1$
}
private String getDeliveryMode(Message message) {
String deliveryModeStr = "unknown"; //$NON-NLS-1$
int deliveryMode = -1;
try {
deliveryMode = message.getJMSDeliveryMode();
} catch (JMSException e) {
}
if (deliveryMode == DeliveryMode.NON_PERSISTENT) {
deliveryModeStr = "non_persistent"; //$NON-NLS-1$
} else if (deliveryMode == DeliveryMode.PERSISTENT) {
deliveryModeStr = "persistent"; //$NON-NLS-1$
}
return deliveryModeStr;
}
}