Skip to content

Instantly share code, notes, and snippets.

@nickman
Created May 20, 2011 13:13
Show Gist options
  • Save nickman/982859 to your computer and use it in GitHub Desktop.
Save nickman/982859 to your computer and use it in GitHub Desktop.
/**
* Creates a new JMS Message proxy
* @param message The JMS message
* @param connection The session used to create the browser
* @param destination The destination the browser is browsing
* @throws JMSException
*/
public ClosuredJMSMessage(Message message, Session session, Destination destination) throws JMSException {
this.message = message;
this.destination = destination;
this.session = session;
Set<String> propertyNames = new HashSet<String>();
result = new HashMap<String, Object>(64);
detached = (session==null);
result.put("detached", detached);
for(Enumeration<String> pNames = message.getPropertyNames(); pNames.hasMoreElements();) {
String pName = pNames.nextElement();
propertyNames.add(pName);
result.put(pName, message.getObjectProperty(pName));
}
result.put("Message", message);
result.put("JMSCorrelationID", message.getJMSCorrelationID());
result.put("JMSCorrelationIDAsBytes", message.getJMSCorrelationIDAsBytes());
result.put("JMSDeliveryMode", message.getJMSDeliveryMode());
result.put("JMSDestination", message.getJMSDestination());
result.put("JMSExpiration", message.getJMSExpiration());
result.put("JMSExpirationDate", new Date(message.getJMSExpiration()));
result.put("JMSMessageID", message.getJMSMessageID());
result.put("JMSPriority", message.getJMSPriority());
// JBossMessaging throws an exception here
try { result.put("JMSRedelivered", message.getJMSRedelivered()); } catch (Exception e) {}
result.put("JMSReplyTo", message.getJMSReplyTo());
result.put("JMSTimestamp", message.getJMSTimestamp());
result.put("JMSTimestampDate", new Date(message.getJMSTimestamp()));
result.put("JMSType", message.getJMSType());
Map<String, Object> jmsHeaders = new HashMap<String, Object>();
for(Map.Entry<String, Object> header: result.entrySet()) {
if(header.getKey().toLowerCase().startsWith("jms")) {
jmsHeaders.put(header.getKey(), header.getValue());
}
}
result.put("JMSHeaders", jmsHeaders);
result.put("PropertyNames", propertyNames.toArray(new String[propertyNames.size()]));
if(message instanceof TextMessage) {
result.put("Body", ((TextMessage)message).getText());
messageType = TextMessage.class;
} else if(message instanceof MapMessage) {
messageType = MapMessage.class;
MapMessage mapMsg = (MapMessage)message;
Map<String, Object> mapBody = new HashMap<String, Object>();
for(Enumeration<String> mapKeys = mapMsg.getMapNames(); mapKeys.hasMoreElements();) {
String mapKey = mapKeys.nextElement();
mapBody.put(mapKey, mapMsg.getObject(mapKey));
}
result.put("Body", mapBody);
} else if(message instanceof ObjectMessage) {
messageType = ObjectMessage.class;
result.put("Body", ((ObjectMessage)message).getObject());
}else if(message instanceof StreamMessage) {
messageType = StreamMessage.class;
result.put("Body", message);
} else if(message instanceof BytesMessage) {
messageType = BytesMessage.class;
BytesMessage bmsg = (BytesMessage)message;
long msgLength = bmsg.getBodyLength();
ByteArrayOutputStream baos = new ByteArrayOutputStream(msgLength<=Integer.MAX_VALUE ? (int)msgLength : Integer.MAX_VALUE);
byte[] buffer = new byte[8096];
int bytesRead = 0;
while((bytesRead = bmsg.readBytes(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
result.put("Body", baos.toByteArray());
} else {
// Header Only Message
messageType = Message.class;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment