You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ra...@apache.org on 2012/05/10 22:23:12 UTC

svn commit: r1336878 - in /qpid/branches/address-refactor2/qpid/java: client/src/main/java/org/apache/qpid/jms/ common/src/main/java/org/apache/qpid/messaging/ common/src/main/java/org/apache/qpid/messaging/address/

Author: rajith
Date: Thu May 10 20:23:11 2012
New Revision: 1336878

URL: http://svn.apache.org/viewvc?rev=1336878&view=rev
Log:
QPID-3401 Node and Link objects are now immutable once they are
initialized. All maps/lists returned by them are wrapped with
unmodifiable map/lists. All setter methods will throw an exception once
they are marked read-only.

Modified:
    qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/DestinationStringParser.java
    qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidQueue.java
    qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidTopic.java
    qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/Address.java
    qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Link.java
    qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Node.java

Modified: qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/DestinationStringParser.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/DestinationStringParser.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/DestinationStringParser.java (original)
+++ qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/DestinationStringParser.java Thu May 10 20:23:11 2012
@@ -57,15 +57,11 @@ public class DestinationStringParser
 
         public static DestSyntax getSyntaxType(String s)
         {
-            if ((BURL_STR).equals(s))
+            try
             {
-                return BURL;
+                return Enum.valueOf(DestSyntax.class, s.toUpperCase());
             }
-            else if ((ADDR_STR).equals(s))
-            {
-                return ADDR;
-            }
-            else
+            catch (IllegalArgumentException e)
             {
                 throw new IllegalArgumentException("Invalid Destination Syntax Type" +
                 " should be one of {BURL|ADDR}");
@@ -172,6 +168,7 @@ public class DestinationStringParser
         node.setDeclareProps(helper.getNodeDeclareArgs());
         node.setBindingProps(helper.getNodeBindings());
         addr.setNode(node);
+        node.markReadOnly();
 
         Link link =  new Link();
         link.setName(helper.getLinkName());
@@ -183,6 +180,7 @@ public class DestinationStringParser
         link.setBindingProps(helper.getLinkBindings());
         link.setSubscribeProps(helper.getLinkSubscribeArgs());
         addr.setLink(link);
+        link.markReadOnly();
 
         addr.markReadOnly();
         return addr;
@@ -241,7 +239,13 @@ public class DestinationStringParser
         node.setAssertPolicy(AddressPolicy.NEVER);
         node.setCreatePolicy(AddressPolicy.RECEIVER);
         node.setDeletePolicy(AddressPolicy.NEVER);
+        node.markReadOnly();
+        addr.setNode(node);
 
+        link.markReadOnly();
+        addr.setLink(link);
+
+        addr.markReadOnly();
         return addr;
     }
 }

Modified: qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidQueue.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidQueue.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidQueue.java (original)
+++ qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidQueue.java Thu May 10 20:23:11 2012
@@ -56,7 +56,7 @@ public class QpidQueue extends QpidDesti
             return true;
         }
 
-        if (!(obj instanceof QpidQueue))
+        if(obj.getClass() != getClass())
         {
             return false;
         }

Modified: qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidTopic.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidTopic.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidTopic.java (original)
+++ qpid/branches/address-refactor2/qpid/java/client/src/main/java/org/apache/qpid/jms/QpidTopic.java Thu May 10 20:23:11 2012
@@ -54,7 +54,7 @@ public class QpidTopic extends QpidDesti
             return true;
         }
 
-        if (!(obj instanceof QpidTopic))
+        if(obj.getClass() != getClass())
         {
             return false;
         }

Modified: qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/Address.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/Address.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/Address.java (original)
+++ qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/Address.java Thu May 10 20:23:11 2012
@@ -20,15 +20,15 @@
  */
 package org.apache.qpid.messaging;
 
