From 01bedac132e4333dabfe6f39448f8bc6ac5f0408 Mon Sep 17 00:00:00 2001 From: Martin Ritchie Date: Tue, 28 Nov 2006 16:26:40 +0000 Subject: QPID-122 Pulled _readable (_readableMessage) boolean up to AbstractJMSMessage.java and created (_readableProperties). Checks are now carried out to ensure that the message is readable/writable for the operation so that the correct exception can be thrown. As per the spec. clearBody() method had been implemented in AbstractJMSMessage.java to reset the _readableMessage as a result implementations must now implement clearBodyImpl() which is called before the _readableMessage is reset. Test updated to check that properties and body are correctly read/write set. git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@480119 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/client/message/AbstractJMSMessage.java | 85 ++++++++++++++++++++-- .../qpid/client/message/JMSBytesMessage.java | 28 +------ .../apache/qpid/client/message/JMSMapMessage.java | 17 ++++- .../qpid/client/message/JMSObjectMessage.java | 10 +-- .../apache/qpid/client/message/JMSTextMessage.java | 4 +- .../qpid/test/unit/basic/BytesMessageTest.java | 37 ++++++++++ .../qpid/test/unit/basic/MapMessageTest.java | 50 ++++++++++--- .../qpid/test/unit/basic/ObjectMessageTest.java | 52 ++++++++++--- .../qpid/test/unit/basic/TextMessageTest.java | 52 ++++++++++--- 9 files changed, 263 insertions(+), 72 deletions(-) (limited to 'java') diff --git a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java b/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java index 0c71b3f94c..a5b135da2d 100644 --- a/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java +++ b/java/client/src/main/java/org/apache/qpid/client/message/AbstractJMSMessage.java @@ -34,6 +34,8 @@ import org.apache.qpid.framing.PropertyFieldTable; import javax.jms.Destination; import javax.jms.JMSException; +import javax.jms.MessageNotReadableException; +import javax.jms.MessageNotWriteableException; import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; @@ -54,12 +56,14 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms public static final char LONG_PROPERTY_PREFIX = PropertyFieldTable.LONG_PROPERTY_PREFIX; public static final char FLOAT_PROPERTY_PREFIX = PropertyFieldTable.FLOAT_PROPERTY_PREFIX; public static final char DOUBLE_PROPERTY_PREFIX = PropertyFieldTable.DOUBLE_PROPERTY_PREFIX; - public static final char STRING_PROPERTY_PREFIX = PropertyFieldTable.STRING_PROPERTY_PREFIX ; + public static final char STRING_PROPERTY_PREFIX = PropertyFieldTable.STRING_PROPERTY_PREFIX; protected boolean _redelivered; protected ByteBuffer _data; + private boolean _readableProperties = false; + private boolean _readableMessage = false; protected AbstractJMSMessage(ByteBuffer data) { @@ -69,6 +73,8 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms { _data.acquire(); } + _readableProperties = (_contentHeaderProperties != null); + _readableMessage = (data != null); } protected AbstractJMSMessage(long deliveryTag, BasicContentHeaderProperties contentHeader, ByteBuffer data) throws AMQException @@ -79,6 +85,9 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms { _data.acquire(); } + + _readableProperties = (_contentHeaderProperties != null); + _readableMessage = data != null; } protected AbstractJMSMessage(BasicContentHeaderProperties contentHeader, long deliveryTag) @@ -170,7 +179,7 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms if (!(destination instanceof AMQDestination)) { throw new IllegalArgumentException("ReplyTo destination my be an AMQ destination - passed argument was type " + - destination.getClass()); + destination.getClass()); } final AMQDestination amqd = (AMQDestination) destination; @@ -216,9 +225,9 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms } public void setJMSType(String string) throws JMSException - { + { //throw new JMSException("Cannot set JMS Type - it is implicitly defined based on message type"); - // this is not spec comliant, should not throw the message + // this is not spec comliant, should not throw the message } public long getJMSExpiration() throws JMSException @@ -247,8 +256,17 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms { getJmsContentHeaderProperties().getHeaders().clear(); } + + _readableProperties = false; } + public void clearBody() throws JMSException + { + clearBodyImpl(); + _readableMessage = false; + } + + public boolean propertyExists(String propertyName) throws JMSException { checkPropertyName(propertyName); @@ -460,6 +478,7 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms public void setBooleanProperty(String propertyName, boolean b) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); //getJmsContentHeaderProperties().headers.put(BOOLEAN_PROPERTY_PREFIX + propertyName, Boolean.valueOf(b)); getJmsContentHeaderProperties().getHeaders().put(BOOLEAN_PROPERTY_PREFIX + propertyName, b ? new Long(1) : new Long(0)); @@ -467,42 +486,49 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms public void setByteProperty(String propertyName, byte b) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(BYTE_PROPERTY_PREFIX + propertyName, new Byte(b)); } public void setShortProperty(String propertyName, short i) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(SHORT_PROPERTY_PREFIX + propertyName, new Short(i)); } public void setIntProperty(String propertyName, int i) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(INT_PROPERTY_PREFIX + propertyName, new Integer(i)); } public void setLongProperty(String propertyName, long l) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(LONG_PROPERTY_PREFIX + propertyName, new Long(l)); } public void setFloatProperty(String propertyName, float f) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(FLOAT_PROPERTY_PREFIX + propertyName, new Float(f)); } public void setDoubleProperty(String propertyName, double v) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(DOUBLE_PROPERTY_PREFIX + propertyName, new Double(v)); } public void setStringProperty(String propertyName, String value) throws JMSException { + checkWritableProperties(); checkPropertyName(propertyName); getJmsContentHeaderProperties().getHeaders().put(STRING_PROPERTY_PREFIX + propertyName, value); } @@ -533,7 +559,13 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms } } - public abstract void clearBody() throws JMSException; + + /** + * This forces concrete classes to implement clearBody() + * + * @throws JMSException + */ + public abstract void clearBodyImpl() throws JMSException; /** * Get a String representation of the body of the message. Used in the @@ -604,7 +636,7 @@ public abstract class AbstractJMSMessage extends AMQMessage implements javax.jms break; default: buf.append("