From 9237e9b32aeb04a544dd5a793a204dc6d731f074 Mon Sep 17 00:00:00 2001 From: earayu <earayu@163.com> Date: Sat, 22 Sep 2018 16:44:45 +0800 Subject: [PATCH 1/2] #135 1. change the param's name, from 'string' to 'target' 2. get rid of the magic value of: * ? \ 3. bugfix: return false if the pattern or target is NULL --- .../core/util/matcher/WildcardMatcher.java | 46 +++++++++++++------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/util/matcher/WildcardMatcher.java b/core/src/main/java/com/taobao/arthas/core/util/matcher/WildcardMatcher.java index 3ab53cd4f..f97946d0e 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/matcher/WildcardMatcher.java +++ b/core/src/main/java/com/taobao/arthas/core/util/matcher/WildcardMatcher.java @@ -8,6 +8,12 @@ public class WildcardMatcher implements Matcher<String> { private final String pattern; + private static final Character ASTERISK = '*'; + private static final Character QUESTION_MARK = '?'; + private static final Character ESCAPE = '\\'; + + + public WildcardMatcher(String pattern) { this.pattern = pattern; } @@ -21,51 +27,61 @@ public class WildcardMatcher implements Matcher<String> { /** * Internal matching recursive function. */ - private boolean match(String string, String pattern, int stringStartNdx, int patternStartNdx) { + private boolean match(String target, String pattern, int stringStartNdx, int patternStartNdx) { + //#135 + if(target==null || pattern==null){ + return false; + } int pNdx = patternStartNdx; int sNdx = stringStartNdx; int pLen = pattern.length(); if (pLen == 1) { - if (pattern.charAt(0) == '*') { // speed-up + // speed-up + if (pattern.charAt(0) == ASTERISK) { return true; } } - int sLen = string.length(); + int sLen = target.length(); boolean nextIsNotWildcard = false; while (true) { // check if end of string and/or pattern occurred - if ((sNdx >= sLen)) { // end of string still may have pending '*' callback pattern - while ((pNdx < pLen) && (pattern.charAt(pNdx) == '*')) { + if ((sNdx >= sLen)) { + // end of string still may have pending '*' callback pattern + while ((pNdx < pLen) && (pattern.charAt(pNdx) == ASTERISK)) { pNdx++; } return pNdx >= pLen; } - if (pNdx >= pLen) { // end of pattern, but not end of the string + // end of pattern, but not end of the string + if (pNdx >= pLen) { return false; } - char p = pattern.charAt(pNdx); // pattern char + // pattern char + char p = pattern.charAt(pNdx); // perform logic if (!nextIsNotWildcard) { - if (p == '\\') { + if (p == ESCAPE) { pNdx++; nextIsNotWildcard = true; continue; } - if (p == '?') { + if (p == QUESTION_MARK) { sNdx++; pNdx++; continue; } - if (p == '*') { - char pnext = 0; // next pattern char + if (p == ASTERISK) { + // next pattern char + char pnext = 0; if (pNdx + 1 < pLen) { pnext = pattern.charAt(pNdx + 1); } - if (pnext == '*') { // double '*' have the same effect as one '*' + // double '*' have the same effect as one '*' + if (pnext == ASTERISK) { pNdx++; continue; } @@ -74,8 +90,8 @@ public class WildcardMatcher implements Matcher<String> { // find recursively if there is any substring from the end of the // line that matches the rest of the pattern !!! - for (i = string.length(); i >= sNdx; i--) { - if (match(string, pattern, i, pNdx)) { + for (i = target.length(); i >= sNdx; i--) { + if (match(target, pattern, i, pNdx)) { return true; } } @@ -86,7 +102,7 @@ public class WildcardMatcher implements Matcher<String> { } // check if pattern char and string char are equals - if (p != string.charAt(sNdx)) { + if (p != target.charAt(sNdx)) { return false; } From e3567e2317df80626c80e66e94376d77e823e671 Mon Sep 17 00:00:00 2001 From: earayu <earayu@163.com> Date: Sat, 22 Sep 2018 16:52:51 +0800 Subject: [PATCH 2/2] unit test for WildcardMatcher --- .../util/matcher/WildcardMatcherTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 core/src/test/java/com/taobao/arthas/core/util/matcher/WildcardMatcherTest.java diff --git a/core/src/test/java/com/taobao/arthas/core/util/matcher/WildcardMatcherTest.java b/core/src/test/java/com/taobao/arthas/core/util/matcher/WildcardMatcherTest.java new file mode 100644 index 000000000..e63a71cd1 --- /dev/null +++ b/core/src/test/java/com/taobao/arthas/core/util/matcher/WildcardMatcherTest.java @@ -0,0 +1,36 @@ +package com.taobao.arthas.core.util.matcher; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author earayu + */ +public class WildcardMatcherTest { + + @Test + public void testMatching(){ + Assert.assertFalse(new WildcardMatcher(null).matching(null)); + Assert.assertFalse(new WildcardMatcher(null).matching("foo")); + Assert.assertFalse(new WildcardMatcher("foo").matching(null)); + + Assert.assertTrue(new WildcardMatcher("foo").matching("foo")); + Assert.assertFalse(new WildcardMatcher("foo").matching("bar")); + + Assert.assertTrue(new WildcardMatcher("foo*").matching("foo")); + Assert.assertTrue(new WildcardMatcher("foo*").matching("fooooooobar")); + Assert.assertTrue(new WildcardMatcher("f*r").matching("fooooooobar")); + Assert.assertFalse(new WildcardMatcher("foo*").matching("fo")); + Assert.assertFalse(new WildcardMatcher("foo*").matching("bar")); + + Assert.assertFalse(new WildcardMatcher("foo?").matching("foo")); + Assert.assertTrue(new WildcardMatcher("foo?").matching("foob")); + + Assert.assertTrue(new WildcardMatcher("foo\\*").matching("foo*")); + Assert.assertFalse(new WildcardMatcher("foo\\*").matching("foooooo")); + + Assert.assertTrue(new WildcardMatcher("foo\\?").matching("foo?")); + Assert.assertFalse(new WildcardMatcher("foo\\?").matching("foob")); + } + +}