gemmellr commented on code in PR #4710:
URL: https://github.com/apache/activemq-artemis/pull/4710#discussion_r1466468912
##########
artemis-server/src/main/java/org/apache/activemq/artemis/core/config/WildcardConfiguration.java:
##########
@@ -119,19 +138,94 @@ public String getSingleWordString() {
return singleWordString;
}
- public void setSingleWord(char singleWord) {
+ public WildcardConfiguration setSingleWord(char singleWord) {
this.singleWord = singleWord;
this.singleWordString = String.valueOf(singleWord);
+ return this;
}
- public String convert(String filter, WildcardConfiguration to) {
- if (this.equals(to)) {
- return filter;
+ /**
+ * Convert the input from this WildcardConfiguration into the specified
WildcardConfiguration.
+ *
+ * If the input already contains characters defined in the target
WildcardConfiguration then those characters will
+ * be escaped and preserved as such in the returned String. That said,
wildcard characters which are the same
+ * between the two configurations will not be escaped
+ *
+ * If the input already contains escaped characters defined in this
WildcardConfiguration then those characters will
+ * be unescaped after conversion and restored in the returned String.
+ *
+ * @param input the String to convert
+ * @param target the WildcardConfiguration to convert the input into
+ * @return the converted String
+ */
+ public String convert(final String input, final WildcardConfiguration
target) {
+ if (this.equals(target)) {
+ return input;
} else {
- return filter
- .replace(getDelimiter(), to.getDelimiter())
- .replace(getSingleWord(), to.getSingleWord())
- .replace(getAnyWords(), to.getAnyWords());
+ boolean escaped = isEscaped(input);
+ StringBuilder result;
+ if (!escaped) {
+ result = new StringBuilder(target.escape(input, this));
+ } else {
+ result = new StringBuilder(input);
+ }
+ replaceChar(result, getDelimiter(), target.getDelimiter());
+ replaceChar(result, getSingleWord(), target.getSingleWord());
+ replaceChar(result, getAnyWords(), target.getAnyWords());
+ if (escaped) {
+ return unescape(result.toString());
+ } else {
+ return result.toString();
+ }
+ }
+ }
+
+ private String escape(final String input, WildcardConfiguration from) {
+ String result = input.replace(escapeString, escapeString + escapeString);
+ if (delimiter != from.getDelimiter()) {
+ result = result.replace(getDelimiterString(), escapeString +
getDelimiterString());
+ }
+ if (singleWord != from.getSingleWord()) {
+ result = result.replace(getSingleWordString(), escapeString +
getSingleWordString());
+ }
+ if (anyWords != from.getAnyWords()) {
+ result = result.replace(getAnyWordsString(), escapeString +
getAnyWordsString());
+ }
+ return result;
+ }
+
+ private String unescape(final String input) {
+ return input
+ .replace(escapeString + escapeString, escapeString)
+ .replace(ESCAPE + getDelimiterString(), getDelimiterString())
+ .replace(ESCAPE + getSingleWordString(), getSingleWordString())
+ .replace(ESCAPE + getAnyWordsString(), getAnyWordsString());
+ }
+
+ private boolean isEscaped(final String input) {
+ for (int i = 0; i < input.length() - 1; i++) {
+ if (input.charAt(i) == ESCAPE && (input.charAt(i + 1) ==
getDelimiter() || input.charAt(i + 1) == getSingleWord() || input.charAt(i + 1)
== getAnyWords())) {
+ return true;
+ }
+ }
Review Comment:
Yes I think you are right, think I misread that too and believed the loop
itself was looking at the last char...so it wont throw because the loop never
actually looks at the last character, just the if through the charAt(i+1).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]