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/11/28 18:16:15 UTC

svn commit: r1546400 - in /qpid/jms/trunk/src: main/java/org/apache/qpid/jms/engine/AmqpMessage.java test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java

Author: robbie
Date: Thu Nov 28 17:16:15 2013
New Revision: 1546400

URL: http://svn.apache.org/r1546400
Log:
QPIDJMS-9: rework message-annotation methods, change method keys to be in terms of strings, add unit testing

Modified:
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java?rev=1546400&r1=1546399&r2=1546400&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java Thu Nov 28 17:16:15 2013
@@ -22,10 +22,12 @@ package org.apache.qpid.jms.engine;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.qpid.proton.Proton;
+import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.messaging.Accepted;
 import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
 import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
@@ -133,66 +135,91 @@ public abstract class AmqpMessage
 
     //===== MessageAnnotations ======
 
-    public boolean messageAnnotationExists(Object key)
+    /**
+     * @param keyName The name of the symbol key
+     * @return true if an annotation exists with the provided symbol name, false otherwise
+     */
+    public boolean messageAnnotationExists(String keyName)
     {
-        //TODO: this isn't thread-safe, does it need to be?
-        Map<Object,Object> msgAnnotations = _messageAnnotationsMap;
-        if(msgAnnotations == null)
+        if(_messageAnnotationsMap == null)
         {
             return false;
         }
 
-        return msgAnnotations.containsKey(key);
+        return _messageAnnotationsMap.containsKey(Symbol.valueOf(keyName));
+    }
+
+    /**
+     * @param keyName The name of the symbol key
+     * @return the value of the annotation if it exists, or null otherwise
+     */
+    public Object getMessageAnnotation(String keyName)
+    {
+        if(_messageAnnotationsMap == null)
+        {
+            return null;
+        }
+
+        return _messageAnnotationsMap.get(Symbol.valueOf(keyName));
     }
 
-    public void clearMessageAnnotation(Object key)
+    public void clearMessageAnnotation(String keyName)
     {
-        //TODO: this isnt thread-safe, does it need to be?
         if(_messageAnnotationsMap == null)
         {
             return;
         }
 
-        _messageAnnotationsMap.remove(key);
+        _messageAnnotationsMap.remove(Symbol.valueOf(keyName));
+    }
 
-        //If there are now no annotations, clear the field on
-        //the Proton message to avoid encoding an empty map
-        if(_messageAnnotationsMap.isEmpty())
+    /**
+     * @param keyName The name of the symbol key
+     * @param value the annotation value
+     */
+    public void setMessageAnnotation(String keyName, Object value)
+    {
+        if(_messageAnnotationsMap == null)
         {
-            clearAllMessageAnnotations();
+            initializeUnderlyingMessageAnnotations();
         }
+
+        _messageAnnotationsMap.put(Symbol.valueOf(keyName), value);
     }
 
+    /**
+     * Clears any previously set annotations and removes the underlying
+     * message annotations section from the message
+     */
     public void clearAllMessageAnnotations()
     {
+        _messageAnnotationsMap = null;
         _messageAnnotations = null;
         _message.setMessageAnnotations(null);
     }
 
-    public void setMessageAnnotation(Object key, Object value)
+    /**
+     * @return the number of MessageAnnotations.
+     */
+    public int getMessageAnnotationsCount()
     {
-        if(_messageAnnotationsMap == null)
+        if(_messageAnnotationsMap != null)
         {
-            _messageAnnotationsMap = new HashMap<Object,Object>();
+            return _messageAnnotationsMap.size();
         }
-
-        _messageAnnotationsMap.put(key, value);
-
-        //If there were previously no annotations, we need to
-        //set the related field on the Proton message now
-        if(_messageAnnotations == null)
+        else
         {
-            setMessageAnnotations();
+            return 0;
         }
     }
 
