blob: 44b971b6a0bb08285a83cfc374dc509953a0f156 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.qpid.client.message;
import org.apache.qpid.QpidException;
import org.apache.qpid.client.CustomJMSXProperty;
import org.apache.qpid.client.util.JMSExceptionHelper;
import javax.jms.JMSException;
import javax.jms.MessageFormatException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class JMSTextMessage extends AbstractJMSMessage implements javax.jms.TextMessage
{
private static final String MIME_TYPE = "text/plain";
private Exception _exception;
private String _decodedValue;
/**
* This constant represents the name of a property that is set when the message payload is null.
*/
private static final String PAYLOAD_NULL_PROPERTY = CustomJMSXProperty.JMS_AMQP_NULL.toString();
private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private CharsetDecoder _decoder = DEFAULT_CHARSET.newDecoder();
private CharsetEncoder _encoder = DEFAULT_CHARSET.newEncoder();
private static final ByteBuffer EMPTY_BYTE_BUFFER = ByteBuffer.allocate(0);
public JMSTextMessage(AMQMessageDelegateFactory delegateFactory) throws JMSException
{
super(delegateFactory, false); // this instantiates a content header
}
JMSTextMessage(AMQMessageDelegate delegate, ByteBuffer data)
throws QpidException
{
super(delegate, data!=null);
try
{
if(propertyExists(PAYLOAD_NULL_PROPERTY))
{
_decodedValue = null;
}
else
{
_decodedValue = _decoder.decode(data).toString();
}
}
catch (CharacterCodingException e)
{
_exception = e;
}
catch (JMSException e)
{
_exception = e;
}
}
public String toBodyString() throws JMSException
{
return getText();
}
protected String getMimeType()
{
return MIME_TYPE;
}
@Override
public ByteBuffer getData() throws JMSException
{
_encoder.reset();
try
{
if(_exception != null)
{
throw JMSExceptionHelper.chainJMSException(new MessageFormatException("Cannot decode original message"),
_exception);
}
else if(_decodedValue == null)
{
return EMPTY_BYTE_BUFFER;
}
else
{
return _encoder.encode(CharBuffer.wrap(_decodedValue));
}
}
catch (CharacterCodingException e)
{
throw JMSExceptionHelper.chainJMSException(new JMSException("Cannot encode string in UFT-8: "
+ _decodedValue), e);
}
}
@Override
public void clearBody() throws JMSException
{
super.clearBody();
_decodedValue = null;
_exception = null;
}
public void setText(String text) throws JMSException
{
checkWritable();
clearBody();
_decodedValue = text;
}
public String getText() throws JMSException
{
return _decodedValue;
}
@Override
public void prepareForSending() throws JMSException
{
super.prepareForSending();
if (_decodedValue == null)
{
setBooleanProperty(PAYLOAD_NULL_PROPERTY, true);
}
else
{
removeProperty(PAYLOAD_NULL_PROPERTY);
}
}
}