From a0dae0dfe1c6ece7b06dd59e1417f3ef8b5ab3f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=91=E6=88=9F?= Date: Sat, 20 Mar 2021 14:31:33 +0800 Subject: [PATCH] support wildcard match --- .../testable/core/tool/OmniAccessor.java | 23 ++++++++++++------- .../testable/core/tool/OmniAccessorTest.java | 15 ++++++------ 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniAccessor.java b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniAccessor.java index 283c809..931fad2 100644 --- a/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniAccessor.java +++ b/testable-core/src/main/java/com/alibaba/testable/core/tool/OmniAccessor.java @@ -20,13 +20,17 @@ public class OmniAccessor { private static final FixSizeMap, List> MEMBER_INDEXES = new FixSizeMap, List>(30); private static final String THIS_REF_PREFIX = "this$"; - private static final String REGEX_ANY_CLASS = "\\{[^}]+\\}"; - private static final String REGEX_ANY_NAME = "[^{]+"; + private static final String PATTERN_PREFIX = ".*/"; + private static final String REGEX_ANY_NAME = "[^/]+"; + private static final String REGEX_ANY_FIELD_NAME = "[^{]+"; + private static final String REGEX_ANY_CLASS_NAME = "[^}]+"; + private static final String REGEX_ANY_CLASS = "\\{" + REGEX_ANY_CLASS_NAME + "\\}"; private static final String BRACE_START = "{"; private static final String ESCAPE = "\\"; private static final String BRACE_END = "}"; private static final String BRACKET_START = "["; private static final String BRACKET_END = "]"; + private static final String STAR = "*"; private OmniAccessor() {} @@ -82,11 +86,11 @@ public class OmniAccessor { if (memberPath.matches(toPattern(queryPath))) { try { List parent = getByPath(target, toParent(memberPath), toParent(queryPath)); - if (parent.isEmpty()) { + if (!parent.isEmpty()) { for (Object p : parent) { setByPathSegment(p, toChild(memberPath), toChild(queryPath), value); + count++; } - count++; } } catch (NoSuchFieldException e) { // continue @@ -127,7 +131,7 @@ public class OmniAccessor { for (int i = 0; i < querySegments.length; i++) { patternSegments[i] = toSinglePattern(querySegments[i]); } - return ".*/" + StringUtils.join(Arrays.asList(patternSegments), SLASH); + return PATTERN_PREFIX + StringUtils.join(Arrays.asList(patternSegments), SLASH); } private static String toSinglePattern(String querySegment) { @@ -136,13 +140,16 @@ public class OmniAccessor { } if (querySegment.isEmpty()) { return ""; + } else if (querySegment.equals(STAR)) { + return REGEX_ANY_NAME; } else if (querySegment.startsWith(BRACE_START)) { - return REGEX_ANY_NAME + querySegment.replace(BRACE_START, ESCAPE + BRACE_START) + return REGEX_ANY_FIELD_NAME + querySegment.replace(BRACE_START, ESCAPE + BRACE_START) .replace(BRACE_END, ESCAPE + BRACE_END) .replace(BRACKET_START, ESCAPE + BRACKET_START) - .replace(BRACKET_END, ESCAPE + BRACKET_END); + .replace(BRACKET_END, ESCAPE + BRACKET_END) + .replace(STAR, REGEX_ANY_CLASS_NAME); } else { - return querySegment + REGEX_ANY_CLASS; + return querySegment.replace(STAR, REGEX_ANY_FIELD_NAME) + REGEX_ANY_CLASS; } } diff --git a/testable-core/src/test/java/com/alibaba/testable/core/tool/OmniAccessorTest.java b/testable-core/src/test/java/com/alibaba/testable/core/tool/OmniAccessorTest.java index 27931ff..35ad30a 100644 --- a/testable-core/src/test/java/com/alibaba/testable/core/tool/OmniAccessorTest.java +++ b/testable-core/src/test/java/com/alibaba/testable/core/tool/OmniAccessorTest.java @@ -31,14 +31,6 @@ class OmniAccessorTest { assertEquals("/ssc{StaticSubChild}/gc{DemoGrandChild}/i{int}", index.get(15)); } - @Test - void should_match_pattern() { - assertTrue("/abc{Abc}".matches(".*/abc\\{[^}]+\\}")); - assertTrue("/abc{Abc}".matches(".*/[^{]+\\{Abc\\}")); - assertTrue("/abc{Abc[]}/xyz{Xyz[]}".matches(".*/[^{]+\\{Abc\\[\\]\\}/[^{]+\\{Xyz\\[\\]\\}")); - assertTrue("/abc{Abc}/xyz{Xyz}/demo{Demo}".matches(".*/abc\\{[^}]+\\}/[^{]+\\{Xyz\\}/demo\\{[^}]+\\}")); - } - @Test void should_to_pattern() { assertEquals(".*/", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "")); @@ -51,6 +43,13 @@ class OmniAccessorTest { assertEquals(".*/[^{]+\\{Abc\\[\\]\\}/[^{]+\\{Xyz\\[\\]\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "{Abc[]}/{Xyz[]}")); assertEquals(".*/abc\\{[^}]+\\}/[^{]+\\{Xyz\\[\\]\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc[1]/{Xyz[]}[2]")); assertEquals(".*/abc\\{[^}]+\\}/[^{]+\\{Xyz\\}/demo\\{[^}]+\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/{Xyz}/demo")); + assertEquals(".*/abc\\{[^}]+\\}/de[^{]+\\{[^}]+\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/de*/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/[^{]+mo\\{[^}]+\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/*mo/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/d[^{]+o\\{[^}]+\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/d*o/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/[^{]+\\{De[^}]+\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/{De*}/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/[^{]+\\{[^}]+mo\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/{*mo}/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/[^{]+\\{D[^}]+o\\}/[^{]+\\{Xyz\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/{D*o}/{Xyz}")); + assertEquals(".*/abc\\{[^}]+\\}/[^/]+/[^{]+\\{Xyz\\}/[^/]+/demo\\{[^}]+\\}", PrivateAccessor.invokeStatic(OmniAccessor.class, "toPattern", "abc/*/{Xyz}/*/demo")); } @Test