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 2017/09/25 15:50:54 UTC

[1/2] activemq-artemis git commit: This closes #1537

Repository: activemq-artemis
Updated Branches:
  refs/heads/master 533797fbc -> 9e4477104


This closes #1537


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/9e447710
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/9e447710
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/9e447710

Branch: refs/heads/master
Commit: 9e4477104fac9c83e3722c6835f13a6fa4bb0f75
Parents: 533797f e9eaa7d
Author: Clebert Suconic <cl...@apache.org>
Authored: Mon Sep 25 11:34:34 2017 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Sep 25 11:34:34 2017 -0400

----------------------------------------------------------------------
 .../cli/commands/tools/xml/XmlDataExporter.java |  2 +-
 .../core/config/WildcardConfiguration.java      | 41 +++++++++++----
 .../core/config/impl/ConfigurationImpl.java     |  6 +--
 .../deployers/impl/FileConfigurationParser.java |  7 ++-
 .../core/postoffice/impl/PostOfficeImpl.java    |  2 +-
 .../core/server/impl/ActiveMQServerImpl.java    |  4 +-
 .../impl/HierarchicalObjectRepository.java      | 51 +++++++++++++-----
 .../artemis/core/settings/impl/Match.java       | 54 ++++++++------------
 .../resources/schema/artemis-configuration.xsd  |  9 +++-
 .../impl/FileConfigurationParserTest.java       |  4 +-
 .../artemis/core/settings/RepositoryTest.java   | 39 ++++++++++++++
 .../test/resources/artemis-configuration.xsd    | 52 +++++++++++++++++++
 docs/user-manual/en/wildcard-routing.md         |  2 +-
 docs/user-manual/en/wildcard-syntax.md          |  2 +-
 .../resources/reload-address-queues-updated.xml |  6 ++-
 .../test/resources/reload-address-queues.xml    |  4 ++
 16 files changed, 212 insertions(+), 73 deletions(-)
----------------------------------------------------------------------



[2/2] activemq-artemis git commit: ARTEMIS-1422 Fix match change to support wildcard config

Posted by cl...@apache.org.
ARTEMIS-1422 Fix match change to support wildcard config



Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/e9eaa7da
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/e9eaa7da
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/e9eaa7da

Branch: refs/heads/master
Commit: e9eaa7daf6decb26b5938964b5954d5373c7497c
Parents: 533797f
Author: Michael Andre Pearce <Mi...@me.com>
Authored: Fri Sep 15 01:24:09 2017 +0100
Committer: Clebert Suconic <cl...@apache.org>
Committed: Mon Sep 25 11:34:34 2017 -0400

----------------------------------------------------------------------
 .../cli/commands/tools/xml/XmlDataExporter.java |  2 +-
 .../core/config/WildcardConfiguration.java      | 41 +++++++++++----
 .../core/config/impl/ConfigurationImpl.java     |  6 +--
 .../deployers/impl/FileConfigurationParser.java |  7 ++-
 .../core/postoffice/impl/PostOfficeImpl.java    |  2 +-
 .../core/server/impl/ActiveMQServerImpl.java    |  4 +-
 .../impl/HierarchicalObjectRepository.java      | 51 +++++++++++++-----
 .../artemis/core/settings/impl/Match.java       | 54 ++++++++------------
 .../resources/schema/artemis-configuration.xsd  |  9 +++-
 .../impl/FileConfigurationParserTest.java       |  4 +-
 .../artemis/core/settings/RepositoryTest.java   | 39 ++++++++++++++
 .../test/resources/artemis-configuration.xsd    | 52 +++++++++++++++++++
 docs/user-manual/en/wildcard-routing.md         |  2 +-
 docs/user-manual/en/wildcard-syntax.md          |  2 +-
 .../resources/reload-address-queues-updated.xml |  6 ++-
 .../test/resources/reload-address-queues.xml    |  4 ++
 16 files changed, 212 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/xml/XmlDataExporter.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/xml/XmlDataExporter.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/xml/XmlDataExporter.java
index f297a76..6e9ef46 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/xml/XmlDataExporter.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/xml/XmlDataExporter.java
@@ -392,7 +392,7 @@ public final class XmlDataExporter extends OptionalLocking {
             }
          };
          PagingStoreFactory pageStoreFactory = new PagingStoreFactoryNIO(storageManager, config.getPagingLocation(), 1000L, scheduled, executorFactory, true, null);
