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 }