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/13 19:09:15 UTC

svn commit: r1567989 - 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: Thu Feb 13 18:09:14 2014
New Revision: 1567989

URL: http://svn.apache.org/r1567989
Log:
QPIDJMS-9: work on support for JMSXUserID

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/ClientProperties.java
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ConnectionImpl.java
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/MessageImpl.java
    qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/SenderImpl.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
    qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/SenderImplTest.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=1567989&r1=1567988&r2=1567989&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 Feb 13 18:09:14 2014
@@ -322,6 +322,16 @@ public abstract class AmqpMessage
 
     //===== Properties ======
 
+    public void setUserId(byte[] userId)
+    {
+        _message.setUserId(userId);
+    }
+
+    public byte[] getUserId()
+    {
+        return _message.getUserId();
+    }
+
     public String getContentType()
     {
         return _message.getContentType();

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ClientProperties.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ClientProperties.java?rev=1567989&r1=1567988&r2=1567989&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ClientProperties.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ClientProperties.java Thu Feb 13 18:09:14 2014
@@ -22,10 +22,16 @@ package org.apache.qpid.jms.impl;
 
 public class ClientProperties
 {
-    //Message Property Names
+    //JMS-defined Property Names
+    public static final String JMSXUSERID = "JMSXUserID";
+
+    //Custom Message Property Names
     public static final String JMS_AMQP_TTL = "JMS_AMQP_TTL";
 
     //Message Annotation Names
     public static final String X_OPT_APP_CORRELATION_ID = "x-opt-app-correlation-id";
     public static final String X_OPT_JMS_TYPE = "x-opt-jms-type";
+
+    //Client configuration System Property names
+    public static final String QPID_SET_JMSXUSERID_ON_SEND = "qpid.set-jmsxuserid-on-send";
 }

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ConnectionImpl.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ConnectionImpl.java?rev=1567989&r1=1567988&r2=1567989&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ConnectionImpl.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/ConnectionImpl.java Thu Feb 13 18:09:14 2014
@@ -65,14 +65,17 @@ public class ConnectionImpl implements C
     private DestinationHelper _destinationHelper;
     private MessageIdHelper _messageIdHelper;
 
+    private String _username;
+
     /**
      * TODO: accept a client id
      * TODO: defer connection to the broker if client has not been set. Defer it until any other method is called.
      */
     public ConnectionImpl(String clientName, String remoteHost, int port, String username, String password) throws JMSException
     {
+        _username = username;
         _amqpConnection = new AmqpConnection(clientName, remoteHost, port);
-        _amqpConnection.setUsername(username);
+        _amqpConnection.setUsername(_username);
         _amqpConnection.setPassword(password);
 
         try
@@ -234,6 +237,10 @@ public class ConnectionImpl implements C
         _connectionLock.stateChanged();
     }
 
+    String getUserName()
+    {
+        return _username;
+    }
 
     //======= JMS Methods =======
 

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=1567989&r1=1567988&r2=1567989&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 Thu Feb 13 18:09:14 2014
@@ -19,8 +19,10 @@
 package org.apache.qpid.jms.impl;
 
 import static org.apache.qpid.jms.impl.ClientProperties.JMS_AMQP_TTL;
+import static org.apache.qpid.jms.impl.ClientProperties.JMSXUSERID;
 import static org.apache.qpid.jms.impl.MessageIdHelper.JMS_ID_PREFIX;
 
+import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -199,30 +201,68 @@ public abstract class MessageImpl<T exte
 
         if(JMS_AMQP_TTL.equals(name))
         {
-            Long ttl = null;
-            if(value instanceof Long)
-            {
-                ttl = (Long) value;
-            }
+            setJMS_AMQP_TTL(value);
+            return;
+        }
+        else if(JMSXUSERID.equals(name))
+        {
+            setJMSXUserID(value);
+            return;
+        }
 
-            if(ttl != null && ttl >= 0 && ttl <= MAX_UINT)
+        checkObjectPropertyValueIsValid(value);
+
+        _amqpMessage.setApplicationProperty(name, value);
+    }
+
+    private void setJMSXUserID(Object value) throws MessageFormatException
+    {
+        byte[] userIdBytes = null;
+        if(value != null)
+        {
+            if(value instanceof String)
             {
-                _propJMS_AMQP_TTL = ttl;
+                try
+                {
+                    userIdBytes = ((String) value).getBytes("UTF-8");
+                }
+                catch (UnsupportedEncodingException e)
+                {
+                    MessageFormatException mfe = new MessageFormatException("Unable to encode user id");
+                    mfe.setLinkedException(e);
+                    mfe.initCause(e);
+
+                    throw mfe;
+                }
             }
             else
             {
-                throw new MessageFormatException(JMS_AMQP_TTL + " must be a long with value in range 0 to 2^31 - 1");
+                throw new MessageFormatException(JMSXUSERID + " must be a String");
             }
-
-            return;
         }
 
-        checkObjectPropertyValueIsValid(value);
+        _amqpMessage.setUserId(userIdBytes);
+    }
 