-         HierarchicalRepository<AddressSettings> addressSettingsRepository = new HierarchicalObjectRepository<>();
+         HierarchicalRepository<AddressSettings> addressSettingsRepository = new HierarchicalObjectRepository<>(config.getWildcardConfiguration());
          addressSettingsRepository.setDefault(new AddressSettings());
          PagingManager manager = new PagingManagerImpl(pageStoreFactory, addressSettingsRepository);
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java
index bd9046b..d7b57c0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java
@@ -26,7 +26,7 @@ public class WildcardConfiguration implements Serializable {
 
    static final char DELIMITER = '.';
 
-   boolean enabled = true;
+   boolean routingEnabled = true;
 
    char singleWord = SINGLE_WORD;
 
@@ -34,6 +34,13 @@ public class WildcardConfiguration implements Serializable {
 
    char delimiter = DELIMITER;
 
+   String singleWordString = String.valueOf(singleWord);
+
+   String anyWordsString = String.valueOf(anyWords);
+
+   String delimiterString = String.valueOf(delimiter);
+
+
    @Override
    public boolean equals(Object o) {
       if (this == o) return true;
@@ -41,7 +48,7 @@ public class WildcardConfiguration implements Serializable {
 
       WildcardConfiguration that = (WildcardConfiguration) o;
 
-      if (enabled != that.enabled) return false;
+      if (routingEnabled != that.routingEnabled) return false;
       if (singleWord != that.singleWord) return false;
       if (anyWords != that.anyWords) return false;
       return delimiter == that.delimiter;
@@ -50,7 +57,7 @@ public class WildcardConfiguration implements Serializable {
 
    @Override
    public int hashCode() {
-      int result = (enabled ? 1 : 0);
+      int result = (routingEnabled ? 1 : 0);
       result = 31 * result + (int) singleWord;
       result = 31 * result + (int) anyWords;
       result = 31 * result + (int) delimiter;
@@ -60,43 +67,59 @@ public class WildcardConfiguration implements Serializable {
    @Override
    public String toString() {
       return "WildcardConfiguration{" +
-              "anyWords=" + anyWords +
-              ", enabled=" + enabled +
+              "routingEnabled=" + routingEnabled +
+              ", anyWords=" + anyWords +
               ", singleWord=" + singleWord +
               ", delimiter=" + delimiter +
               '}';
    }
 
-   public boolean isEnabled() {
-      return enabled;
+   public boolean isRoutingEnabled() {
+      return routingEnabled;
    }
 
-   public void setEnabled(boolean enabled) {
-      this.enabled = enabled;
+   public void setRoutingEnabled(boolean routingEnabled) {
+      this.routingEnabled = routingEnabled;
    }
 
    public char getAnyWords() {
       return anyWords;
    }
 
+   public String getAnyWordsString() {
+      return anyWordsString;
+   }
+
+
    public void setAnyWords(char anyWords) {
       this.anyWords = anyWords;
+      this.anyWordsString = String.valueOf(anyWords);
    }
 
    public char getDelimiter() {
       return delimiter;
    }
 
+   public String getDelimiterString() {
+      return delimiterString;
+   }
+
    public void setDelimiter(char delimiter) {
       this.delimiter = delimiter;
+      this.delimiterString = String.valueOf(delimiter);
    }
 
    public char getSingleWord() {
       return singleWord;
    }
 
+   public String getSingleWordString() {
+      return singleWordString;
+   }
+
    public void setSingleWord(char singleWord) {
       this.singleWord = singleWord;
+      this.singleWordString = String.valueOf(singleWord);
    }
 
    public String convert(String filter, WildcardConfiguration to) {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 9dfb7a4..ef11171 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -912,14 +912,14 @@ public class ConfigurationImpl implements Configuration, Serializable {
    @Override
    @Deprecated
    public boolean isWildcardRoutingEnabled() {
-      return wildcardConfiguration.isEnabled();
+      return wildcardConfiguration.isRoutingEnabled();
    }
 
    @Override
    @Deprecated
    public ConfigurationImpl setWildcardRoutingEnabled(final boolean enabled) {
-      logger.info("Usage of wildcardRoutingEnabled configuration property is deprecated, please use wildCardConfiguration.enabled instead");
-      wildcardConfiguration.setEnabled(enabled);
+      logger.info("Usage of wildcardRoutingEnabled configuration property is deprecated, please use wildCardConfiguration.routingEnabled instead");
+      wildcardConfiguration.setRoutingEnabled(enabled);
       return this;
    }
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index caa0e31..c89bf50 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -1764,14 +1764,13 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
     * @return
     */
    protected void parseWildcardConfiguration(final Element e, final Configuration mainConfig) {
-      WildcardConfiguration conf = new WildcardConfiguration();
+      WildcardConfiguration conf = mainConfig.getWildcardConfiguration();
 
       conf.setDelimiter(getString(e, "delimiter", Character.toString(conf.getDelimiter()), Validators.NO_CHECK).charAt(0));
       conf.setAnyWords(getString(e, "any-words", Character.toString(conf.getAnyWords()), Validators.NO_CHECK).charAt(0));
       conf.setSingleWord(getString(e, "single-word", Character.toString(conf.getSingleWord()), Validators.NO_CHECK).charAt(0));
-      conf.setEnabled(getBoolean(e, "enabled", conf.isEnabled()));
-
-      mainConfig.setWildCardConfiguration(conf);
+      conf.setRoutingEnabled(getBoolean(e, "enabled", conf.isRoutingEnabled()));
+      conf.setRoutingEnabled(getBoolean(e, "routing-enabled", conf.isRoutingEnabled()));
    }
 
    private ConnectorServiceConfiguration parseConnectorService(final Element e) {

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
index a6372e7..f25426c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
@@ -157,7 +157,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
 
       this.reaperPriority = reaperPriority;
 
-      if (wildcardConfiguration.isEnabled()) {
+      if (wildcardConfiguration.isRoutingEnabled()) {
          addressManager = new WildcardAddressManager(this, wildcardConfiguration, storageManager);
       } else {
          addressManager = new SimpleAddressManager(this, wildcardConfiguration, storageManager);

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index db0a259..d932639 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -423,11 +423,11 @@ public class ActiveMQServerImpl implements ActiveMQServer {
 
       this.securityManager = securityManager;
 
-      addressSettingsRepository = new HierarchicalObjectRepository<>();
+      addressSettingsRepository = new HierarchicalObjectRepository<>(configuration.getWildcardConfiguration());
 
       addressSettingsRepository.setDefault(new AddressSettings());
 
-      securityRepository = new HierarchicalObjectRepository<>();
+      securityRepository = new HierarchicalObjectRepository<>(configuration.getWildcardConfiguration());
 
       securityRepository.setDefault(new HashSet<Role>());
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java
----------------------------------------------------------------------
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 1d648ed..e83b685 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
@@ -29,7 +29,9 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.regex.Pattern;
 
+import org.apache.activemq.artemis.core.config.WildcardConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
 import org.apache.activemq.artemis.core.settings.HierarchicalRepositoryChangeListener;
@@ -43,6 +45,7 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
 
    private static final Logger logger = Logger.getLogger(HierarchicalObjectRepository.class);
 
+   private static final WildcardConfiguration DEFAULT_WILDCARD_CONFIGURATION = new WildcardConfiguration();
    private boolean listenersEnabled = true;
    /**
     * The default Match to fall back to
@@ -66,7 +69,9 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
    /**
     * a regex comparator
     */
-   private final MatchComparator matchComparator = new MatchComparator();
+   private final MatchComparator matchComparator;
+
+   private final WildcardConfiguration wildcardConfiguration;
 
    /**
     * a cache
@@ -94,6 +99,15 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
     */
    private final ArrayList<HierarchicalRepositoryChangeListener> listeners = new ArrayList<>();
 
+   public HierarchicalObjectRepository() {
+      this(null);
+   }
+
+   public HierarchicalObjectRepository(final WildcardConfiguration wildcardConfiguration) {
+      this.wildcardConfiguration = wildcardConfiguration == null ? DEFAULT_WILDCARD_CONFIGURATION : wildcardConfiguration;
+      this.matchComparator = new MatchComparator(this.wildcardConfiguration);
+   }
+
    @Override
    public void disableListeners() {
       lock.writeLock().lock();
@@ -155,9 +169,8 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
          if (immutableMatch) {
             immutables.add(match);
          }
-         Match.verify(match);
-         Match<T> match1 = new Match<>(match);
-         match1.setValue(value);
+         Match.verify(match, wildcardConfiguration);
+         Match<T> match1 = new Match<>(match, value, wildcardConfiguration);
          matches.put(match, match1);
       } finally {
          lock.writeLock().unlock();
@@ -381,25 +394,35 @@ public class HierarchicalObjectRepository<T> implements HierarchicalRepository<T
 
       private static final long serialVersionUID = -6182535107518999740L;
 
+      private final String quotedDelimiter;
+      private final String anyWords;
+      private final String singleWord;
+
+      MatchComparator(final WildcardConfiguration wildcardConfiguration) {
+         this.quotedDelimiter = Pattern.quote(wildcardConfiguration.getDelimiterString());
+         this.singleWord = wildcardConfiguration.getSingleWordString();
+         this.anyWords = wildcardConfiguration.getAnyWordsString();
+      }
+
       @Override
       public int compare(final String o1, final String o2) {
-         if (o1.contains(Match.WILDCARD) && !o2.contains(Match.WILDCARD)) {
+         if (o1.contains(anyWords) && !o2.contains(anyWords)) {
             return +1;
-         } else if (!o1.contains(Match.WILDCARD) && o2.contains(Match.WILDCARD)) {
+         } else if (!o1.contains(anyWords) && o2.contains(anyWords)) {
             return -1;
-         } else if (o1.contains(Match.WILDCARD) && o2.contains(Match.WILDCARD)) {
+         } else if (o1.contains(anyWords) && o2.contains(anyWords)) {
             return o2.length() - o1.length();
-         } else if (o1.contains(Match.WORD_WILDCARD) && !o2.contains(Match.WORD_WILDCARD)) {
+         } else if (o1.contains(singleWord) && !o2.contains(singleWord)) {
             return +1;
-         } else if (!o1.contains(Match.WORD_WILDCARD) && o2.contains(Match.WORD_WILDCARD)) {
+         } else if (!o1.contains(singleWord) && o2.contains(singleWord)) {
             return -1;
-         } else if (o1.contains(Match.WORD_WILDCARD) && o2.contains(Match.WORD_WILDCARD)) {
-            String[] leftSplits = o1.split("\\.");
-            String[] rightSplits = o2.split("\\.");
+         } else if (o1.contains(singleWord) && o2.contains(singleWord)) {
+            String[] leftSplits = o1.split(quotedDelimiter);
+            String[] rightSplits = o2.split(quotedDelimiter);
             for (int i = 0; i < leftSplits.length; i++) {
                String left = leftSplits[i];
-               if (left.equals(Match.WORD_WILDCARD)) {
-                  if (rightSplits.length < i || !rightSplits[i].equals(Match.WORD_WILDCARD)) {
+               if (left.equals(singleWord)) {
+                  if (rightSplits.length < i || !rightSplits[i].equals(singleWord)) {
                      return -1;
                   } else {
                      return +1;

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/Match.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/Match.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/Match.java
index b149b2b..070cd7a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/Match.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/Match.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.core.settings.impl;
 
 import java.util.regex.Pattern;
 
+import org.apache.activemq.artemis.core.config.WildcardConfiguration;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 
 /**
@@ -25,68 +26,54 @@ import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
  */
 public class Match<T> {
 
-   public static final String WORD_WILDCARD = "*";
-
-   private static final String WORD_WILDCARD_REPLACEMENT = "[^.]+";
-
-   public static final String WILDCARD = "#";
-
-   public static final String DOT_WILDCARD = ".#";
-
    private static final String WILDCARD_REPLACEMENT = ".*";
 
-   private static final String WILDCARD_CHILD_REPLACEMENT = "(\\..+)*";
+   private static final String WORD_WILDCARD_REPLACEMENT_FORMAT = "[^%s]+";
+
+   private static final String WILDCARD_CHILD_REPLACEMENT_FORMAT = "(%s.+)*";
 
    private static final String DOT = ".";
 
    private static final String DOT_REPLACEMENT = "\\.";
 
-   private String match;
+   private final String match;
 
    private final Pattern pattern;
 
-   private T value;
+   private final T value;
 
-   public Match(final String match) {
+   public Match(final String match, final T value, final WildcardConfiguration wildcardConfiguration) {
       this.match = match;
+      this.value = value;
       String actMatch = match;
-      // replace any regex characters
-      if (Match.WILDCARD.equals(match)) {
+
+      if (wildcardConfiguration.getAnyWordsString().equals(match)) {
+         // replace any regex characters
          actMatch = Match.WILDCARD_REPLACEMENT;
       } else {
          // this is to match with what's documented
-         actMatch = actMatch.replace(DOT_WILDCARD, WILDCARD);
-
+         actMatch = actMatch.replace(wildcardConfiguration.getDelimiterString() + wildcardConfiguration.getAnyWordsString(), wildcardConfiguration.getAnyWordsString());
          actMatch = actMatch.replace(Match.DOT, Match.DOT_REPLACEMENT);
-         actMatch = actMatch.replace(Match.WORD_WILDCARD, Match.WORD_WILDCARD_REPLACEMENT);
+         actMatch = actMatch.replace(wildcardConfiguration.getSingleWordString(), String.format(WORD_WILDCARD_REPLACEMENT_FORMAT, Pattern.quote(wildcardConfiguration.getDelimiterString())));
 
-         // this one has to be done by last as we are using .* and it could be replaced wrongly
-         actMatch = actMatch.replace(Match.WILDCARD, Match.WILDCARD_CHILD_REPLACEMENT);
+         // this one has to be done by last as we are using .* and it could be replaced wrongly if delimiter is '.'
+         actMatch = actMatch.replace(wildcardConfiguration.getAnyWordsString(), String.format(WILDCARD_CHILD_REPLACEMENT_FORMAT, Pattern.quote(wildcardConfiguration.getDelimiterString())));
       }
       pattern = Pattern.compile(actMatch);
-
    }
 
-   public String getMatch() {
+   public final String getMatch() {
       return match;
    }
 
-   public void setMatch(final String match) {
-      this.match = match;
-   }
-
-   public Pattern getPattern() {
+   public final Pattern getPattern() {
       return pattern;
    }
 
-   public T getValue() {
+   public final T getValue() {
       return value;
    }
 
-   public void setValue(final T value) {
-      this.value = value;
-   }
-
    @Override
    public boolean equals(final Object o) {
       if (this == o) {
@@ -114,11 +101,12 @@ public class Match<T> {
     * @param match the match to validate
     * @throws IllegalArgumentException if a match isn't valid
     */
-   public static void verify(final String match) throws IllegalArgumentException {
+   public static void verify(final String match, final WildcardConfiguration wildcardConfiguration) throws IllegalArgumentException {
       if (match == null) {
          throw ActiveMQMessageBundle.BUNDLE.nullMatch();
       }
-      if (match.contains("#") && match.indexOf("#") < match.length() - 1) {
+      final String anyWords = wildcardConfiguration.getAnyWordsString();
+      if (match.contains(anyWords) && match.indexOf(anyWords) < match.length() - 1) {
          throw ActiveMQMessageBundle.BUNDLE.invalidMatch();
       }
    }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/main/resources/schema/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 1c1947d..b95480e 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -2940,7 +2940,14 @@
          <xsd:element maxOccurs="1" minOccurs="0" name="enabled" type="xsd:boolean">
             <xsd:annotation>
                <xsd:documentation>
-                  are wildcard addresses enabled
+                  deprecated please use routing-enabled.
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element maxOccurs="1" minOccurs="0" name="routing-enabled" type="xsd:boolean">
+            <xsd:annotation>
+               <xsd:documentation>
+                  is wildcard addresses routing enabled.
                </xsd:documentation>
             </xsd:annotation>
          </xsd:element>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
index 01f23e2..94d64ec 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
@@ -107,13 +107,13 @@ public class FileConfigurationParserTest extends ActiveMQTestBase {
    public void testWildcardConfiguration() throws Exception {
       FileConfigurationParser parser = new FileConfigurationParser();
 
-      String configStr = firstPart + "<wildcard-addresses>\n<enabled>true</enabled>\n<delimiter>/</delimiter>\n<any-words>></any-words></wildcard-addresses>" + lastPart;
+      String configStr = firstPart + "<wildcard-addresses>\n<routing-enabled>true</routing-enabled>\n<delimiter>/</delimiter>\n<any-words>></any-words></wildcard-addresses>" + lastPart;
       ByteArrayInputStream input = new ByteArrayInputStream(configStr.getBytes(StandardCharsets.UTF_8));
 
       Configuration config = parser.parseMainConfig(input);
       WildcardConfiguration wildCard = config.getWildcardConfiguration();
       assertEquals('/', wildCard.getDelimiter());
-      assertTrue(wildCard.isEnabled());
+      assertTrue(wildCard.isRoutingEnabled());
       assertEquals('>', wildCard.getAnyWords());
       assertEquals('*', wildCard.getSingleWord());
    }

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-server/src/test/java/org/apache/activemq/artemis/core/settings/RepositoryTest.java
----------------------------------------------------------------------
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 35f84ae..bdcd493 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
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.activemq.artemis.core.config.WildcardConfiguration;
 import org.apache.activemq.artemis.core.security.Role;
 import org.apache.activemq.artemis.core.settings.impl.HierarchicalObjectRepository;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -65,6 +66,44 @@ public class RepositoryTest extends ActiveMQTestBase {
    }
 
    @Test
+   public void testMatchingDocsCustomUnderscorDelimiter() throws Throwable {
+      WildcardConfiguration wildcardConfiguration = new WildcardConfiguration();
+      wildcardConfiguration.setDelimiter('_');
+      HierarchicalObjectRepository<String> repo = new HierarchicalObjectRepository<>(wildcardConfiguration);
+
+      repo.addMatch("a_b_#", "ab#");
+      repo.addMatch("a_b_d_#", "abd#");
+      repo.addMatch("#", "root");
+
+      Assert.assertEquals("ab#", repo.getMatch("a_b"));
+      Assert.assertEquals("ab#", repo.getMatch("a_b_c"));
+      Assert.assertEquals("abd#", repo.getMatch("a_b_d_lll"));
+      Assert.assertEquals("root", repo.getMatch("z_z_z_z_z"));
+      Assert.assertEquals("root", repo.getMatch("a_babc"));
+      Assert.assertEquals("ab#", repo.getMatch("a_b_dabc"));
+      Assert.assertEquals("abd#", repo.getMatch("a_b_d"));
+   }
+
+   @Test
+   public void testMatchingDocsCustomForwardSlashDelimiter() throws Throwable {
+      WildcardConfiguration wildcardConfiguration = new WildcardConfiguration();
+      wildcardConfiguration.setDelimiter('/');
+      HierarchicalObjectRepository<String> repo = new HierarchicalObjectRepository<>(wildcardConfiguration);
+
+      repo.addMatch("a/b/#", "ab#");
+      repo.addMatch("a/b/d/#", "abd#");
+      repo.addMatch("#", "root");
+
+      Assert.assertEquals("ab#", repo.getMatch("a/b"));
+      Assert.assertEquals("ab#", repo.getMatch("a/b/c"));
+      Assert.assertEquals("abd#", repo.getMatch("a/b/d/lll"));
+      Assert.assertEquals("root", repo.getMatch("z/z/z/z/z"));
+      Assert.assertEquals("root", repo.getMatch("a/babc"));
+      Assert.assertEquals("ab#", repo.getMatch("a/b/dabc"));
+      Assert.assertEquals("abd#", repo.getMatch("a/b/d"));
+   }
+
+   @Test
    public void testSingleMatch() {
       securityRepository.addMatch("queues.*", new HashSet<Role>());
       HashSet<Role> hashSet = securityRepository.getMatch("queues.something");

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/artemis-tools/src/test/resources/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-tools/src/test/resources/artemis-configuration.xsd b/artemis-tools/src/test/resources/artemis-configuration.xsd
index cc5f60e..3dfa710 100644
--- a/artemis-tools/src/test/resources/artemis-configuration.xsd
+++ b/artemis-tools/src/test/resources/artemis-configuration.xsd
@@ -861,6 +861,14 @@
          </xsd:element>
 
          <xsd:element name="addresses" type="addressesType" maxOccurs="1" minOccurs="0" />
+
+         <xsd:element name="wildcard-addresses" type="wildcardType" maxOccurs="1" minOccurs="0">
+            <xsd:annotation>
+               <xsd:documentation>
+                  Wildcard addresses format
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
       </xsd:all>
    </xsd:complexType>
 
@@ -2664,4 +2672,48 @@
       </xsd:sequence>
    </xsd:complexType>
 
+   <xsd:complexType name="wildcardType">
+      <xsd:annotation>
+         <xsd:documentation>
+            Complex type element to configure wildcard address format.
+         </xsd:documentation>
+      </xsd:annotation>
+      <xsd:all>
+         <xsd:element maxOccurs="1" minOccurs="0" name="enabled" type="xsd:boolean">
+            <xsd:annotation>
+               <xsd:documentation>
+                  deprecated please use routing-enabled. 
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element maxOccurs="1" minOccurs="0" name="routing-enabled" type="xsd:boolean">
+            <xsd:annotation>
+               <xsd:documentation>
+                  is wildcard addresses routing enabled.
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element maxOccurs="1" minOccurs="0" name="delimiter" type="xsd:string">
+            <xsd:annotation>
+               <xsd:documentation>
+                  wildcard address parts delimiter. Default '.'
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element maxOccurs="1" minOccurs="0" name="any-words" type="xsd:string">
+            <xsd:annotation>
+               <xsd:documentation>
+                  wildcard address any words character. Default '#'
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+         <xsd:element maxOccurs="1" minOccurs="0" name="single-word" type="xsd:string">
+            <xsd:annotation>
+               <xsd:documentation>
+                  wildcard address single word character. Default '*'
+               </xsd:documentation>
+            </xsd:annotation>
+         </xsd:element>
+      </xsd:all>
+   </xsd:complexType>
 </xsd:schema>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/docs/user-manual/en/wildcard-routing.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/wildcard-routing.md b/docs/user-manual/en/wildcard-routing.md
index ef12d05..12facd0 100644
--- a/docs/user-manual/en/wildcard-routing.md
+++ b/docs/user-manual/en/wildcard-routing.md
@@ -15,7 +15,7 @@ messages which are sent to a *hierarchy* of addresses.
 This functionality is enabled by default. To turn it off add the following to the `broker.xml` configuration.
 
       <wildcard-addresses>
-        <enabled>false</enabled>
+        <routing-enabled>false</routing-enabled>
       </wildcard-addresses>
 
 For more information on the wild card syntax and how to configure it, take a look at [wildcard syntax](wildcard-syntax.md) chapter,

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/docs/user-manual/en/wildcard-syntax.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/wildcard-syntax.md b/docs/user-manual/en/wildcard-syntax.md
index f1f110d..1d270ea 100644
--- a/docs/user-manual/en/wildcard-syntax.md
+++ b/docs/user-manual/en/wildcard-syntax.md
@@ -32,7 +32,7 @@ It's possible to further configure the syntax of the wildcard addresses using th
 For that, the `<wildcard-addresses>` configuration tag is used.
 
       <wildcard-addresses>
-        <enabled>true</enabled>
+        <routing-enabled>true</routing-enabled>
         <delimiter>.</delimiter>
         <any-words>#</any-words>
         <single-word>*</single-word>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml b/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml
index 1187baf..f8d1d91 100644
--- a/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml
+++ b/tests/integration-tests/src/test/resources/reload-address-queues-updated.xml
@@ -111,7 +111,11 @@ under the License.
             <config-delete-addresses>FORCE</config-delete-addresses>
          </address-setting>
       </address-settings>
-      
+
+      <wildcard-addresses>
+         <delimiter>_</delimiter>
+      </wildcard-addresses>
+
       <addresses>
          <address name="config_test_queue_removal">
             <multicast>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/e9eaa7da/tests/integration-tests/src/test/resources/reload-address-queues.xml
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/resources/reload-address-queues.xml b/tests/integration-tests/src/test/resources/reload-address-queues.xml
index c394cfa..ebd0f4e 100644
--- a/tests/integration-tests/src/test/resources/reload-address-queues.xml
+++ b/tests/integration-tests/src/test/resources/reload-address-queues.xml
@@ -115,6 +115,10 @@ under the License.
          </address-setting>
       </address-settings>
 
+      <wildcard-addresses>
+         <delimiter>_</delimiter>
+      </wildcard-addresses>
+
       <addresses>
          <address name="config_test_queue_removal">
             <multicast>