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