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 2023/02/15 17:09:44 UTC

[qpid-jms] branch main updated: QPIDJMS-584: ensure JMSProducer#send(...body) methods handle null Map and byte[] bodies as expected

This is an automated email from the ASF dual-hosted git repository.

robbie pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-jms.git


The following commit(s) were added to refs/heads/main by this push:
     new 5db8d957 QPIDJMS-584: ensure JMSProducer#send(...body) methods handle null Map and byte[] bodies as expected
5db8d957 is described below

commit 5db8d957d7d615c0b5f5ac7047b4eff99d45cbe6
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Wed Feb 15 17:02:33 2023 +0000

    QPIDJMS-584: ensure JMSProducer#send(...body) methods handle null Map and byte[] bodies as expected
---
 .../main/java/org/apache/qpid/jms/JmsProducer.java | 10 ++-
 .../apache/qpid/jms/producer/JmsProducerTest.java  | 74 +++++++++++++++++++++-
 2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsProducer.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsProducer.java
index 2ad881f0..8be161f1 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsProducer.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsProducer.java
@@ -99,7 +99,9 @@ public class JmsProducer implements JMSProducer {
     public JMSProducer send(Destination destination, byte[] body) {
         try {
             BytesMessage message = session.createBytesMessage();
-            message.writeBytes(body);
+            if (body != null) {
+                message.writeBytes(body);
+            }
             doSend(destination, message);
         } catch (JMSException jmse) {
             throw JmsExceptionSupport.createRuntimeException(jmse);
@@ -112,8 +114,10 @@ public class JmsProducer implements JMSProducer {
     public JMSProducer send(Destination destination, Map<String, Object> body) {
         try {
             MapMessage message = session.createMapMessage();
-            for (Map.Entry<String, Object> entry : body.entrySet()) {
-                message.setObject(entry.getKey(), entry.getValue());
+            if (body != null) {
+                for (Map.Entry<String, Object> entry : body.entrySet()) {
+                    message.setObject(entry.getKey(), entry.getValue());
+                }
             }
 
             doSend(destination, message);
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
index a8c6da39..f7418158 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
@@ -41,6 +41,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
+import jakarta.jms.BytesMessage;
 import jakarta.jms.CompletionListener;
 import jakarta.jms.DeliveryMode;
 import jakarta.jms.Destination;
@@ -51,9 +52,12 @@ import jakarta.jms.InvalidDestinationRuntimeException;
 import jakarta.jms.JMSException;
 import jakarta.jms.JMSProducer;
 import jakarta.jms.JMSRuntimeException;
+import jakarta.jms.MapMessage;
 import jakarta.jms.Message;
 import jakarta.jms.MessageFormatRuntimeException;
+import jakarta.jms.ObjectMessage;
 import jakarta.jms.Queue;
+import jakarta.jms.TextMessage;
 
 import org.apache.qpid.jms.JmsConnection;
 import org.apache.qpid.jms.JmsConnectionTestSupport;
@@ -1004,18 +1008,18 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         doTestSendAppliesDeliveryModeWithMessageBody(UUID.class);
     }
 
-    public void doTestSendAppliesDeliveryModeWithMessageBody(Class<?> bodyType) throws JMSException {
+    private void doTestSendAppliesDeliveryModeWithMessageBody(Class<?> bodyType) throws JMSException {
         JMSProducer producer = context.createProducer();
 
         producer.setDeliveryMode(DeliveryMode.PERSISTENT);
-        producer.send(JMS_DESTINATION, "text");
+        sendWithBodyOfType(producer, bodyType);
         JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         JmsMessage message = envelope.getMessage();
         assertEquals(DeliveryMode.PERSISTENT, message.getJMSDeliveryMode());
 
         producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
-        producer.send(JMS_DESTINATION, "text");
+        sendWithBodyOfType(producer, bodyType);
         envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         message = envelope.getMessage();
@@ -1206,9 +1210,25 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof TextMessage);
         assertEquals(bodyValue, message.getBody(String.class));
     }
 
+    @Test
+    public void testStringNullBodyGivesEmptyMessage() throws JMSException {
+        JMSProducer producer = context.createProducer();
+
+        final String nullStringBody = null;
+        producer.send(JMS_DESTINATION, nullStringBody);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+
+        JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof TextMessage);
+        assertNull(message.getBody(String.class));
+    }
+
     @Test
     public void testMapBodyIsApplied() throws JMSException {
         JMSProducer producer = context.createProducer();
@@ -1222,9 +1242,25 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof MapMessage);
         assertEquals(bodyValue, message.getBody(Map.class));
     }
 
+    @Test
+    public void testMapNullBodyGivesEmptyMessage() throws JMSException {
+        JMSProducer producer = context.createProducer();
+
+        final Map<String, Object> nullMapBody = null;
+        producer.send(JMS_DESTINATION, nullMapBody);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+
+        JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof MapMessage);
+        assertNull(message.getBody(Map.class));
+    }
+
     @Test
     public void testBytesBodyIsApplied() throws JMSException {
         JMSProducer producer = context.createProducer();
@@ -1235,6 +1271,7 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof BytesMessage);
 
         byte[] payload = message.getBody(byte[].class);
         assertNotNull(payload);
@@ -1245,6 +1282,21 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         }
     }
 
+    @Test
+    public void testBytesNullBodyGivesEmptyMessage() throws JMSException {
+        JMSProducer producer = context.createProducer();
+
+        final byte[] nullBytesBody = null;
+        producer.send(JMS_DESTINATION, nullBytesBody);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+
+        JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof BytesMessage);
+        assertNull(message.getBody(byte[].class));
+    }
+
     @Test
     public void testSerializableBodyIsApplied() throws JMSException {
         JMSProducer producer = context.createProducer();
@@ -1255,9 +1307,25 @@ public class JmsProducerTest extends JmsConnectionTestSupport {
         JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
         assertNotNull(envelope);
         JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof ObjectMessage);
         assertEquals(bodyValue, message.getBody(UUID.class));
     }
 
+    @Test
+    public void testSerializableNullBodyGivesEmptyMessage() throws JMSException {
+        JMSProducer producer = context.createProducer();
+
+        final UUID nullSerializableBody = null;
+        producer.send(JMS_DESTINATION, nullSerializableBody);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+
+        JmsMessage message = envelope.getMessage();
+        assertTrue(message instanceof ObjectMessage);
+        assertNull(message.getBody(byte[].class));
+    }
+
     //----- Test for conversions to JMSRuntimeException ----------------------//
 
     @Test


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