Author: jstrachan
Date: Wed Jan 4 02:42:21 2006
New Revision: 365888
URL: http://svn.apache.org/viewcvs?rev=365888&view=rev
Log:
fixed the DestinationMap so that it can hold queues and topics with the same
name without intermixing the two trees
Modified:
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/filter/DestinationMapTest.java
incubator/activemq/trunk/activemq-core/src/test/resources/org/apache/activemq/broker/policy/individual-dlq.xml
Modified:
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
URL:
http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java?rev=365888&r1=365887&r2=365888&view=diff
==============================================================================
---
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
(original)
+++
incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/filter/DestinationMap.java
Wed Jan 4 02:42:21 2006
@@ -26,31 +26,35 @@
import org.apache.activemq.command.ActiveMQDestination;
/**
- * A Map-like data structure allowing values to be indexed by [EMAIL
PROTECTED] ActiveMQDestination}
- * and retrieved by destination - supporting both * and > style of wildcard
- * as well as composite destinations.
- * <br>
- * This class assumes that the index changes rarely but that fast lookup into
the index is required.
- * So this class maintains a pre-calculated index for destination steps. So
looking up the values
- * for "TEST.*" or "*.TEST" will be pretty fast.
- * <br>
- * Looking up of a value could return a single value or a List of matching
values if a wildcard or
- * composite destination is used.
- *
+ * A Map-like data structure allowing values to be indexed by
+ * [EMAIL PROTECTED] ActiveMQDestination} and retrieved by destination -
supporting both *
+ * and > style of wildcard as well as composite destinations. <br>
+ * This class assumes that the index changes rarely but that fast lookup into
+ * the index is required. So this class maintains a pre-calculated index for
+ * destination steps. So looking up the values for "TEST.*" or "*.TEST" will be
+ * pretty fast. <br>
+ * Looking up of a value could return a single value or a List of matching
+ * values if a wildcard or composite destination is used.
+ *
* @version $Revision: 1.3 $
*/
public class DestinationMap {
- private DestinationMapNode rootNode = new DestinationMapNode(null);
protected static final String ANY_DESCENDENT =
DestinationFilter.ANY_DESCENDENT;
protected static final String ANY_CHILD = DestinationFilter.ANY_CHILD;
+ private DestinationMapNode queueRootNode = new DestinationMapNode(null);
+ private DestinationMapNode topicRootNode = new DestinationMapNode(null);
+
/**
- * Looks up the value(s) matching the given Destination key. For simple
destinations
- * this is typically a List of one single value, for wildcards or
composite destinations this will typically be
- * a List of matching values.
- *
- * @param key the destination to lookup
- * @return a List of matching values or an empty list if there are no
matching values.
+ * Looks up the value(s) matching the given Destination key. For simple
+ * destinations this is typically a List of one single value, for wildcards
+ * or composite destinations this will typically be a List of matching
+ * values.
+ *
+ * @param key
+ * the destination to lookup
+ * @return a List of matching values or an empty list if there are no
+ * matching values.
*/
public synchronized Set get(ActiveMQDestination key) {
if (key.isComposite()) {
@@ -81,7 +85,7 @@
return;
}
String[] paths = key.getDestinationPaths();
- rootNode.add(paths, 0, value);
+ getRootNode(key).add(paths, 0, value);
}
/**
@@ -97,20 +101,24 @@
return;
}
String[] paths = key.getDestinationPaths();
- rootNode.remove(paths, 0, value);
+ getRootNode(key).remove(paths, 0, value);
}
- public int getRootChildCount() {
- return rootNode.getChildCount();
+ public int getTopicRootChildCount() {
+ return topicRootNode.getChildCount();
+ }
+
+ public int getQueueRootChildCount() {
+ return queueRootNode.getChildCount();
}
// Implementation methods
- //-------------------------------------------------------------------------
+ //
-------------------------------------------------------------------------
/**
- * A helper method to allow the destination map to be populated from a
dependency injection
- * framework such as Spring
+ * A helper method to allow the destination map to be populated from a
+ * dependency injection framework such as Spring
*/
protected void setEntries(List entries) {
for (Iterator iter = entries.iterator(); iter.hasNext();) {
@@ -125,11 +133,12 @@
}
}
}
-
+
/**
- * Returns the type of the allowed entries which can be set via the [EMAIL
PROTECTED] #setEntries(List)} method.
- * This allows derived classes to further restrict the type of allowed
entries to make a type safe
- * destination map for custom policies.
+ * Returns the type of the allowed entries which can be set via the
+ * [EMAIL PROTECTED] #setEntries(List)} method. This allows derived
classes to further
+ * restrict the type of allowed entries to make a type safe destination map
+ * for custom policies.
*/
protected Class getEntryClass() {
return DestinationMapEntry.class;
@@ -138,7 +147,7 @@
protected Set findWildcardMatches(ActiveMQDestination key) {
String[] paths = key.getDestinationPaths();
Set answer = new HashSet();
- rootNode.appendMatchingValues(answer, paths, 0);
+ getRootNode(key).appendMatchingValues(answer, paths, 0);
return answer;
}
@@ -154,15 +163,16 @@
return;
}
String[] paths = key.getDestinationPaths();
- rootNode.removeAll(paths, 0);
+ getRootNode(key).removeAll(paths, 0);
}
/**
- * Returns the value which matches the given destination or null if there
is no matching
- * value. If there are multiple values, the results are sorted and the
last item (the biggest)
- * is returned.
+ * Returns the value which matches the given destination or null if there
is
+ * no matching value. If there are multiple values, the results are sorted
+ * and the last item (the biggest) is returned.
*
- * @param destination the destination to find the value for
+ * @param destination
+ * the destination to find the value for
* @return the largest matching value or null if no value matches
*/
public Object chooseValue(ActiveMQDestination destination) {
@@ -174,4 +184,15 @@
return sortedSet.last();
}
+ /**
+ * Returns the root node for the given destination type
+ */
+ protected DestinationMapNode getRootNode(ActiveMQDestination key) {
+ if (key.isQueue()) {
+ return queueRootNode;
+ }
+ else {
+ return topicRootNode;
+ }
+ }
}
Modified:
incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/filter/DestinationMapTest.java
URL:
http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/filter/DestinationMapTest.java?rev=365888&r1=365887&r2=365888&view=diff
==============================================================================
---
incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/filter/DestinationMapTest.java
(original)
+++
incubator/activemq/trunk/activemq-core/src/test/java/org/apache/activemq/filter/DestinationMapTest.java
Wed Jan 4 02:42:21 2006
@@ -20,6 +20,7 @@
import junit.framework.TestCase;
import org.apache.activemq.command.ActiveMQDestination;
+import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.filter.DestinationMap;
@@ -45,16 +46,15 @@
protected Object v5 = "value5";
protected Object v6 = "value6";
-
public void testCompositeDestinations() throws Exception {
-
ActiveMQDestination d1 = createDestination("TEST.BAR.D2");
ActiveMQDestination d2 = createDestination("TEST.BAR.D3");
- map.put(d1,d1);
- map.put(d2,d2);
+ map.put(d1, d1);
+ map.put(d2, d2);
map.get(createDestination("TEST.BAR.D2,TEST.BAR.D3"));
-
+
}
+
public void testSimpleDestinations() throws Exception {
map.put(d1, v1);
map.put(d2, v2);
@@ -65,6 +65,17 @@
assertMapValue(d3, v3);
}
+ public void testQueueAndTopicWithSameName() throws Exception {
+ ActiveMQQueue q1 = new ActiveMQQueue("foo");
+ ActiveMQTopic t1 = new ActiveMQTopic("foo");
+
+ map.put(q1, v1);
+ map.put(t1, v2);
+
+ assertMapValue(q1, v1);
+ assertMapValue(t1, v2);
+ }
+
public void testSimpleDestinationsWithMultipleValues() throws Exception {
map.put(d1, v1);
map.put(d2, v2);
@@ -122,7 +133,7 @@
map.put(d2, v2);
map.put(d3, v3);
- List allValues = Arrays.asList(new Object[]{v1, v2, v3});
+ List allValues = Arrays.asList(new Object[] { v1, v2, v3 });
assertMapValue(">", allValues);
assertMapValue("TEST.>", allValues);
@@ -131,7 +142,6 @@
assertMapValue("FOO.>", null);
}
-
public void testStoreWildcardWithOneStepPath() throws Exception {
put("TEST.*", v1);
put("TEST.D1", v2);
@@ -165,48 +175,46 @@
put("TEST.XYZ.D4", v4);
put("TEST.BAR.D3", v5);
put("TEST.*.D2", v6);
-
-
+
assertMapValue("TEST.*.D3", v2, v3, v5);
assertMapValue("TEST.*.D4", v2, v4);
-
+
assertMapValue("TEST.*", v1, v2);
assertMapValue("TEST.*.*", v2, v3, v4, v5, v6);
assertMapValue("*.*.D3", v2, v3, v5);
assertMapValue("TEST.BAR.*", v2, v5, v6);
-
+
assertMapValue("TEST.BAR.D2", v2, v6);
assertMapValue("TEST.*.D2", v2, v6);
assertMapValue("TEST.BAR.*", v2, v5, v6);
}
-
+
public void testAnyPathWildcardInMap() throws Exception {
put("TEST.FOO.>", v1);
-
assertMapValue("TEST.FOO.BAR.WHANOT.A.B.C", v1);
assertMapValue("TEST.FOO.BAR.WHANOT", v1);
assertMapValue("TEST.FOO.BAR", v1);
-
+
assertMapValue("TEST.*.*", v1);
assertMapValue("TEST.BAR", null);
-
+
assertMapValue("TEST.FOO", v1);
- }
+ }
public void testSimpleAddRemove() throws Exception {
put("TEST.D1", v2);
-
- assertEquals("Root child count", 1, map.getRootChildCount());
-
+
+ assertEquals("Root child count", 1, map.getTopicRootChildCount());
+
assertMapValue("TEST.D1", v2);
-
+
remove("TEST.D1", v2);
-
- assertEquals("Root child count", 0, map.getRootChildCount());
+
+ assertEquals("Root child count", 0, map.getTopicRootChildCount());
assertMapValue("TEST.D1", null);
}
-
+
public void testStoreAndLookupAllWildcards() throws Exception {
loadSample2();
@@ -301,7 +309,6 @@
assertMapValue("TEST.BAR.*", v3, v4);
}
-
protected void put(String name, Object value) {
map.put(createDestination(name), value);
}
@@ -311,26 +318,25 @@
map.remove(destination, value);
}
-
protected void assertMapValue(String destinationName, Object expected) {
ActiveMQDestination destination = createDestination(destinationName);
assertMapValue(destination, expected);
}
protected void assertMapValue(String destinationName, Object expected1,
Object expected2) {
- assertMapValue(destinationName, Arrays.asList(new Object[]{expected1,
expected2}));
+ assertMapValue(destinationName, Arrays.asList(new Object[] {
expected1, expected2 }));
}
protected void assertMapValue(String destinationName, Object expected1,
Object expected2, Object expected3) {
- assertMapValue(destinationName, Arrays.asList(new Object[]{expected1,
expected2, expected3}));
+ assertMapValue(destinationName, Arrays.asList(new Object[] {
expected1, expected2, expected3 }));
}
protected void assertMapValue(String destinationName, Object expected1,
Object expected2, Object expected3, Object expected4) {
- assertMapValue(destinationName, Arrays.asList(new Object[]{expected1,
expected2, expected3, expected4}));
+ assertMapValue(destinationName, Arrays.asList(new Object[] {
expected1, expected2, expected3, expected4 }));
}
protected void assertMapValue(String destinationName, Object expected1,
Object expected2, Object expected3, Object expected4, Object expected5) {
- assertMapValue(destinationName, Arrays.asList(new Object[]{expected1,
expected2, expected3, expected4, expected5}));
+ assertMapValue(destinationName, Arrays.asList(new Object[] {
expected1, expected2, expected3, expected4, expected5 }));
}
protected void assertMapValue(ActiveMQDestination destination, Object
expected) {
Modified:
incubator/activemq/trunk/activemq-core/src/test/resources/org/apache/activemq/broker/policy/individual-dlq.xml
URL:
http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/test/resources/org/apache/activemq/broker/policy/individual-dlq.xml?rev=365888&r1=365887&r2=365888&view=diff
==============================================================================
---
incubator/activemq/trunk/activemq-core/src/test/resources/org/apache/activemq/broker/policy/individual-dlq.xml
(original)
+++
incubator/activemq/trunk/activemq-core/src/test/resources/org/apache/activemq/broker/policy/individual-dlq.xml
Wed Jan 4 02:42:21 2006
@@ -30,7 +30,7 @@
<strictOrderDispatchPolicy />
</dispatchPolicy>
<deadLetterStrategy>
- <individualDeadLetterStrategy queuePrefix="Test.DLQ."
topicPrefix="Test.DLQ." />
+ <individualDeadLetterStrategy topicPrefix="Test.DLQ." />
</deadLetterStrategy>
</policyEntry>
@@ -39,7 +39,7 @@
<strictOrderDispatchPolicy />
</dispatchPolicy>
<deadLetterStrategy>
- <individualDeadLetterStrategy queuePrefix="Test.DLQ."
topicPrefix="Test.DLQ." />
+ <individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
</policyEntry>