1 /*
2 * Copyright (c) 2003-2004, Henri Yandell
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or
6 * without modification, are permitted provided that the
7 * following conditions are met:
8 *
9 * + Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * + Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * + Neither the name of Genjava-Core nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 package com.generationjava.util;
33
34 import java.util.ArrayList;
35
36 /***
37 * An implementation of Wildcard logic, as seen on command lines
38 * on UNIX and DOS.
39 */
40 public class WildcardUtils {
41
42 /***
43 * See if a particular piece of text, often a filename,
44 * matches to a specified wildcard.
45 */
46 public static boolean match(String text, String wildcard) {
47 // split wildcard on ? and *
48 // for each element of the array, find a matching block in text
49 // earliest matching block counts
50 String[] wcs = splitOnTokens(wildcard);
51 int textIdx = 0;
52 for(int i=0; i<wcs.length; i++) {
53 if(textIdx == text.length()) {
54 if("*".equals(wcs[i])) {
55 return true;
56 }
57 return wcs[i].length() == 0;
58 }
59
60 if("?".equals(wcs[i])) {
61 textIdx++;
62 } else
63 if("*".equals(wcs[i])) {
64 int nextIdx = i+1;
65 if(nextIdx == wcs.length) {
66 return true;
67 }
68 int restartIdx = text.indexOf(wcs[nextIdx], textIdx);
69 if(restartIdx == -1) {
70 return false;
71 } else {
72 textIdx = restartIdx;
73 }
74 } else {
75 if(!text.startsWith(wcs[i], textIdx)) {
76 return false;
77 } else {
78 textIdx += wcs[i].length();
79 }
80 }
81 }
82
83 return true;
84 }
85
86 // package level so a unit test may run on this
87 static String[] splitOnTokens(String text) {
88 char[] array = text.toCharArray();
89 if(text.indexOf("?") == -1 && text.indexOf("*") == -1) {
90 return new String[] { text };
91 }
92
93 ArrayList list = new ArrayList();
94 StringBuffer buffer = new StringBuffer();
95 for(int i=0; i<array.length; i++) {
96 if(array[i] == '?' || array[i] == '*') {
97 if(buffer.length() != 0) {
98 list.add(buffer.toString());
99 buffer.setLength(0);
100 }
101 list.add(new String( new char[] { array[i] } ));
102 } else {
103 buffer.append(array[i]);
104 }
105 }
106 if(buffer.length() != 0) {
107 list.add(buffer.toString());
108 }
109
110 return (String[]) list.toArray(new String[0]);
111 }
112
113
114 }