-import org.apache.qpid.messaging.address.Link;
-import org.apache.qpid.messaging.address.Node;
-import org.apache.qpid.messaging.util.AddressParser;
-
 import static org.apache.qpid.messaging.util.PyPrint.pprint;
 
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.qpid.messaging.address.Link;
+import org.apache.qpid.messaging.address.Node;
+import org.apache.qpid.messaging.util.AddressParser;
+
 
 /**
  * Address

Modified: qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Link.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Link.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Link.java (original)
+++ qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Link.java Thu May 10 20:23:11 2012
@@ -25,6 +25,7 @@ import static org.apache.qpid.messaging.
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 public class Link
 {
@@ -35,27 +36,21 @@ public class Link
 
     public enum Reliability
     {
-        UNRELIABLE, AT_MOST_ONCE, AT_LEAST_ONCE, EXACTLY_ONCE;
+        UNRELIABLE, AT_LEAST_ONCE;
 
-        public static Reliability getReliability(String reliability)
+        public static Reliability getReliability(String str)
         throws AddressException
         {
-            if (reliability == null)
+            try
             {
-                return AT_LEAST_ONCE;
+                return str == null ? AT_LEAST_ONCE : Enum.valueOf(Reliability.class, str.toUpperCase());
             }
-            else if (reliability.equalsIgnoreCase("unreliable"))
+            catch (IllegalArgumentException e)
             {
-                return UNRELIABLE;
-            }
-            else if (reliability.equalsIgnoreCase("at-least-once"))
-            {
-                return AT_LEAST_ONCE;
-            }
-            else
-            {
-                throw new AddressException("The reliability mode '"
-                        + reliability + "' is not yet supported");
+                throw new AddressException((new StringBuffer("The reliability mode")
+                .append(" '").append(str).append("' ")
+                .append("is not yet supported, supported.")
+                .append("Supported types are { UNRELIABLE, AT_LEAST_ONCE }.")).toString());
             }
         }
     }
@@ -73,6 +68,8 @@ public class Link
     private List<Object> _xBindingProps = Collections.emptyList();
     private Map<String, Object> _xSubscribeProps = Collections.emptyMap();
 
+    private AtomicBoolean readOnly = new AtomicBoolean(false);
+
     public Reliability getReliability()
     {
         return _reliability;
@@ -115,72 +112,95 @@ public class Link
 
     public Map<String, Object> getDeclareProperties()
     {
-        return _xDeclareProps;
+        return Collections.unmodifiableMap(_xDeclareProps);
     }
 
     public List<Object> getBindingProperties()
     {
-        return _xBindingProps;
+        return Collections.unmodifiableList(_xBindingProps);
     }
 
     public Map<String, Object> getSubscribeProperties()
     {
-        return _xSubscribeProps;
+        return Collections.unmodifiableMap(_xSubscribeProps);
     }
 
     public void setName(String name)
     {
+        checkReadOnly();
         this.name = name;
     }
 
     public void setFilter(String filter)
     {
+        checkReadOnly();
         this._filter = filter;
     }
 
     public void setFilterType(FilterType filterType)
     {
+        checkReadOnly();
         this._filterType = filterType;
     }
 
     public void setNoLocal(boolean noLocal)
     {
+        checkReadOnly();
         this._noLocal = noLocal;
     }
 
     public void setDurable(boolean durable)
     {
+        checkReadOnly();
         this._durable = durable;
     }
 
     public void setConsumerCapacity(int consumerCapacity)
     {
+        checkReadOnly();
         this._consumerCapacity = consumerCapacity;
     }
 
     public void setProducerCapacity(int producerCapacity)
     {
+        checkReadOnly();
         this._producerCapacity = producerCapacity;
     }
 
     public void setReliability(Reliability reliability)
     {
+        checkReadOnly();
         this._reliability = reliability;
     }
 
     public void setDeclareProps(Map<String, Object> xDeclareProps)
     {
+        checkReadOnly();
         this._xDeclareProps = xDeclareProps;
     }
 
     public void setBindingProps(List<Object> xBindingProps)
     {
+        checkReadOnly();
         this._xBindingProps = xBindingProps;
     }
 
     public void setSubscribeProps(Map<String, Object> xSubscribeProps)
     {
+        checkReadOnly();
         this._xSubscribeProps = xSubscribeProps;
     }
 
+    public void checkReadOnly()
+    {
+        if (readOnly.get())
+        {
+            throw new IllegalArgumentException("Once initialized the Link object is immutable");
+        }
+    }
+
+    public void markReadOnly()
+    {
+        readOnly.set(true);
+    }
 }

Modified: qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Node.java
URL: http://svn.apache.org/viewvc/qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Node.java?rev=1336878&r1=1336877&r2=1336878&view=diff
==============================================================================
--- qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Node.java (original)
+++ qpid/branches/address-refactor2/qpid/java/common/src/main/java/org/apache/qpid/messaging/address/Node.java Thu May 10 20:23:11 2012
@@ -23,8 +23,7 @@ package org.apache.qpid.messaging.addres
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-
-import org.apache.qpid.messaging.address.Link.Reliability;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 public class Node
 {
@@ -35,26 +34,15 @@ public class Node
         public static AddressPolicy getAddressPolicy(String policy)
         throws AddressException
         {
-            if (policy == null || policy.equalsIgnoreCase("never"))
-            {
-                return NEVER;
-            }
-            else if (policy.equalsIgnoreCase("always"))
-            {
-                return ALWAYS;
-            }
-            else if (policy.equalsIgnoreCase("sender"))
+            try
             {
-                return SENDER;
+                return policy == null ? NEVER : Enum.valueOf(AddressPolicy.class, policy.toUpperCase());
             }
-            else if (policy.equalsIgnoreCase("receiver"))
+            catch (IllegalArgumentException e)
             {
-                return RECEIVER;
-            }
-            else
-            {
-                throw new AddressException("Invalid address policy type : '"
-                        + policy + "'");
+                throw new AddressException ((new StringBuffer("Invalid address policy")
+                .append(" '").append(policy).append("' ")
+                .append("Valid policy types are { NEVER, ALWAYS, SENDER, RECEIVER}.")).toString());
             }
         }
     };
@@ -65,20 +53,15 @@ public class Node
 
         public static NodeType getNodeType(String type) throws AddressException
         {
-            if (type == null)
-            {
-                return QUEUE; // defaults to queue
-            }
-            else if (type.equalsIgnoreCase("queue"))
+            try
             {
-                return QUEUE;
+                return type == null ? QUEUE : Enum.valueOf(NodeType.class, type.toUpperCase());
             }
-            else if (type.equalsIgnoreCase("topic"))
+            catch (IllegalArgumentException e)
             {
-                return TOPIC;
-            }else    
-            {
-                throw new AddressException("Invalid node type : '" + type + "'");
+                throw new AddressException ((new StringBuffer("Invalid node type")
+                .append(" '").append(type).append("' ")
+                .append("Valid node types are { QUEUE, TOPIC }.")).toString());
             }
         }
     };
@@ -94,6 +77,7 @@ public class Node
 
     private Map<String, Object> _xDeclareProps = Collections.emptyMap();
     private List<Object> _xBindingProps = Collections.emptyList();
+    private AtomicBoolean readOnly = new AtomicBoolean(false);
 
     public String getName()
     {
@@ -127,51 +111,72 @@ public class Node
 
     public Map<String, Object> getDeclareProperties()
     {
-        return _xDeclareProps;
+        return Collections.unmodifiableMap(_xDeclareProps);
     }
 
     public List<Object> getBindingProperties()
     {
-        return _xBindingProps;
+        return Collections.unmodifiableList(_xBindingProps);
     }
 
     public void setName(String name)
     {
+        checkReadOnly();
         this.name = name;
     }
 
     public void setDurable(boolean durable)
     {
+        checkReadOnly();
         this._durable = durable;
     }
 
     public void setType(NodeType type)
     {
+        checkReadOnly();
         this._type = type;
     }
 
     public void setCreatePolicy(AddressPolicy createPolicy)
     {
+        checkReadOnly();
         this._createPolicy = createPolicy;
     }
 
     public void setAssertPolicy(AddressPolicy assertPolicy)
     {
+        checkReadOnly();
         this._assertPolicy = assertPolicy;
     }
 
     public void setDeletePolicy(AddressPolicy deletePolicy)
     {
+        checkReadOnly();
         this._deletePolicy = deletePolicy;
     }
 
     public void setDeclareProps(Map<String, Object> xDeclareProps)
     {
+        checkReadOnly();
         this._xDeclareProps = xDeclareProps;
     }
 
     public void setBindingProps(List<Object> xBindingProps)
     {
+        checkReadOnly();
         this._xBindingProps = xBindingProps;
     }
+
+    public void checkReadOnly()
+    {
+        if (readOnly.get())
+        {
+            throw new IllegalArgumentException("Once initialized the Link object is immutable");
+        }
+    }
+
+    public void markReadOnly()
+    {
+        readOnly.set(true);
+    }
 }
\ No newline at end of file



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