-    private void setMessageAnnotations()
+    private void initializeUnderlyingMessageAnnotations()
     {
+        _messageAnnotationsMap = new HashMap<Object,Object>();
         _messageAnnotations = new MessageAnnotations(_messageAnnotationsMap);
         _message.setMessageAnnotations(_messageAnnotations);
     }
 
-
     //===== Properties ======
 
     public void setContentType(String contentType)

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java?rev=1546400&r1=1546399&r2=1546400&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java Thu Nov 28 17:16:15 2013
@@ -30,6 +30,7 @@ import org.apache.qpid.jms.QpidJmsTestCa
 import org.apache.qpid.proton.Proton;
 import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
 import org.apache.qpid.proton.amqp.messaging.Properties;
 import org.apache.qpid.proton.engine.Delivery;
 import org.apache.qpid.proton.message.Message;
@@ -56,6 +57,8 @@ public class AmqpMessageTest extends Qpi
         _mockDelivery = Mockito.mock(Delivery.class);
     }
 
+    // ====== Application Properties =======
+
     @Test
     public void testGetApplicationPropertyNames()
     {
@@ -162,6 +165,8 @@ public class AmqpMessageTest extends Qpi
         }
     }
 
+    // ====== Properties =======
+
     @Test
     public void testGetToWithReceivedMessageWithNoProperties()
     {
@@ -235,4 +240,195 @@ public class AmqpMessageTest extends Qpi
         assertNotNull(testAmqpMessage.getTo());
         assertEquals(testToAddress, testAmqpMessage.getTo());
     }
