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 2015/06/09 19:03:32 UTC

[6/6] qpid-jms git commit: QPIDJMS-48: make getPropertyNames and propertyExists consistent with the get/set property methods validation behaviour. Add initial base for toggle to escape the validation

QPIDJMS-48: make getPropertyNames and propertyExists consistent with the get/set property methods validation behaviour. Add initial base for toggle to escape the validation


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/dacdce01
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/dacdce01
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/dacdce01

Branch: refs/heads/master
Commit: dacdce01580485de7b0a86fe08bfd39aeae0d1b1
Parents: f1cb952
Author: Robert Gemmell <ro...@apache.org>
Authored: Tue Jun 9 12:33:27 2015 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Tue Jun 9 18:03:04 2015 +0100

----------------------------------------------------------------------
 .../org/apache/qpid/jms/message/JmsMessage.java |  42 ++++-
 .../apache/qpid/jms/message/JmsMessageTest.java | 176 ++++++++++++++++++-
 2 files changed, 202 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/dacdce01/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsMessage.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsMessage.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsMessage.java
index 094ef4a..82f74b2 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsMessage.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/message/JmsMessage.java
@@ -43,6 +43,7 @@ public class JmsMessage implements javax.jms.Message {
     protected final JmsMessageFacade facade;
     protected boolean readOnlyBody;
     protected boolean readOnlyProperties;
+    protected boolean validatePropertyNames = true;
 
     public JmsMessage(JmsMessageFacade facade) {
         this.facade = facade;
@@ -59,6 +60,7 @@ public class JmsMessage implements javax.jms.Message {
         this.readOnlyProperties = other.readOnlyBody;
         this.acknowledgeCallback = other.acknowledgeCallback;
         this.connection = other.connection;
+        this.validatePropertyNames = other.validatePropertyNames;
     }
 
     @Override
@@ -105,6 +107,14 @@ public class JmsMessage implements javax.jms.Message {
         facade.clearBody();
     }
 
+    public boolean isValidatePropertyNames() {
+        return validatePropertyNames;
+    }
+
+    public void setValidatePropertyNames(boolean validatePropertyNames) {
+        this.validatePropertyNames = validatePropertyNames;
+    }
+
     public boolean isReadOnlyBody() {
         return this.readOnlyBody;
     }
@@ -243,13 +253,31 @@ public class JmsMessage implements javax.jms.Message {
 
     @Override
     public boolean propertyExists(String name) throws JMSException {
+        try {
+            checkPropertyNameIsValid(name);
+        } catch (IllegalArgumentException iae) {
+            return false;
+        }
+
         return JmsMessagePropertyIntercepter.propertyExists(facade, name);
     }
 
     @Override
     public Enumeration<?> getPropertyNames() throws JMSException {
         Set<String> result = new HashSet<String>();
-        result.addAll(JmsMessagePropertyIntercepter.getPropertyNames(facade, true));
+
+        Set<String> propertyNames = JmsMessagePropertyIntercepter.getPropertyNames(facade, true);
+        for (String name : propertyNames) {
+            try {
+                checkPropertyNameIsValid(name);
+            } catch (IllegalArgumentException iae) {
+                // Don't add the name
+                continue;
+            }
+
+            result.add(name);
+        }
+
         return Collections.enumeration(result);
     }
 
@@ -524,13 +552,11 @@ public class JmsMessage implements javax.jms.Message {
             throw new IllegalArgumentException("Property name must not be the empty string");
         }
 
-        checkIdentifierFormat(propertyName);
-    }
-
-    private void checkIdentifierFormat(String identifier) throws IllegalArgumentException {
-        checkIdentifierLetterAndDigitRequirements(identifier);
-        checkIdentifierIsntNullTrueFalse(identifier);
-        checkIdentifierIsntLogicOperator(identifier);
+        if (isValidatePropertyNames()) {
+            checkIdentifierLetterAndDigitRequirements(propertyName);
+            checkIdentifierIsntNullTrueFalse(propertyName);
+            checkIdentifierIsntLogicOperator(propertyName);
+        }
     }
 
     private void checkIdentifierIsntLogicOperator(String identifier) {

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/dacdce01/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
index 82ede41..23d2b95 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
@@ -36,6 +36,7 @@ import org.apache.qpid.jms.JmsConnection;
 import org.apache.qpid.jms.JmsDestination;
 import org.apache.qpid.jms.JmsTopic;
 import org.apache.qpid.jms.message.facade.JmsMessageFacade;
+import org.apache.qpid.jms.message.facade.test.JmsTestMessageFacade;
 import org.apache.qpid.jms.message.facade.test.JmsTestMessageFactory;
 import org.junit.Before;
 import org.junit.Test;
@@ -211,6 +212,8 @@ public class JmsMessageTest {
         msg1.setJMSTimestamp(this.jmsTimestamp);
         msg1.setReadOnlyProperties(true);
         msg1.setConnection(connection);
+        boolean isValidate = !msg1.isValidatePropertyNames();
+        msg1.setValidatePropertyNames(isValidate);
         JmsMessage msg2 = msg1.copy();
         assertEquals(msg1.getJMSMessageID(), msg2.getJMSMessageID());
         assertTrue(msg1.getJMSCorrelationID().equals(msg2.getJMSCorrelationID()));
@@ -223,6 +226,7 @@ public class JmsMessageTest {
         assertEquals(msg1.getJMSPriority(), msg2.getJMSPriority());
         assertEquals(msg1.getJMSTimestamp(), msg2.getJMSTimestamp());
         assertEquals(msg1.getConnection(), msg2.getConnection());
+        assertEquals(msg1.isValidatePropertyNames(), msg2.isValidatePropertyNames());
 
         LOG.info("Message is:  " + msg1);
     }
@@ -364,6 +368,34 @@ public class JmsMessageTest {
     }
 
     @Test
+    public void testPropertyExistsWithInvalidName() throws JMSException {
+        doPropertyExistsWithInvalidNameTestImpl(false);
+    }
+
+    private void doPropertyExistsWithInvalidNameTestImpl(boolean disableValidation) throws JMSException {
+        String invalidPropName = "my-invalid-property";
+        String valueA = "valueA";
+
+        JmsMessage msg = factory.createMessage();
+        if(disableValidation) {
+            msg.setValidatePropertyNames(false);
+        }
+
+        assertTrue(msg.getFacade() instanceof JmsTestMessageFacade);
+        JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade();
+
+        assertFalse(testFacade.propertyExists(invalidPropName));
+        testFacade.setProperty(invalidPropName, valueA);
+        assertTrue(testFacade.propertyExists(invalidPropName));
+
+        if(!disableValidation) {
+            assertFalse("Property should be indicated to not exist", msg.propertyExists(invalidPropName));
+        } else {
+            assertTrue("Property should be indicated to exist", msg.propertyExists(invalidPropName));
+        }
+    }
+
+    @Test
     public void testGetBooleanProperty() throws JMSException {
         JmsMessage msg = factory.createMessage();
         String name = "booleanProperty";
@@ -437,7 +469,39 @@ public class JmsMessageTest {
     }
 
     @Test
-    @SuppressWarnings("rawtypes")
+    public void testGetObjectPropertyWithInvalidNameThrowsIAEByDefault() throws JMSException {
+        doGetObjectPropertyNameValidationTestImpl(false);
+    }
+
+    private void doGetObjectPropertyNameValidationTestImpl(boolean disableValidation) throws JMSException {
+        String invalidPropName1 = "my-invalid-property";
+        String valueA = "valueA";
+
+        JmsMessage msg = factory.createMessage();
+        if(disableValidation) {
+            msg.setValidatePropertyNames(false);
+        }
+
+        assertTrue(msg.getFacade() instanceof JmsTestMessageFacade);
+        JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade();
+
+        assertNull(testFacade.getProperty(invalidPropName1));
+        testFacade.setProperty(invalidPropName1, valueA);
+        assertEquals(valueA, testFacade.getProperty(invalidPropName1));
+
+        if (!disableValidation) {
+            try {
+                msg.getObjectProperty(invalidPropName1);
+                fail("expected rejection of identifier");
+            } catch (IllegalArgumentException iae) {
+                //expected
+            }
+        } else {
+            assertEquals(valueA, msg.getObjectProperty(invalidPropName1));
+        }
+    }
+
+    @Test
     public void testGetPropertyNames() throws JMSException {
         JmsMessage msg = factory.createMessage();
         String propName = "floatProperty";
@@ -449,7 +513,7 @@ public class JmsMessageTest {
         boolean propNameFound = false;
         boolean jmsxNameFound = false;
         boolean headerNameFound1 = false;
-        for (Enumeration iter = msg.getPropertyNames(); iter.hasMoreElements();) {
+        for (Enumeration<?> iter = msg.getPropertyNames(); iter.hasMoreElements();) {
             Object element = iter.nextElement();
             propNameFound |= element.equals(propName);
             jmsxNameFound |= element.equals(jmsxName);
@@ -462,6 +526,60 @@ public class JmsMessageTest {
     }
 
     @Test
+    public void testGetPropertyNamesReturnsValidNamesByDefault() throws JMSException {
+        doGetPropertyNamesResultFilteringTestImpl(false);
+    }
+
+    private void doGetPropertyNamesResultFilteringTestImpl(boolean disableValidation) throws JMSException {
+        String invalidPropName1 = "my-invalid-property1";
+        String invalidPropName2 = "my.invalid.property2";
+        String validPropName = "my_valid_property";
+
+        String valueA = "valueA";
+        String valueB = "valueB";
+        String valueC = "valueC";
+
+        JmsMessage msg = factory.createMessage();
+        if(disableValidation) {
+            msg.setValidatePropertyNames(false);
+        }
+
+        assertTrue(msg.getFacade() instanceof JmsTestMessageFacade);
+        JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade();
+
+        assertNull(testFacade.getProperty(invalidPropName1));
+        assertNull(testFacade.getProperty(invalidPropName2));
+        assertNull(testFacade.getProperty(validPropName));
+
+        testFacade.setProperty(invalidPropName1, valueA);
+        testFacade.setProperty(invalidPropName2, valueB);
+        testFacade.setProperty(validPropName, valueC);
+
+        assertEquals(valueA, testFacade.getProperty(invalidPropName1));
+        assertEquals(valueB, testFacade.getProperty(invalidPropName2));
+        assertEquals(valueC, testFacade.getProperty(validPropName));
+
+        boolean invalidPropName1Found = false;
+        boolean invalidPropName2Found = false;
+        boolean validPropNameFound = false;
+        for (Enumeration<?> iter = msg.getPropertyNames(); iter.hasMoreElements();) {
+            Object element = iter.nextElement();
+            invalidPropName1Found |= element.equals(invalidPropName1);
+            invalidPropName2Found |= element.equals(invalidPropName2);
+            validPropNameFound |= element.equals(validPropName);
+        }
+
+        if (!disableValidation) {
+            assertFalse("Invalid prop name 1 was found", invalidPropName1Found);
+            assertFalse("Invalid prop name 2 was found", invalidPropName2Found);
+        } else {
+            assertTrue("Invalid prop name 1 was not found", invalidPropName1Found);
+            assertTrue("Invalid prop name 2 was not found", invalidPropName2Found);
+        }
+        assertTrue("valid prop name was not found", validPropNameFound);
+    }
+
+    @Test
     @SuppressWarnings("rawtypes")
     public void testGetAllPropertyNames() throws JMSException {
         JmsMessage msg = factory.createMessage();
@@ -1108,12 +1226,32 @@ public class JmsMessageTest {
      */
     @Test
     public void testSetPropertyWithNonLetterOrDigitCharacterThrowsIAE() throws Exception {
-        String propertyName = "name-invalid";
-        JmsMessage testMessage = factory.createMessage();
-        try {
-            testMessage.setObjectProperty(propertyName, "value");
-            fail("expected rejection of identifier starting with non-letter character");
-        } catch (IllegalArgumentException iae) {
+        doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(false);
+    }
+
+    private void doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(boolean disableValidation) throws JMSException {
+        String invalidPropertyName = "name-invalid";
+        String valueA = "value";
+
+        JmsMessage msg = factory.createMessage();
+        if(disableValidation) {
+            msg.setValidatePropertyNames(false);
+        }
+
+        assertTrue(msg.getFacade() instanceof JmsTestMessageFacade);
+        JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade();
+
+        if (!disableValidation) {
+            try {
+                msg.setObjectProperty(invalidPropertyName, valueA);
+                fail("expected rejection of identifier starting with non-letter character");
+            } catch (IllegalArgumentException iae) {
+                // Expected
+            }
+        } else {
+            msg.setObjectProperty(invalidPropertyName, valueA);
+
+            assertEquals(valueA, testFacade.getProperty(invalidPropertyName));
         }
     }
 
@@ -1290,6 +1428,28 @@ public class JmsMessageTest {
         }
     }
 
+    //---------- Test disabling Message Properties name validation -------------//
+
+    @Test
+    public void testGetPropertyNamesReturnsAllNamesWithValidationDisabled() throws JMSException {
+        doGetPropertyNamesResultFilteringTestImpl(true);
+    }
+
+    @Test
+    public void testGetObjectPropertyWithInvalidNameAndValidationDisabled() throws JMSException {
+        doGetObjectPropertyNameValidationTestImpl(true);
+    }
+
+    @Test
+    public void testSetObjectPropertyWithInvalidNameAndValidationDisabled() throws Exception {
+        doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(true);
+    }
+
+    @Test
+    public void testPropertyExistsWithInvalidNameAndValidationDisabled() throws JMSException {
+        doPropertyExistsWithInvalidNameTestImpl(true);
+    }
+
     //--------- Test support method ------------------------------------------//
 
     private void assertGetMissingPropertyThrowsNumberFormatException(JmsMessage testMessage, String propertyName, Class<?> clazz) throws JMSException {


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