1 package org.codehaus.plexus.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.File;
20 import java.util.ArrayList;
21 import java.util.List;
22 import java.util.StringTokenizer;
23
24
25
26
27
28
29
30
31 public class MatchPattern {
32 private final String source;
33
34 private final String regexPattern;
35
36 private final String separator;
37
38 private final String[] tokenized;
39
40 private final char[][] tokenizedChar;
41
42 private MatchPattern(String source, String separator) {
43 regexPattern = SelectorUtils.isRegexPrefixedPattern(source)
44 ? source.substring(
45 SelectorUtils.REGEX_HANDLER_PREFIX.length(),
46 source.length() - SelectorUtils.PATTERN_HANDLER_SUFFIX.length())
47 : null;
48 this.source = SelectorUtils.isAntPrefixedPattern(source)
49 ? source.substring(
50 SelectorUtils.ANT_HANDLER_PREFIX.length(),
51 source.length() - SelectorUtils.PATTERN_HANDLER_SUFFIX.length())
52 : source;
53 this.separator = separator;
54 tokenized = tokenizePathToString(this.source, separator);
55 tokenizedChar = new char[tokenized.length][];
56 for (int i = 0; i < tokenized.length; i++) {
57 tokenizedChar[i] = tokenized[i].toCharArray();
58 }
59 }
60
61
62
63
64
65 public String getSource() {
66 return regexPattern == null ? source : regexPattern;
67 }
68
69 public boolean matchPath(String str, boolean isCaseSensitive) {
70 if (regexPattern != null) {
71 return str.matches(regexPattern);
72 } else {
73 return SelectorUtils.matchAntPathPattern(this, str, separator, isCaseSensitive);
74 }
75 }
76
77 boolean matchPath(String str, char[][] strDirs, boolean isCaseSensitive) {
78 if (regexPattern != null) {
79 return str.matches(regexPattern);
80 } else {
81 return SelectorUtils.matchAntPathPattern(getTokenizedPathChars(), strDirs, isCaseSensitive);
82 }
83 }
84
85 public boolean matchPatternStart(String str, boolean isCaseSensitive) {
86 if (regexPattern != null) {
87
88
89 return true;
90 } else {
91 String altStr = str.replace('\\', '/');
92
93 return SelectorUtils.matchAntPathPatternStart(this, str, File.separator, isCaseSensitive)
94 || SelectorUtils.matchAntPathPatternStart(this, altStr, "/", isCaseSensitive);
95 }
96 }
97
98 public String[] getTokenizedPathString() {
99 return tokenized;
100 }
101
102 public char[][] getTokenizedPathChars() {
103 return tokenizedChar;
104 }
105
106 public boolean startsWith(String string) {
107 return source.startsWith(string);
108 }
109
110 public static String[] tokenizePathToString(String path, String separator) {
111 List<String> ret = new ArrayList<String>();
112 StringTokenizer st = new StringTokenizer(path, separator);
113 while (st.hasMoreTokens()) {
114 ret.add(st.nextToken());
115 }
116 return ret.toArray(new String[0]);
117 }
118
119 static char[][] tokenizePathToCharArray(String path, String separator) {
120 String[] tokenizedName = tokenizePathToString(path, separator);
121 char[][] tokenizedNameChar = new char[tokenizedName.length][];
122 for (int i = 0; i < tokenizedName.length; i++) {
123 tokenizedNameChar[i] = tokenizedName[i].toCharArray();
124 }
125 return tokenizedNameChar;
126 }
127
128 public static MatchPattern fromString(String source) {
129 return new MatchPattern(source, File.separator);
130 }
131 }