-        _amqpMessage.setApplicationProperty(name, value);
+    private void setJMS_AMQP_TTL(Object value) throws MessageFormatException
+    {
+        Long ttl = null;
+        if(value instanceof Long)
+        {
+            ttl = (Long) value;
+        }
+
+        if(ttl != null && ttl >= 0 && ttl <= MAX_UINT)
+        {
+            _propJMS_AMQP_TTL = ttl;
+        }
+        else
+        {
+            throw new MessageFormatException(JMS_AMQP_TTL + " must be a long with value in range 0 to 2^31 - 1");
+        }
     }
 
-    private Object getApplicationProperty(String name)
+    private Object getApplicationProperty(String name) throws MessageFormatException
     {
         checkPropertyNameIsValid(name);
 
@@ -230,11 +270,48 @@ public abstract class MessageImpl<T exte
         {
             return _propJMS_AMQP_TTL;
         }
+        else if(JMSXUSERID.equals(name))
+        {
+            return getJMSXUserID();
+        }
 
         //TODO: handle non-JMS types?
         return _amqpMessage.getApplicationProperty(name);
     }
 
+    private Object getJMSXUserID() throws MessageFormatException
+    {
+        byte[] userId = _amqpMessage.getUserId();
+        if(userId == null)
+        {
+            return null;
+        }
+        else
+        {
+            try
+            {
+                return new String(userId, "UTF-8");
+            }
+            catch (UnsupportedEncodingException e)
+            {
+                MessageFormatException mfe = new MessageFormatException("Unable to decode user id");
+                mfe.setLinkedException(e);
+                mfe.initCause(e);
+
+                throw mfe;
+            }
+        }
+    }
+
+    private boolean propertyExistsJMSXUserID()
+    {
+        return _amqpMessage.getUserId() != null;
+    }
+
+    private boolean propertyExistsJMS_AMQP_TTL()
+    {
+        return _propJMS_AMQP_TTL != null;
+    }
 
     //======= JMS Methods =======
 
@@ -575,7 +652,12 @@ public abstract class MessageImpl<T exte
     {
         if(JMS_AMQP_TTL.equals(name))
         {
-            return _propJMS_AMQP_TTL != null;
+            return propertyExistsJMS_AMQP_TTL();
+        }
+
+        if(JMSXUSERID.equals(name))
+        {
+            return propertyExistsJMSXUserID();
         }
 
         return _amqpMessage.applicationPropertyExists(name);
@@ -781,11 +863,16 @@ public abstract class MessageImpl<T exte
         //Create a new list we can mutate
         List<String> propNames = new ArrayList<String>(underlyingApplicationPropertyNames);
 
-        if(_propJMS_AMQP_TTL != null)
+        if(propertyExistsJMS_AMQP_TTL())
         {
             propNames.add(JMS_AMQP_TTL);
         }
 
+        if(propertyExistsJMSXUserID())
+        {
+            propNames.add(JMSXUSERID);
+        }
+
         return Collections.enumeration(propNames);
     }
 

