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 <michael.andre.pea...@me.com> Authored: Fri Sep 15 01:24:09 2017 +0100 Committer: Clebert Suconic <clebertsuco...@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>