You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2013/12/03 14:11:23 UTC

svn commit: r1547375 - in /qpid/jms/trunk/src: main/java/org/apache/qpid/jms/engine/ test/java/org/apache/qpid/jms/engine/ test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/

Author: robbie
Date: Tue Dec  3 13:11:23 2013
New Revision: 1547375

URL: http://svn.apache.org/r1547375
Log:
QPIDJMS-9: update handling of TextMessage created from data section

Modified:
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpTextMessage.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpBytesMessageTest.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpTextMessageTest.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/DataDescribedType.java

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpTextMessage.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpTextMessage.java?rev=1547375&r1=1547374&r2=1547375&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpTextMessage.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpTextMessage.java Tue Dec  3 13:11:23 2013
@@ -19,17 +19,25 @@
 package org.apache.qpid.jms.engine;
 
 import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
 
+import javax.jms.JMSException;
+
+import org.apache.qpid.jms.impl.QpidJmsException;
 import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.messaging.AmqpValue;
 import org.apache.qpid.proton.amqp.messaging.Data;
 import org.apache.qpid.proton.amqp.messaging.Section;
-import org.apache.qpid.proton.codec.impl.DataImpl;
 import org.apache.qpid.proton.engine.Delivery;
 import org.apache.qpid.proton.message.Message;
 
 public class AmqpTextMessage extends AmqpMessage
 {
+    private static final String UTF_8 = "UTF-8";
+
     /**
      * Content type, only to be used when message uses a data
      * body section, and not when using an amqp-value body section
@@ -42,6 +50,8 @@ public class AmqpTextMessage extends Amq
      */
     public static final String MSG_TYPE_ANNOTATION_VALUE = "TextMessage";
 
+    private CharsetDecoder _decoder =  Charset.forName(UTF_8).newDecoder();
+
     public AmqpTextMessage()
     {
         super();
@@ -64,8 +74,9 @@ public class AmqpTextMessage extends Amq
 
     /**
      * @throws IllegalStateException if the underlying message content can't be retrieved as a String or null
+     * @throws JMSException if the message can't be decoded
      */
-    public String getText() throws IllegalStateException
+    public String getText() throws IllegalStateException, JMSException
     {
         Section body = getMessage().getBody();
 
@@ -78,23 +89,22 @@ public class AmqpTextMessage extends Amq
             Data data = (Data) body;
             if(data.getValue() == null || data.getValue().getLength() == 0)
             {
-                return null;
+                return "";
             }
             else
             {
                 Binary b = data.getValue();
-
                 ByteBuffer buf = ByteBuffer.wrap(b.getArray(), b.getArrayOffset(), b.getLength());
-                org.apache.qpid.proton.codec.Data codecData = new DataImpl();
-                codecData.decode(buf);
 
-                if(codecData.isNull())
+                try
                 {
-                    return null;
+                    CharBuffer chars = _decoder.decode(buf);
+                    return String.valueOf(chars);
                 }
-                else
+                catch (CharacterCodingException e)
                 {
-                    return codecData.getString();
+                    JMSException jmsException = new QpidJmsException("Cannot decode String in UFT-8", e);
+                    throw jmsException;
                 }
             }
 

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpBytesMessageTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpBytesMessageTest.java?rev=1547375&r1=1547374&r2=1547375&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpBytesMessageTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpBytesMessageTest.java Tue Dec  3 13:11:23 2013
@@ -180,7 +180,7 @@ public class AmqpBytesMessageTest extend
     }
 
     @Test
-    public void testGetTextUsingReceivedMessageWithDataSectionContainingNullReturnsEmptyBAIS() throws Exception
+    public void testGetTextUsingReceivedMessageWithDataSectionContainingNothingReturnsEmptyBAIS() throws Exception
     {
         Message message = Proton.message();
         message.setBody(new Data(null));

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpTextMessageTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpTextMessageTest.java?rev=1547375&r1=1547374&r2=1547375&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpTextMessageTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpTextMessageTest.java Tue Dec  3 13:11:23 2013
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 
 import org.apache.qpid.jms.QpidJmsTestCase;
@@ -44,6 +45,7 @@ import org.mockito.Mockito;
 
 public class AmqpTextMessageTest extends QpidJmsTestCase
 {
+    private static final String UTF_8 = "UTF-8";
     private AmqpConnection _mockAmqpConnection;
     private Delivery _mockDelivery;
 
@@ -120,40 +122,18 @@ public class AmqpTextMessageTest extends
     }
 
     @Test
-    public void testGetTextUsingReceivedMessageWithDataSectionContainingNullReturnsNull() throws Exception
+    public void testGetTextUsingReceivedMessageWithDataSectionContainingNothingReturnsEmptyString() throws Exception
     {
         Message message = Proton.message();
         message.setBody(new Data(null));
 
         AmqpTextMessage amqpTextMessage = new AmqpTextMessage(_mockDelivery, message, _mockAmqpConnection);
 
-        assertNull("expected null string", amqpTextMessage.getText());
+        assertEquals("expected zero-length string", "", amqpTextMessage.getText());
     }
 
     @Test
-    public void testGetTextUsingReceivedMessageWithDataSectionContainingBinaryEncodedNullReturnsNull() throws Exception
-    {
-        org.apache.qpid.proton.codec.Data nullData = new DataImpl();
-        nullData.putNull();
-        Binary stringBinary = nullData.encode();
-
-        org.apache.qpid.proton.codec.Data payloadData = new DataImpl();
-        payloadData.putDescribedType(new DataDescribedType(stringBinary));
-        Binary b = payloadData.encode();
-
-        System.out.println("Using encoded AMQP message payload: " + b);
-
-        Message message = Proton.message();
-        int decoded = message.decode(b.getArray(), b.getArrayOffset(), b.getLength());
-        assertEquals(decoded, b.getLength());
-
-        AmqpTextMessage amqpTextMessage = new AmqpTextMessage(_mockDelivery, message, _mockAmqpConnection);
-
-        assertNull("expected null string", amqpTextMessage.getText());
-    }
-
-    @Test
-    public void testGetTextUsingReceivedMessageWithDataSectionContainingZeroLengthBinaryReturnsNull() throws Exception
+    public void testGetTextUsingReceivedMessageWithDataSectionContainingZeroLengthBinaryReturnsEmptyString() throws Exception
     {
         org.apache.qpid.proton.codec.Data payloadData = new DataImpl();
         payloadData.putDescribedType(new DataDescribedType(new Binary(new byte[0])));
@@ -166,20 +146,17 @@ public class AmqpTextMessageTest extends
         assertEquals(decoded, b.getLength());
         AmqpTextMessage amqpTextMessage = new AmqpTextMessage(_mockDelivery, message, _mockAmqpConnection);
 
-        assertNull("expected null string", amqpTextMessage.getText());
+        assertEquals("expected zero-length string", "", amqpTextMessage.getText());
     }
 
     @Test
-    public void testGetTextUsingReceivedMessageWithDataSectionContainingEncodedString() throws Exception
+    public void testGetTextUsingReceivedMessageWithDataSectionContainingStringBytes() throws Exception
     {
         String encodedString = "myEncodedString";
-
-        org.apache.qpid.proton.codec.Data stringData = new DataImpl();
-        stringData.putString(encodedString);
-        Binary stringBinary = stringData.encode();
+        byte[] encodedBytes = encodedString.getBytes(Charset.forName(UTF_8));
 
         org.apache.qpid.proton.codec.Data payloadData = new DataImpl();
-        payloadData.putDescribedType(new DataDescribedType(stringBinary));
+        payloadData.putDescribedType(new DataDescribedType(new Binary(encodedBytes)));
         Binary b = payloadData.encode();
 
         System.out.println("Using encoded AMQP message payload: " + b);
@@ -227,34 +204,4 @@ public class AmqpTextMessageTest extends
             //expected
         }
     }
-
-    @Test
-    public void testGetTextWithDataSectionContainingNonNullNonStringContentThrowsISE() throws Exception
-    {
-        org.apache.qpid.proton.codec.Data booleanData = new DataImpl();
-        booleanData.putBoolean(true);
-        Binary booleanBinary = booleanData.encode();
-
-        org.apache.qpid.proton.codec.Data payloadData = new DataImpl();
-        payloadData.putDescribedType(new DataDescribedType(booleanBinary));
-        Binary b = payloadData.encode();
-
-        System.out.println("Using encoded AMQP message payload: " + b);
-
-        Message message = Proton.message();
-        int decoded = message.decode(b.getArray(), b.getArrayOffset(), b.getLength());
-        assertEquals(decoded, b.getLength());
-
-        AmqpTextMessage amqpTextMessage = new AmqpTextMessage(_mockDelivery, message, _mockAmqpConnection);
-
-        try
-        {
-            amqpTextMessage.getText();
-            fail("expected exception not thrown");
-        }
-        catch(IllegalStateException ise)
-        {
-            //expected
-        }
-    }
 }

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/DataDescribedType.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/DataDescribedType.java?rev=1547375&r1=1547374&r2=1547375&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/DataDescribedType.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/test/testpeer/describedtypes/sections/DataDescribedType.java Tue Dec  3 13:11:23 2013
@@ -31,6 +31,11 @@ public class DataDescribedType implement
 
     public DataDescribedType(Binary described)
     {
+        if(described == null)
+        {
+            throw new IllegalArgumentException("provided Binary must not be null");
+        }
+
         _described = described;
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org