package org.openamq.client.message; import org.openamq.framing.BasicContentHeaderProperties; import org.openamq.AMQException; import org.apache.mina.common.ByteBuffer; import javax.jms.JMSException; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.CharacterCodingException; public class JMSTextMessage extends AbstractJMSMessage implements javax.jms.TextMessage { private static final String MIME_TYPE = "text/plain"; private String _decodedValue; JMSTextMessage() throws JMSException { this(null, null); } JMSTextMessage(ByteBuffer data, String encoding) throws JMSException { super(data); // this instantiates a content header getJmsContentHeaderProperties().setContentType(MIME_TYPE); getJmsContentHeaderProperties().setEncoding(encoding); } JMSTextMessage(long deliveryTag, ByteBuffer data, BasicContentHeaderProperties contentHeader) throws AMQException { super(deliveryTag, contentHeader, data); contentHeader.setContentType(MIME_TYPE); _data = data; } JMSTextMessage(ByteBuffer data) throws JMSException { this(data, null); } JMSTextMessage(String text) throws JMSException { super((ByteBuffer)null); setText(text); } public void clearBody() throws JMSException { if (_data != null) { _data.release(); } _data = null; _decodedValue = null; } public String toBodyString() throws JMSException { return getText(); } public void setData(ByteBuffer data) { _data = data; } public String getMimeType() { return MIME_TYPE; } public void setText(String string) throws JMSException { clearBody(); try { _data = ByteBuffer.allocate(string.length()); _data.limit(string.length()); //_data.sweep(); _data.setAutoExpand(true); if (getJmsContentHeaderProperties().getEncoding() == null) { _data.put(string.getBytes()); } else { _data.put(string.getBytes(getJmsContentHeaderProperties().getEncoding())); } _decodedValue = string; } catch (UnsupportedEncodingException e) { // should never occur throw new JMSException("Unable to decode string data"); } } public String getText() throws JMSException { if (_data == null && _decodedValue == null) { return null; } else if (_decodedValue != null) { return _decodedValue; } else { _data.rewind(); if (getJmsContentHeaderProperties().getEncoding() != null) { try { _decodedValue = _data.getString(Charset.forName(getJmsContentHeaderProperties().getEncoding()).newDecoder()); } catch (CharacterCodingException e) { JMSException je = new JMSException("Could not decode string data: " + e); je.setLinkedException(e); throw je; } } else { try { _decodedValue = _data.getString(Charset.defaultCharset().newDecoder()); } catch (CharacterCodingException e) { JMSException je = new JMSException("Could not decode string data: " + e); je.setLinkedException(e); throw je; } } return _decodedValue; } } }