Modified: qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/SenderImpl.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/SenderImpl.java?rev=1567989&r1=1567988&r2=1567989&view=diff
==============================================================================
--- qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/SenderImpl.java (original)
+++ qpid/jms/trunk/src/main/java/org/apache/qpid/jms/impl/SenderImpl.java Thu Feb 13 18:09:14 2014
@@ -22,6 +22,7 @@ package org.apache.qpid.jms.impl;
 
 import static org.apache.qpid.jms.impl.ClientProperties.JMS_AMQP_TTL;
 
+import java.io.UnsupportedEncodingException;
 import java.util.UUID;
 
 import javax.jms.Destination;
@@ -36,6 +37,8 @@ import org.apache.qpid.jms.engine.AmqpSe
 public class SenderImpl extends LinkImpl implements MessageProducer
 {
     private static final long UINT_MAX = 0xFFFFFFFFL;
+
+    private final boolean _setJMSXUserId = Boolean.valueOf(System.getProperty(ClientProperties.QPID_SET_JMSXUSERID_ON_SEND, "true"));
     private AmqpSender _amqpSender;
     private Destination _destination;
 
@@ -87,6 +90,39 @@ public class SenderImpl extends LinkImpl
 
             AmqpMessage amqpMessage = getAmqpMessageFromJmsMessage(message);
 
+            //set the JMSXUserId value
+            String existingUserValue = message.getStringProperty(ClientProperties.JMSXUSERID);
+            String newUserString = null;
+            if(_setJMSXUserId)
+            {
+                newUserString = getConnectionImpl().getUserName();
+            }
+
+            if(userStringValuesDiffer(newUserString, existingUserValue))
+            {
+                if(isQpidMessage(message))
+                {
+                    //set the UserId field on the underlying AMQP message
+                    byte[] bytes = null;
+                    if(newUserString != null)
+                    {
+                        try
+                        {
+                            bytes = newUserString.getBytes("UTF-8");
+                        }
+                        catch (UnsupportedEncodingException e)
+                        {
+                            throw new QpidJmsException("Unable to encode user id", e);
+                        }
+                    }
+                    amqpMessage.setUserId(bytes);
+                }
+                else
+                {
+                    message.setStringProperty(ClientProperties.JMSXUSERID, newUserString);
+                }
+            }
+
             //set the AMQP header ttl field if necessary
             if(message.propertyExists(JMS_AMQP_TTL))
             {
@@ -129,9 +165,14 @@ public class SenderImpl extends LinkImpl
         }
     }
 
+    private boolean userStringValuesDiffer(String user, String existing)
+    {
+        return user != null && !user.equals(existing) || (user == null && existing != null);
+    }
+
     private AmqpMessage getAmqpMessageFromJmsMessage(Message message)
     {
-        if(message instanceof MessageImpl)
+        if(isQpidMessage(message))
         {
             return ((MessageImpl<?>)message).getUnderlyingAmqpMessage(true);
         }
@@ -142,6 +183,11 @@ public class SenderImpl extends LinkImpl
         }
     }
 
+    private boolean isQpidMessage(Message message)
+    {
+        return message instanceof MessageImpl;
+    }
+
 
     //======= JMS Methods =======
 

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=1567989&r1=1567988&r2=1567989&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 Feb 13 18:09:14 2014
@@ -24,6 +24,7 @@ import static org.junit.Assert.*;
 
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -335,6 +336,64 @@ public class AmqpMessageTest extends Qpi
     }
 
     // ====== Properties =======
