You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2021/02/03 18:12:45 UTC

[activemq-artemis] branch master updated: ARTEMIS-3068 Fix HierarchicalRepository matcher comparator

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git


The following commit(s) were added to refs/heads/master by this push:
     new 69fb226  ARTEMIS-3068 Fix HierarchicalRepository matcher comparator
     new 89aca1f  This closes #3408
69fb226 is described below

commit 69fb22605405bb20d3c64853cf5e37781a2e74dc
Author: Marcos Singermann <ma...@mulesoft.com>
AuthorDate: Tue Jan 19 09:38:23 2021 -0300

    ARTEMIS-3068 Fix HierarchicalRepository matcher comparator
---
 .../impl/HierarchicalObjectRepository.java         | 14 +++++++------
 .../artemis/core/settings/RepositoryTest.java      | 23 ++++++++++++++++++++++
 2 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java
index c8eff01..573f40c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java
@@ -487,13 +487,15 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
             String[] leftSplits = o1.split(quotedDelimiter);
             String[] rightSplits = o2.split(quotedDelimiter);
             for (int i = 0; i < leftSplits.length; i++) {
+               if (i >= rightSplits.length) {
+                  return -1;
+               }
                String left = leftSplits[i];
-               if (left.equals(singleWord)) {
-                  if (rightSplits.length < i || !rightSplits[i].equals(singleWord)) {
-                     return -1;
-                  } else {
-                     return +1;
-                  }
+               String right = rightSplits[i];
+               if (left.equals(singleWord) && !right.equals(singleWord)) {
+                  return +1;
+               } else if (!left.equals(singleWord) && right.equals(singleWord)) {
+                  return -1;
                }
             }
          }
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/settings/RepositoryTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/settings/RepositoryTest.java
index 7770472..e293d2b 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/settings/RepositoryTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/settings/RepositoryTest.java
@@ -76,6 +76,29 @@ public class RepositoryTest extends ActiveMQTestBase {
       Assert.assertEquals("leaf", repo.getMatch("b"));
    }
 
+   @Test
+   public void testMultipleMatchesHasRightOrder() {
+      HierarchicalRepository<String> repository = new HierarchicalObjectRepository<>();
+      repository.addMatch("a.b.c.d.e.f", "a.b.c.d.e.f");//1
+      repository.addMatch("a.b.c.d.e.*", "a.b.c.d.e.*");//2
+      repository.addMatch("a.*.*.*.*.*", "a.*.*.*.*.*");//3
+      repository.addMatch("*.b.c.d.*.f", "*.b.c.d.*.f");//4
+      repository.addMatch("*.b.*.d.*.f", "*.b.*.d.*.f");//5
+      repository.addMatch("a.b.c.d.e.#", "a.b.c.d.e.#");//6
+
+      String val = repository.getMatch("a.b.c.d.e.f");//matches all
+      Assert.assertEquals("a.b.c.d.e.f", val);
+      val = repository.getMatch("a.b.c.d.e.x");//matches 2,3,6
+      Assert.assertEquals("a.b.c.d.e.*", val);
+      val = repository.getMatch("a.b.x.d.x.f");//matches 3,5
+      Assert.assertEquals("a.*.*.*.*.*", val);
+      val = repository.getMatch("x.b.c.d.e.f");//matches 4,5
+      Assert.assertEquals("*.b.c.d.*.f", val);
+      val = repository.getMatch("x.b.x.d.e.f");//matches 5
+      Assert.assertEquals("*.b.*.d.*.f", val);
+      val = repository.getMatch("a.b.c.d.e.f.g");//matches 6
+      Assert.assertEquals("a.b.c.d.e.#", val);
+   }
 
    @Test
    public void testMatchingDocsCustomUnderscorDelimiter() throws Throwable {