package org.openamq.client.message; import org.openamq.AMQException; import org.openamq.framing.ContentHeaderBody; import org.openamq.framing.ContentBody; import org.openamq.framing.BasicContentHeaderProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.mina.common.ByteBuffer; import javax.jms.JMSException; import java.util.List; import java.util.Iterator; public abstract class AbstractJMSMessageFactory implements MessageFactory { private static final Logger _logger = LoggerFactory.getLogger(AbstractJMSMessageFactory.class); protected abstract AbstractJMSMessage createMessage(long messageNbr, ByteBuffer data, ContentHeaderBody contentHeader) throws AMQException; protected AbstractJMSMessage createMessageWithBody(long messageNbr, ContentHeaderBody contentHeader, List bodies) throws AMQException { ByteBuffer data; // we optimise the non-fragmented case to avoid copying if (bodies != null && bodies.size() == 1) { _logger.debug("Non-fragmented message body (bodySize=" + contentHeader.bodySize +")"); data = ((ContentBody)bodies.get(0)).payload; } else { _logger.debug("Fragmented message body (" + bodies.size() + " frames, bodySize=" + contentHeader.bodySize + ")"); data = ByteBuffer.allocate((int)contentHeader.bodySize); final Iterator it = bodies.iterator(); while (it.hasNext()) { ContentBody cb = (ContentBody) it.next(); data.put(cb.payload); cb.payload.release(); } data.flip(); } _logger.debug("Creating message from buffer with position=" + data.position() + " and remaining=" + data.remaining()); return createMessage(messageNbr, data, contentHeader); } public AbstractJMSMessage createMessage(long messageNbr, boolean redelivered, ContentHeaderBody contentHeader, List bodies) throws JMSException, AMQException { final AbstractJMSMessage msg = createMessageWithBody(messageNbr, contentHeader, bodies); msg.setJMSRedelivered(redelivered); return msg; } }