+//  TODO: delete this marker comment
+
+    @Test
+    public void testGetUserIDIsNullForNewMessage()
+    {
+        AmqpMessage testAmqpMessage = TestAmqpMessage.createNewMessage();
+
+        assertNull("expected useriod to be null on new message", testAmqpMessage.getUserId());
+    }
+
+    /**
+     * 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,
+     * as tested by {@link #testNewMessageHasNoUnderlyingPropertiesSection()}.
+     */
+    @Test
+    public void testSetUserIDNullOnNewMessageDoesNotCreatePropertiesSection() throws Exception
+    {
+        AmqpMessage testAmqpMessage = TestAmqpMessage.createNewMessage();
+
+        testAmqpMessage.setUserId(null);
+
+        assertNull("properties section was created", testAmqpMessage.getMessage().getProperties());
+    }
+
+    /**
+     * Check that setting UserId on the message causes creation of the underlying properties
+     * section with the expected value. New messages lack the properties section section,
+     * as tested by {@link #testNewMessageHasNoUnderlyingPropertiesSection()}.
+     */
+    @Test
+    public void testSetUserIDOnNewMessage() throws Exception
+    {
+        byte[] bytes = "testValue".getBytes("UTF-8");
+        AmqpMessage testAmqpMessage = TestAmqpMessage.createNewMessage();
+
+        testAmqpMessage.setUserId(bytes);
+
+        assertNotNull("properties section was not created", testAmqpMessage.getMessage().getProperties());
+        assertTrue("bytes were not set for userid as expected", Arrays.equals(bytes, testAmqpMessage.getMessage().getProperties().getUserId().getArray()));
+        assertTrue("bytes were not set for userid as expected", Arrays.equals(bytes, testAmqpMessage.getUserId()));
+    }
+
+    /**
+     * Check that setting UserId null on the message causes any existing value to be cleared
+     */
+    @Test
+    public void testSetUserIDNullOnMessageWithExistingUserID() throws Exception
+    {
+        byte[] bytes = "testValue".getBytes("UTF-8");
+        AmqpMessage testAmqpMessage = TestAmqpMessage.createNewMessage();
+
+        testAmqpMessage.setUserId(bytes);
+        testAmqpMessage.setUserId(null);
+
+        assertNull("bytes were not cleared for userid as expected", testAmqpMessage.getMessage().getProperties().getUserId());
+        assertNull("bytes were not cleared for userid as expected", testAmqpMessage.getUserId());
+    }
 
     @Test
     public void testGetToWithReceivedMessageWithNoProperties()

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=1567989&r1=1567988&r2=1567989&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 Thu Feb 13 18:09:14 2014
@@ -376,7 +376,6 @@ public class MessageImplTest extends Qpi
         }
     }
 
-    //TODO: delete this marker comment
     /**
      * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or ESCAPE,
      * as described in {@link javax.jms.Message}. Verify an IAE is thrown if setting a property with these values.
@@ -1727,8 +1726,8 @@ public class MessageImplTest extends Qpi
     }
 
     /**
-     * Test that {@link MessageImpl#setJMSType(String)} sets the expected message
-     * annotation on the underlying message to the given value
+     * Test that {@link MessageImpl#setJMSType(String)} using null clears an existing
+     * annotation value on the underlying amqp message.
      */
     @Test
     public void testSetJMSTypeNullClearsExistingValue() throws Exception
@@ -1755,6 +1754,82 @@ public class MessageImplTest extends Qpi
         assertEquals("JMSType value was not as expected", myJMSType, _testMessage.getJMSType());
     }
 