+
+    // ====== Message Annotations =======
+
+    @Test
+    public void testMessageAnnotationExistsUsingReceivedMessageWithoutMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+
+        Message message = Proton.message();
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertFalse(testAmqpMessage.messageAnnotationExists(symbolKeyName));
+    }
+
+    @Test
+    public void testMessageAnnotationExistsUsingReceivedMessageWithMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String value = "myTestValue";
+
+        Message message = Proton.message();
+
+        Map<Object,Object> annotationsMap = new HashMap<Object,Object>();
+        annotationsMap.put(Symbol.valueOf(symbolKeyName), value);
+        message.setMessageAnnotations(new MessageAnnotations(annotationsMap));
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertTrue(testAmqpMessage.messageAnnotationExists(symbolKeyName));
+        assertFalse(testAmqpMessage.messageAnnotationExists("otherName"));
+    }
+
+    @Test
+    public void testGetMessageAnnotationUsingReceivedMessageWithoutMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+
+        Message message = Proton.message();
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertNull(testAmqpMessage.getMessageAnnotation(symbolKeyName));
+    }
+
+    @Test
+    public void testGetMessageAnnotationUsingReceivedMessageWithMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String value = "myTestValue";
+
+        Message message = Proton.message();
+
+        Map<Object,Object> annotationsMap = new HashMap<Object,Object>();
+        annotationsMap.put(Symbol.valueOf(symbolKeyName), value);
+        message.setMessageAnnotations(new MessageAnnotations(annotationsMap));
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertEquals(value, testAmqpMessage.getMessageAnnotation(symbolKeyName));
+        assertNull(testAmqpMessage.getMessageAnnotation("otherName"));
+    }
+
+    @Test
+    public void testNewMessageHasNoUnderlyingMessageAnnotationsSection()
+    {
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage();
+
+        Message underlying = testAmqpMessage.getMessage();
+        assertNull(underlying.getMessageAnnotations());
+    }
+
+    @Test
+    public void testSetMessageAnnotationOnNewMessage()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String symbolKeyName2 = "myTestSymbolName2";
+        String value = "myTestValue";
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage();
+
+        //check setting first annotation creates the annotations section
+        testAmqpMessage.setMessageAnnotation(symbolKeyName, value);
+
+        MessageAnnotations underlyingAnnotations = testAmqpMessage.getMessage().getMessageAnnotations();
+        assertNotNull(underlyingAnnotations);
+
+        assertEquals(1, underlyingAnnotations.getValue().size());
+        assertTrue(underlyingAnnotations.getValue().containsKey(Symbol.valueOf(symbolKeyName)));
+        assertEquals(value, underlyingAnnotations.getValue().get(Symbol.valueOf(symbolKeyName)));
+
+        //set another
+        testAmqpMessage.setMessageAnnotation(symbolKeyName2, value);
+
+        assertEquals(2, underlyingAnnotations.getValue().size());
+        assertTrue(underlyingAnnotations.getValue().containsKey(Symbol.valueOf(symbolKeyName)));
+        assertTrue(underlyingAnnotations.getValue().containsKey(Symbol.valueOf(symbolKeyName2)));
+    }
+
+    @Test
+    public void testClearMessageAnnotation()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String value = "myTestValue";
+
+        Message message = Proton.message();
+
+        Map<Object,Object> annotationsMap = new HashMap<Object,Object>();
+        annotationsMap.put(Symbol.valueOf(symbolKeyName), value);
+        message.setMessageAnnotations(new MessageAnnotations(annotationsMap));
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertEquals(value, testAmqpMessage.getMessageAnnotation(symbolKeyName));
+        assertNull(testAmqpMessage.getMessageAnnotation("otherName"));
+
+        testAmqpMessage.clearMessageAnnotation(symbolKeyName);
+        assertNull(testAmqpMessage.getMessageAnnotation(symbolKeyName));
+    }
+
+    @Test
+    public void testClearMessageAnnotationONMessageWithNoMessageAnnotationSectionDoesntThrowException()
+    {
+        Message message = Proton.message();
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        testAmqpMessage.clearMessageAnnotation("keyName");
+    }
+
+    @Test
+    public void testClearAllMessageAnnotationsUsingNewMessage()
+    {
+        Message message = Proton.message();
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        testAmqpMessage.clearAllMessageAnnotations();
+
+        Message underlying = testAmqpMessage.getMessage();
+        assertNull(underlying.getMessageAnnotations());
+    }
+
+    @Test
+    public void testClearAllMessageAnnotationsUsingReceivedMessageWithMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String value = "myTestValue";
+
+        Message message = Proton.message();
+
+        Map<Object,Object> annotationsMap = new HashMap<Object,Object>();
+        annotationsMap.put(Symbol.valueOf(symbolKeyName), value);
+        message.setMessageAnnotations(new MessageAnnotations(annotationsMap));
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        testAmqpMessage.clearAllMessageAnnotations();
+
+        Message underlying = testAmqpMessage.getMessage();
+        assertNull(underlying.getMessageAnnotations());
+    }
+
+    @Test
+    public void testGetMessageAnnotationsCountUsingReceivedMessageWithoutMessageAnnotationsSection()
+    {
+        Message message = Proton.message();
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertEquals(0, testAmqpMessage.getMessageAnnotationsCount());
+    }
+
+    @Test
+    public void testGetMessageAnnotationsCountUsingReceivedMessageWithMessageAnnotationsSection()
+    {
+        String symbolKeyName = "myTestSymbolName";
+        String symbolKeyName2 = "myTestSymbolName2";
+        String value = "myTestValue";
+
+        Message message = Proton.message();
+
+        Map<Object,Object> annotationsMap = new HashMap<Object,Object>();
+        annotationsMap.put(Symbol.valueOf(symbolKeyName), value);
+        annotationsMap.put(Symbol.valueOf(symbolKeyName2), value);
+        message.setMessageAnnotations(new MessageAnnotations(annotationsMap));
+
+        TestAmqpMessage testAmqpMessage = new TestAmqpMessage(message, _mockDelivery, _mockAmqpConnection);
+
+        assertEquals(2, testAmqpMessage.getMessageAnnotationsCount());
+        testAmqpMessage.clearMessageAnnotation(symbolKeyName);
+        assertEquals(1, testAmqpMessage.getMessageAnnotationsCount());
+    }
 }



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