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 2014/02/18 18:41:33 UTC

svn commit: r1569437 - in /qpid/jms/trunk/src: main/java/org/apache/qpid/jms/engine/ main/java/org/apache/qpid/jms/impl/ test/java/org/apache/qpid/jms/engine/ test/java/org/apache/qpid/jms/impl/

Author: robbie
Date: Tue Feb 18 17:41:33 2014
New Revision: 1569437

URL: http://svn.apache.org/r1569437
Log:
flesh out JMSXGroupSeq, e.g getter and handle group-sequence values above the int limit

Modified:
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/engine/AmqpMessage.java
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/engine/AmqpMessageTest.java
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.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=1569437&r1=1569436&r2=1569437&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 Tue Feb 18 17:41:33 2014
@@ -340,11 +340,14 @@ public abstract class AmqpMessage
                 return uint.longValue();
             }
         }
-
-        //TODO: is _message.getGroupSequence() doing the right thing before returning?
     }
 
-    public void setGroupSequence(Long groupSeq)
+    /**
+     * Set the group-sequence uint field on the properties section.
+     * @param groupSeq
+     * @throws IllegalArgumentException if the value is outside the range [0 - 2^32)
+     */
+    public void setGroupSequence(Long groupSeq) throws IllegalArgumentException
     {
         if(groupSeq == null)
         {
@@ -359,7 +362,11 @@ public abstract class AmqpMessage
         }
         else
         {
-            //TODO: is this method doing the right thing with our value?
+            if(groupSeq < 0 || groupSeq > 0xFFFFFFFFL)
+            {
+                throw new IllegalArgumentException("Value '"+groupSeq+"' lies outside the range [0 - 2^32).");
+            }
+
             _message.setGroupSequence(groupSeq);
         }
     }

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java?rev=1569437&r1=1569436&r2=1569437&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java Tue Feb 18 17:41:33 2014
@@ -247,7 +247,6 @@ public abstract class MessageImpl<T exte
 
     private void setJMSXGroupSeq(Object value) throws MessageFormatException
     {
-        //TODO: handle setting String, byte, short? Validate value?
         Long groupSeq = null;
         if(value != null)
         {
@@ -323,12 +322,16 @@ public abstract class MessageImpl<T exte
         {
             return _amqpMessage.getGroupId();
         }
+        else if(JMSXGROUPSEQ.equals(name))
+        {
+            return getJMSXGroupSeq();
+        }
 
         //TODO: handle non-JMS types?
         return _amqpMessage.getApplicationProperty(name);
     }
 
-    private Object getJMSXUserID() throws MessageFormatException
+    private String getJMSXUserID() throws MessageFormatException
     {
         byte[] userId = _amqpMessage.getUserId();
         if(userId == null)
@@ -348,6 +351,21 @@ public abstract class MessageImpl<T exte
         }
     }
 
+    private Integer getJMSXGroupSeq()
+    {
+        Long groupSeqUint = _amqpMessage.getGroupSequence();
+        if(groupSeqUint == null)
+        {
+            return null;
+        }
+        else
+        {
+            //The long represents a uint, so may be 0 to 2^32-1.
+            //This wraps it into a negative int range if over 2^31-1
+            return groupSeqUint.intValue();
+        }
+    }
+
     private MessageFormatException createMessageFormatException(String message)
     {
         return createMessageFormatException(message, null);

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=1569437&r1=1569436&r2=1569437&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 Tue Feb 18 17:41:33 2014
@@ -402,6 +402,38 @@ public class AmqpMessageTest extends Qpi
         assertNull("expected userid to be null on new message", testAmqpMessage.getUserId());
     }
 