+    // ====== JMSXUserId =======
+//TODO: delete this marker comment
+
+    @Test
+    public void testGetJMSXUserIDIsNullOnNewMessage() throws Exception
+    {
+        assertNull("did not expect a JMSXUserID value to be present", _testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+    }
+
+    @Test
+    public void testGetJMSXUserIDDoesNotExistOnNewMessage() throws Exception
+    {
+        assertFalse("did not expect a JMSXUserID value to be present", _testMessage.propertyExists(ClientProperties.JMSXUSERID));
+    }
+
+    /**
+     * Test that setting the JMSXUserID property sets the expected bytes
+     * for the user-id field on the underlying AMQP message
+     */
+    @Test
+    public void testSetJMSXUserIDSetsUnderlyingMessageUserId() throws Exception
+    {
+        String myUserId = "myUserId";
+        byte[] myUserIdBytes = myUserId.getBytes("UTF-8");
+        _testMessage.setStringProperty(ClientProperties.JMSXUSERID, myUserId);
+
+        assertTrue("expected a JMSXUserID value to be present", _testMessage.propertyExists(ClientProperties.JMSXUSERID));
+        assertTrue("unexpected userId bytes value on underlying message", Arrays.equals(myUserIdBytes, _testAmqpMessage.getUserId()));
+    }
+
+    /**
+     * Test that setting the JMSXUserID property does not set an entry in the
+     * application-properties section of the underlying AMQP message
+     */
+    @Test
+    public void testSetJMSXUserIDDoesNotSetApplicationProperty() throws Exception
+    {
+        String myUserId = "myUserId";
+        _testMessage.setStringProperty(ClientProperties.JMSXUSERID, myUserId);
+
+        assertEquals("expected no application-properties section to be present", 0, _testAmqpMessage.getApplicationPropertyNames().size());
+    }
+
+    /**
+     * Test that setting the JMSXUserID property to null clears an existing
+     * value for the user-id field on the underlying AMQP message
+     */
+    @Test
+    public void testSetJMSXUserIDNullClearsUnderlyingMessageUserId() throws Exception
+    {
+        String myUserId = "myUserId";
+        _testMessage.setStringProperty(ClientProperties.JMSXUSERID, myUserId);
+
+        _testMessage.setStringProperty(ClientProperties.JMSXUSERID, null);
+
+        assertFalse("did not expect a JMSXUserID value to be present", _testMessage.propertyExists(ClientProperties.JMSXUSERID));
+        assertNull("unexpected userId bytes value on underlying message", _testAmqpMessage.getUserId());
+    }
+
+    /**
+     * Test that the JMSXUserID property returns the expected value for a message
+     * received with the user-id field set.
+     */
+    @Test
+    public void testGetJMSXUserIDOnRecievedMessageWithUserId() throws Exception
+    {
+        String myUserId = "myUserId";
+        byte[] myUserIdBytes = myUserId.getBytes("UTF-8");
+        _testAmqpMessage.setUserId(myUserIdBytes);
+
+        _testMessage = TestMessageImpl.createReceivedMessage(_testAmqpMessage, _mockSessionImpl, _mockConnectionImpl, null);
+
+        assertTrue("expected a JMSXUserID value to be present", _testMessage.propertyExists(ClientProperties.JMSXUSERID));
+        assertEquals("JMSXUserID value was not as expected", myUserId, _testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+    }
+
     // ====== JMS_AMQP_TTL property =======
 
     @Test

Modified: qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/SenderImplTest.java
URL: http://svn.apache.org/viewvc/qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/SenderImplTest.java?rev=1567989&r1=1567988&r2=1567989&view=diff
==============================================================================
--- qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/SenderImplTest.java (original)
+++ qpid/jms/trunk/src/test/java/org/apache/qpid/jms/impl/SenderImplTest.java Thu Feb 13 18:09:14 2014
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertNot
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
 import javax.jms.DeliveryMode;
 import javax.jms.Message;
@@ -347,4 +348,101 @@ public class SenderImplTest extends Qpid
         //Verify that the underlying amqp message ttl field was NOT set, as requested by the property value being 0
         assertNull(testMessage.getUnderlyingAmqpMessage(false).getTtl());
     }
+
+    //TODO: delete this marker comment and finish test
+    /**
+     * Test that the producer sets the JMSXUserID property with the
+     * user name for the connection the message is being sent on.
+     */
+    @Test
+    public void testSenderSetsJMSUserIDOnMessage() throws Exception
+    {
+        senderSetsJMSXUserIDOnMessageTestImpl(true);
+    }
+
+    /**
+     * Test that the producer does not set the JMSXUserID property on the message
+     * when the {@link ClientProperties#QPID_SET_JMSXUSERID_ON_SEND} system property
+     * is set false.
+     */
+    @Test
+    public void testDisableSenderSettingJMSXUserIDOnMessageUsingSystemProperty() throws Exception
+    {
+        senderSetsJMSXUserIDOnMessageTestImpl(false);
+    }
+
+    private void senderSetsJMSXUserIDOnMessageTestImpl(boolean enabled) throws Exception
+    {
+        if(!enabled)
+        {
+            setTestSystemProperty(ClientProperties.QPID_SET_JMSXUSERID_ON_SEND, "false");
+        }
+
+        //Create mock sent message token, ensure that it is immediately marked as Accepted
+        AmqpSentMessageToken _mockToken = Mockito.mock(AmqpSentMessageToken.class);
+        Mockito.when(_mockToken.getRemoteDeliveryState()).thenReturn(Accepted.getInstance());
+        Mockito.when(_mockAmqpSender.sendMessage(Mockito.any(AmqpMessage.class))).thenReturn(_mockToken);
+
+        ImmediateWaitUntil.mockWaitUntil(_mockConnection);
+
+        SenderImpl senderImpl = new SenderImpl(_mockSession, _mockConnection, _mockAmqpSender, _mockQueue);
+
+        String myUserId = "testUser";
+        Mockito.when(_mockConnection.getUserName()).thenReturn(myUserId);
+
+        MessageImpl<?> testMessage = TestMessageImpl.createNewMessage(_mockSession, null);
+
+        assertNull("expected JMSUserID to be null", testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+
+        senderImpl.send(testMessage);
+
+        if(enabled)
+        {
+            //verify the sender stamped the message with the user
+            assertTrue("JMSXUserID property should exist", testMessage.propertyExists(ClientProperties.JMSXUSERID));
+            assertEquals("sender failed to set JMSXUserID", myUserId, testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+        }
+        else
+        {
+            //verify the sender didnt stamp the message with the user
+            assertNull("expected JMSXUserID to still be null", testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+            assertFalse("JMSXUserID property should not exist", testMessage.propertyExists(ClientProperties.JMSXUSERID));
+        }
+    }
+
+    /**
+     * Test that the producer clears any existing JMSXUserID value on a message
+     * when the {@link ClientProperties#QPID_SET_JMSXUSERID_ON_SEND} system property
+     * is set false.
+     */
+    @Test
+    public void testSenderClearsExistingJMSXUserIDValueOnSendWhenSetOnSendIsDisabled() throws Exception
+    {
+        //disable setting the user-id on send
+        setTestSystemProperty(ClientProperties.QPID_SET_JMSXUSERID_ON_SEND, "false");
+
+        //Create mock sent message token, ensure that it is immediately marked as Accepted
+        AmqpSentMessageToken _mockToken = Mockito.mock(AmqpSentMessageToken.class);
+        Mockito.when(_mockToken.getRemoteDeliveryState()).thenReturn(Accepted.getInstance());
+        Mockito.when(_mockAmqpSender.sendMessage(Mockito.any(AmqpMessage.class))).thenReturn(_mockToken);
+
+        ImmediateWaitUntil.mockWaitUntil(_mockConnection);
+
+        SenderImpl senderImpl = new SenderImpl(_mockSession, _mockConnection, _mockAmqpSender, _mockQueue);
+
+        String myUserId = "testUser";
+        Mockito.when(_mockConnection.getUserName()).thenReturn(myUserId);
+
+        MessageImpl<?> testMessage = TestMessageImpl.createNewMessage(_mockSession, null);
+
+        testMessage.setStringProperty(ClientProperties.JMSXUSERID, "value");
+        assertNotNull("expected JMSUserID to be null", testMessage.getStringProperty(ClientProperties.JMSXUSERID));
+
+        senderImpl.send(testMessage);
+
+        //verify the sender cleared the existing value
+        String value = testMessage.getStringProperty(ClientProperties.JMSXUSERID);
+        assertNull("expected JMSXUserID be null, but was: " + value, value);
+        assertFalse("JMSXUserID property should not exist", testMessage.propertyExists(ClientProperties.JMSXUSERID));
+    }
 }



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