blob: 9f9c5a699e5e4a56fd114f6f6b3c31566dacf416 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
******************************************************************************/
package org.eclipse.scout.rt.server.jms;
import javax.jms.BytesMessage;
import javax.jms.Message;
import javax.jms.Session;
import org.eclipse.scout.commons.logger.IScoutLogger;
import org.eclipse.scout.commons.logger.ScoutLogManager;
import org.eclipse.scout.commons.serialization.IObjectSerializer;
import org.eclipse.scout.commons.serialization.SerializationUtility;
public class JmsMessageSerializer<T> implements IJmsMessageSerializer<T> {
private static IScoutLogger LOG = ScoutLogManager.getLogger(JmsMessageSerializer.class);
// Property name to save the message content on a JMS message - only used for logging/debug reasons.
private static final String JMS_PROPERTY_TRACE_MESSAGE_CONTENT = "traceMessageContent";
private final IObjectSerializer m_objectSerializer;
private final Class<T> m_messageType;
public JmsMessageSerializer(Class<T> messageType) {
this(SerializationUtility.createObjectSerializer(), messageType);
}
protected JmsMessageSerializer(IObjectSerializer objectSerializer, Class<T> messageType) {
super();
m_objectSerializer = objectSerializer;
m_messageType = messageType;
}
protected Class<T> getMessageType() {
return m_messageType;
}
protected IObjectSerializer getObjectSerializer() {
return m_objectSerializer;
}
@Override
public Message createMessage(T message, Session session) throws Exception {
if (LOG.isTraceEnabled()) {
LOG.trace("creating JMS message: msgContent={0}", message);
}
BytesMessage jmsMessage = session.createBytesMessage();
jmsMessage.writeBytes(getObjectSerializer().serialize(message));
if (LOG.isTraceEnabled()) {
jmsMessage.setStringProperty(JMS_PROPERTY_TRACE_MESSAGE_CONTENT, message.toString());
}
return jmsMessage;
}
@Override
public T extractMessage(Message jmsMessage) throws Exception {
if (LOG.isTraceEnabled()) {
LOG.trace("extracting JMS message: jmsMessageId={0}, messageContent={1}", jmsMessage.getJMSMessageID(), jmsMessage.getStringProperty(JMS_PROPERTY_TRACE_MESSAGE_CONTENT));
}
if (!(jmsMessage instanceof BytesMessage)) {
LOG.warn("Received unexpect message content. Ignored.");
return null;
}
BytesMessage bm = (BytesMessage) jmsMessage;
long bodyLength = bm.getBodyLength();
if (bodyLength == Integer.MAX_VALUE) {
LOG.warn("received empty BytesMessage");
}
else if (bodyLength > Integer.MAX_VALUE) {
LOG.warn("received BytesMessage is too large (length = " + bodyLength + ")");
}
else {
byte[] buffer = new byte[(int) bodyLength];
bm.readBytes(buffer);
return getObjectSerializer().deserialize(buffer, getMessageType());
}
return null;
}
}