You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jl...@apache.org on 2007/07/24 14:32:11 UTC

svn commit: r559023 - in /activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq: advisory/AdvisoryBroker.java filter/DestinationMap.java filter/DestinationMapNode.java

Author: jlim
Date: Tue Jul 24 05:32:09 2007
New Revision: 559023

URL: http://svn.apache.org/viewvc?view=rev&rev=559023
Log:
patch for https://issues.apache.org/activemq/browse/AMQ-1319 and https://issues.apache.org/activemq/browse/AMQ-1322

Modified:
    activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
    activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
    activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMapNode.java

Modified: activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
URL: http://svn.apache.org/viewvc/activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java?view=diff&rev=559023&r1=559022&r2=559023
==============================================================================
--- activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java (original)
+++ activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java Tue Jul 24 05:32:09 2007
@@ -165,14 +165,17 @@
             info.setOperationType(DestinationInfo.REMOVE_OPERATION_TYPE);
             ActiveMQTopic topic = AdvisorySupport.getDestinationAdvisoryTopic(destination);
             fireAdvisory(context, topic, info);
-            try {
-                next.removeDestination(context, AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination()), -1);
-            } catch (Exception expectedIfDestinationDidNotExistYet) {
-            }
-            try {
-                next.removeDestination(context, AdvisorySupport.getProducerAdvisoryTopic(info.getDestination()), -1);
-            } catch (Exception expectedIfDestinationDidNotExistYet) {
-            }
+
+            if (!AdvisorySupport.isAdvisoryTopic(destination)) {
+                try {
+                    context.getBroker().removeDestination(context, AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination()), -1);
+                } catch (Exception expectedIfDestinationDidNotExistYet) {
+                }
+                try {
+                    context.getBroker().removeDestination(context, AdvisorySupport.getProducerAdvisoryTopic(info.getDestination()), -1);
+                } catch (Exception expectedIfDestinationDidNotExistYet) {
+                }
+             }
         }
        
     }
@@ -186,14 +189,17 @@
             info.setOperationType(DestinationInfo.REMOVE_OPERATION_TYPE);
             ActiveMQTopic topic = AdvisorySupport.getDestinationAdvisoryTopic(destInfo.getDestination());
             fireAdvisory(context, topic, info);
-            try {
-                next.removeDestination(context, AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination()), -1);
-            } catch (Exception expectedIfDestinationDidNotExistYet) {
-            }
-            try {
-                next.removeDestination(context, AdvisorySupport.getProducerAdvisoryTopic(info.getDestination()), -1);
-            } catch (Exception expectedIfDestinationDidNotExistYet) {
-            }
+
+            if (!AdvisorySupport.isAdvisoryTopic(destInfo.getDestination())) {
+                try {
+                    context.getBroker().removeDestination(context, AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination()), -1);
+                } catch (Exception expectedIfDestinationDidNotExistYet) {
+                }
+                try {
+                    context.getBroker().removeDestination(context, AdvisorySupport.getProducerAdvisoryTopic(info.getDestination()), -1);
+                } catch (Exception expectedIfDestinationDidNotExistYet) {
+                }
+             }
         }
 
     }

