From 62cfe83e9d16acd0b466e9fb6b40146394b3792d Mon Sep 17 00:00:00 2001 From: gtully Date: Thu, 21 May 2020 10:41:58 +0100 Subject: [PATCH] [AMQ-7291] rework fix to initializeWriting but just with the read only properties check --- .../command/ActiveMQBytesMessage.java | 7 +++++- .../activemq/command/ActiveMQMessage.java | 2 +- .../command/ActiveMQBytesMessageTest.java | 24 +++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQBytesMessage.java b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQBytesMessage.java index 71a39f80ca..14028d732b 100644 --- a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQBytesMessage.java +++ b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQBytesMessage.java @@ -832,6 +832,10 @@ public class ActiveMQBytesMessage extends ActiveMQMessage implements BytesMessag private void initializeWriting() throws JMSException { checkReadOnlyBody(); + initializeWritingNoCheck(); + } + + private void initializeWritingNoCheck() throws JMSException { if (this.dataOut == null) { this.bytesOut = new ByteArrayOutputStream(); OutputStream os = bytesOut; @@ -914,7 +918,8 @@ public class ActiveMQBytesMessage extends ActiveMQMessage implements BytesMessag @Override public void setObjectProperty(String name, Object value) throws JMSException { - initializeWriting(); + checkReadOnlyProperties(); + initializeWritingNoCheck(); super.setObjectProperty(name, value); } diff --git a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java index efdab4807d..6feee45972 100644 --- a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java +++ b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java @@ -736,7 +736,7 @@ public class ActiveMQMessage extends Message implements org.apache.activemq.Mess setObjectProperty(name, value); } - private void checkReadOnlyProperties() throws MessageNotWriteableException { + protected void checkReadOnlyProperties() throws MessageNotWriteableException { if (readOnlyProperties) { throw new MessageNotWriteableException("Message properties are read-only"); } diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQBytesMessageTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQBytesMessageTest.java index 0219815688..6b01d0533b 100644 --- a/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQBytesMessageTest.java +++ b/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQBytesMessageTest.java @@ -269,6 +269,30 @@ public class ActiveMQBytesMessageTest extends TestCase { } } + public void testClearProperties() throws Exception { + ActiveMQBytesMessage bytesMessage = new ActiveMQBytesMessage(); + bytesMessage.setIntProperty("one", 1); + // simulate send + bytesMessage.onSend(); + + assertEquals(1, bytesMessage.getIntProperty("one")); + assertTrue(bytesMessage.isReadOnlyProperties()); + + try { + bytesMessage.setIntProperty("two", 2); + fail("should have thrown b/c readonly"); + } catch (MessageNotWriteableException expected) { + } + + // allow writing new properties + bytesMessage.clearProperties(); + assertFalse(bytesMessage.propertyExists("one")); + assertFalse(bytesMessage.isReadOnlyProperties()); + + bytesMessage.setIntProperty("two", 2); + assertEquals(2, bytesMessage.getIntProperty("two")); + } + public void testReset() throws JMSException { ActiveMQBytesMessage message = new ActiveMQBytesMessage(); try {