1 package org.andromda.core.common;
2
3 import java.util.regex.PatternSyntaxException;
4 import org.apache.commons.lang.StringUtils;
5
6
7
8
9
10
11 public class PathMatcher
12 {
13
14
15
16 private static final String FORWARD_SLASH = "/";
17
18
19
20
21 private static final String DOUBLE_STAR = "**/*";
22
23
24
25
26 private static final String TRIPPLE_STAR = "***";
27
28
29
30
31
32
33
34
35 public static boolean wildcardMatch(
36 String path,
37 String pattern)
38 {
39 ExceptionUtils.checkNull(
40 "path",
41 path);
42 ExceptionUtils.checkNull(
43 "pattern",
44 pattern);
45
46
47 if (path.startsWith(FORWARD_SLASH))
48 {
49 path =
50 path.substring(
51 1,
52 path.length());
53 }
54 path = path.trim();
55 pattern = pattern.trim();
56 boolean matches;
57 pattern =
58 StringUtils.replace(
59 pattern,
60 ".",
61 "\\.");
62 boolean matchAll = pattern.contains(DOUBLE_STAR) && !pattern.contains(TRIPPLE_STAR);
63 if (matchAll)
64 {
65 String replacement = ".*";
66 if (!path.contains(FORWARD_SLASH))
67 {
68 replacement = ".*";
69 }
70 pattern =
71 StringUtils.replaceOnce(
72 pattern,
73 DOUBLE_STAR,
74 replacement);
75 }
76 pattern =
77 StringUtils.replace(
78 pattern,
79 "*",
80 ".*");
81 try
82 {
83 matches = path.matches(pattern);
84 }
85 catch (final PatternSyntaxException exception)
86 {
87 matches = false;
88 }
89 if (!matchAll)
90 {
91 matches =
92 matches &&
93 StringUtils.countMatches(
94 pattern,
95 FORWARD_SLASH) == StringUtils.countMatches(
96 path,
97 FORWARD_SLASH);
98 }
99 return matches;
100 }
101 }