Modified: activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
URL: http://svn.apache.org/viewvc/activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java?view=diff&rev=559023&r1=559022&r2=559023
==============================================================================
--- activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java (original)
+++ activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java Tue Jul 24 05:32:09 2007
@@ -162,7 +162,7 @@
     }
 
     /**
-     * @param dest
+     * @param key
      * @return 
      */
     public Set removeAll(ActiveMQDestination key) {

Modified: activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMapNode.java
URL: http://svn.apache.org/viewvc/activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMapNode.java?view=diff&rev=559023&r1=559022&r2=559023
==============================================================================
--- activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMapNode.java (original)
+++ activemq/branches/activemq-4.1/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMapNode.java Tue Jul 24 05:32:09 2007
@@ -24,31 +24,39 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Iterator;
 
 /**
  * An implementation class used to implement {@link DestinationMap}
  * 
  * @version $Revision: 1.2 $
  */
-public class DestinationMapNode {
+public class DestinationMapNode implements DestinationNode {
+    protected static final String ANY_CHILD = DestinationMap.ANY_CHILD;
+    protected static final String ANY_DESCENDENT = DestinationMap.ANY_DESCENDENT;	
     // we synchornize at the DestinationMap level
     private DestinationMapNode parent;
     private List values = new ArrayList();
     private Map childNodes = new HashMap();
-    private String path = "*";
-    private DestinationMapNode anyChild;
-    protected static final String ANY_CHILD = DestinationMap.ANY_CHILD;
-    protected static final String ANY_DESCENDENT = DestinationMap.ANY_DESCENDENT;
+    private String path = "Root";
+//    private DestinationMapNode anyChild;
+    private int pathLength;
 
     public DestinationMapNode(DestinationMapNode parent) {
         this.parent = parent;
+        if (parent == null) {
+            pathLength = 0;
+        }
+        else {
+            pathLength = parent.pathLength + 1;
+        }        
     }
 
     /**
      * Returns the child node for the given named path or null if it does not
      * exist
      */
-    public DestinationMapNode getChild(String path) {
+    public DestinationNode getChild(String path) {
         return (DestinationMapNode) childNodes.get(path);
     }
 
@@ -80,49 +88,49 @@
     /**
      * Returns the node which represents all children (i.e. the * node)
      */
-    public DestinationMapNode getAnyChildNode() {
-        if (anyChild == null) {
-            anyChild = createChildNode();
-        }
-        return anyChild;
-    }
+    //public DestinationMapNode getAnyChildNode() {
+    //    if (anyChild == null) {
+    //        anyChild = createChildNode();
+    //    }
+    //    return anyChild;
+    //}
 
     /**
      * Returns a mutable List of the values available at this node in the tree
      */
-    public List getValues() {
+    public Collection getValues() {
         return values;
     }
 
     /**
      * Returns a mutable List of the values available at this node in the tree
      */
-    public List removeValues() {
+    public Collection removeValues() {
     	ArrayList v = new ArrayList(values);
-    	parent.getAnyChildNode().getValues().removeAll(v);
+    //	parent.getAnyChildNode().getValues().removeAll(v);
     	values.clear();
     	pruneIfEmpty();
         return v;
     }
     
     
-    public Set removeDesendentValues() {
+    public Collection removeDesendentValues() {
         Set answer = new HashSet();
         removeDesendentValues(answer);
         return answer;
     }
     
     protected void removeDesendentValues(Set answer) {
-        if (anyChild != null) {
-            anyChild.removeDesendentValues(answer);
-        }
+    //    if (anyChild != null) {
+    //        anyChild.removeDesendentValues(answer);
+    //    }
         answer.addAll(removeValues());
     }
 
     /**
      * Returns a list of all the values from this node down the tree
      */
-    public Set getDesendentValues() {
+    public Collection getDesendentValues() {
         Set answer = new HashSet();
         appendDescendantValues(answer);
         return answer;
@@ -133,12 +141,12 @@
             values.add(value);
         }
         else {
-            if (idx == paths.length - 1) {
-                getAnyChildNode().getValues().add(value);
-            }
-            else {
-                getAnyChildNode().add(paths, idx + 1, value);
-            }
+     //       if (idx == paths.length - 1) {
+     //           getAnyChildNode().getValues().add(value);
+     //       }
+     //       else {
+     //           getAnyChildNode().add(paths, idx + 1, value);
+     //       }
             getChildOrCreate(paths[idx]).add(paths, idx + 1, value);
         }
     }
@@ -149,12 +157,12 @@
             pruneIfEmpty();
         }
         else {
-            if (idx == paths.length - 1) {
-                getAnyChildNode().getValues().remove(value);
-            }
-            else {
-                getAnyChildNode().remove(paths, idx + 1, value);
-            }
+     //       if (idx == paths.length - 1) {
+     //           getAnyChildNode().getValues().remove(value);
+     //       }
+     //       else {
+    //            getAnyChildNode().remove(paths, idx + 1, value);
+    //        }
             getChildOrCreate(paths[idx]).remove(paths, ++idx, value);
         }
     }
@@ -175,7 +183,7 @@
 //        }
 //        
         
-        DestinationMapNode node = this;
+        DestinationNode node = this;
         for (int i = startIndex, size = paths.length; i < size && node != null; i++) {
 
         	String path = paths[i];
@@ -186,7 +194,8 @@
 
             node.appendMatchingWildcards(answer, paths, i);
             if (path.equals(ANY_CHILD)) {
-                node = node.getAnyChildNode();
+                //node = node.getAnyChildNode();
+                node = new AnyChildDestinationNode(node);
             }
             else {
                 node = node.getChild(path);
@@ -200,11 +209,20 @@
         
     }
 
-    protected void appendDescendantValues(Set answer) {
-        answer.addAll(values);
-        if (anyChild != null) {
-            anyChild.appendDescendantValues(answer);
-        }
+    public void appendDescendantValues(Set answer) {
+         answer.addAll(values);
+
+        // lets add all the children too
+        Iterator iter = childNodes.values().iterator();
+        while (iter.hasNext()) {
+            DestinationNode child = (DestinationNode) iter.next();
+            child.appendDescendantValues(answer);
+         }
+        
+        // TODO???
+//        if (anyChild != null) {
+//            anyChild.appendDescendantValues(answer);
+//        }
     }
 
     /**
@@ -214,8 +232,15 @@
         return new DestinationMapNode(this);
     }
 
+
+    /**
+     * Matches any entries in the map containing wildcards
+     */
     public void appendMatchingWildcards(Set answer, String[] paths, int idx) {
-        DestinationMapNode wildCardNode = getChild(ANY_CHILD);
+        if (idx - 1 > pathLength) {
+            return;
+        }
+        DestinationNode wildCardNode = getChild(ANY_CHILD);
         if (wildCardNode != null) {
             wildCardNode.appendMatchingValues(answer, paths, idx + 1);
         }
@@ -226,7 +251,7 @@
     }
 
     public void appendMatchingValues(Set answer, String[] paths, int startIndex) {
-        DestinationMapNode node = this;
+        DestinationNode node = this;
         boolean couldMatchAny = true;
         for (int i = startIndex, size = paths.length; i < size && node != null; i++) {
             String path = paths[i];
@@ -238,7 +263,7 @@
 
             node.appendMatchingWildcards(answer, paths, i);
             if (path.equals(ANY_CHILD)) {
-                node = node.getAnyChildNode();
+                node = new AnyChildDestinationNode(node);
             }
             else {
                 node = node.getChild(path);
@@ -248,7 +273,7 @@
             answer.addAll(node.getValues());
             if (couldMatchAny) {
                 // lets allow FOO.BAR to match the FOO.BAR.> entry in the map
-                DestinationMapNode child = node.getChild(ANY_DESCENDENT);
+                DestinationNode child = node.getChild(ANY_DESCENDENT);
                 if (child != null) {
                     answer.addAll(child.getValues());
                 }