+    //TODO: delete this marker comment
+    /**
+     * Test that attempting to set a uint group-sequence (represented as a long) with a value
+     * outwith the allowed [0 - 2^32) range results in an IAE being thrown
+     */
+    @Test
+    public void testSetGroupSequenceWithUIntOutOfRangeThrowsIAE()
+    {
+        //negative value
+        AmqpMessage testAmqpMessage = TestAmqpMessage.createNewMessage();
+        try
+        {
+            testAmqpMessage.setGroupSequence(-1L);
+            fail("expected exception was not thrown");
+        }
+        catch(IllegalArgumentException iae)
+        {
+            //expected
+        }
+
+        //value 1 over max
+        try
+        {
+            testAmqpMessage.setGroupSequence(0xFFFFFFFFL + 1);
+            fail("expected exception was not thrown");
+        }
+        catch(IllegalArgumentException iae)
+        {
+            //expected
+        }
+    }
+
     /**
      * Check that setting UserId null on a new message does not cause creation of the underlying properties
      * section. New messages lack the properties section section,

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java?rev=1569437&r1=1569436&r2=1569437&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/MessageImplTest.java Tue Feb 18 17:41:33 2014
@@ -2048,6 +2048,11 @@ public class MessageImplTest extends Qpi
     }
 
     //TODO: delete this marker comment
+    @Test
+    public void testGetJMSXGroupSeqOnNewMessageThrowsNFE() throws Exception
+    {
+        assertGetMissingPropertyThrowsNumberFormatException(_testMessage, JMSXGROUPSEQ, Integer.class);
+    }
 
     @Test
     public void testGetJMSXGroupSeqDoesNotExistOnNewMessage() throws Exception
@@ -2134,6 +2139,87 @@ public class MessageImplTest extends Qpi
         assertEquals("expected no entry to be present in the application-properties section", 0, _testAmqpMessage.getApplicationPropertyNames().size());
     }
 
+    /**
+     * Test that setting the JMSXGroupSeq property to null clears an existing
+     * value for the group-sequence field on the underlying AMQP message
+     */
+    @Test
+    public void testSetJMSXGroupSeqNullClearsUnderlyingMessageGroupSequence() throws Exception
+    {
+        int myGroupSeq = 1;
+        _testMessage.setIntProperty(JMSXGROUPSEQ, myGroupSeq);
+
+        _testMessage.setStringProperty(JMSXGROUPSEQ, null);
+
+        assertFalse("did not expect a JMSXGroupSeq value to be present", _testMessage.propertyExists(JMSXGROUPSEQ));
+        assertNull("unexpected group-sequence value on underlying message", _testAmqpMessage.getGroupId());
+    }
+
+    /**
+     * Test that setting the JMSXGroupSeq property to a non-Integer instance
+     * causes an MFE to be thrown.
+     */
+    @Test
+    public void testSetJMSXGroupSeqToNonIntegerInstanceThrowsMFE() throws Exception
+    {
+        long myGroupSeq = 1L;
+
+        try
+        {
+            _testMessage.setLongProperty(JMSXGROUPSEQ, myGroupSeq);
+            fail("expected exception not thrown");
+        }
+        catch(MessageFormatException mfe)
+        {
+            //expected
+        }
+    }
+
+    /**
+     * Test that the JMSXGroupSeq property returns the expected value for a message
+     * received with the group-sequence field set.
+     */
+    @Test
+    public void testGetJMSXGroupSeqOnReceivedMessageWithGroupSequence() throws Exception
+    {
+        int groupSeqInt = 1;
+        Long myGroupSeq = Long.valueOf(groupSeqInt);
+        getJMSXGroupSeqOnReceivedMessageWithGroupSequenceAboveIntRangeTestImpl(myGroupSeq, groupSeqInt);
+    }
+
+    /**
+     * Test that the JMSXGroupSeq property returns the expected value for a message
+     * received with the group-sequence field uint set to a value above the int range.
+     * Expect that it is wrapped into the negative numbers not used normally by JMS.
+     */
+    @Test
+    public void testGetJMSXGroupSeqOnRecievedMessageWithGroupSequenceAboveIntRange() throws Exception
+    {
+        //First value just out of range
+        Long groupSeqUint = Integer.MAX_VALUE + 1L;//2^31;
+        int expected = Integer.MIN_VALUE;
+        getJMSXGroupSeqOnReceivedMessageWithGroupSequenceAboveIntRangeTestImpl(groupSeqUint, expected);
+
+        //Maximum uint value
+        groupSeqUint = 0x100000000L - 1L; //2^32 -1;
+        expected = -1;
+        getJMSXGroupSeqOnReceivedMessageWithGroupSequenceAboveIntRangeTestImpl(groupSeqUint, expected);
+
+        //Somewhere between the two
+        groupSeqUint = Integer.MAX_VALUE + 1L + 4L; //2^31 + 4;
+        expected = Integer.MIN_VALUE + 4;
+        getJMSXGroupSeqOnReceivedMessageWithGroupSequenceAboveIntRangeTestImpl(groupSeqUint, expected);
+    }
+
+    private void getJMSXGroupSeqOnReceivedMessageWithGroupSequenceAboveIntRangeTestImpl(Long groupSeqUint, int expected) throws JMSException
+    {
+        _testAmqpMessage.setGroupSequence(groupSeqUint);
+
+        _testMessage = TestMessageImpl.createReceivedMessage(_testAmqpMessage, _mockSessionImpl, _mockConnectionImpl, null);
+
+        assertEquals("JMSXGroupSeq value was not as expected", expected, _testMessage.getIntProperty(JMSXGROUPSEQ));
+    }
+
     //TODO: delete this marker comment
     // ====== JMS_AMQP_TTL property =======
 



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