001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.types.selectors;
020:
021: import java.io.BufferedReader;
022: import java.io.File;
023: import java.io.IOException;
024: import java.io.InputStreamReader;
025:
026: import org.apache.tools.ant.BuildException;
027: import org.apache.tools.ant.types.Parameter;
028: import org.apache.tools.ant.types.RegularExpression;
029: import org.apache.tools.ant.types.Resource;
030: import org.apache.tools.ant.types.resources.FileResource;
031: import org.apache.tools.ant.types.resources.selectors.ResourceSelector;
032: import org.apache.tools.ant.util.regexp.Regexp;
033:
034: /**
035: * Selector that filters files based on a regular expression.
036: *
037: * @since Ant 1.6
038: */
039: public class ContainsRegexpSelector extends BaseExtendSelector
040: implements ResourceSelector {
041:
042: private String userProvidedExpression = null;
043: private RegularExpression myRegExp = null;
044: private Regexp myExpression = null;
045: /** Key to used for parameterized custom selector */
046: public static final String EXPRESSION_KEY = "expression";
047:
048: /**
049: * Creates a new <code>ContainsRegexpSelector</code> instance.
050: */
051: public ContainsRegexpSelector() {
052: }
053:
054: /**
055: * @return a string describing this object
056: */
057: public String toString() {
058: StringBuffer buf = new StringBuffer(
059: "{containsregexpselector expression: ");
060: buf.append(userProvidedExpression);
061: buf.append("}");
062: return buf.toString();
063: }
064:
065: /**
066: * The regular expression used to search the file.
067: *
068: * @param theexpression this must match a line in the file to be selected.
069: */
070: public void setExpression(String theexpression) {
071: this .userProvidedExpression = theexpression;
072: }
073:
074: /**
075: * When using this as a custom selector, this method will be called.
076: * It translates each parameter into the appropriate setXXX() call.
077: *
078: * @param parameters the complete set of parameters for this selector
079: */
080: public void setParameters(Parameter[] parameters) {
081: super .setParameters(parameters);
082: if (parameters != null) {
083: for (int i = 0; i < parameters.length; i++) {
084: String paramname = parameters[i].getName();
085: if (EXPRESSION_KEY.equalsIgnoreCase(paramname)) {
086: setExpression(parameters[i].getValue());
087: } else {
088: setError("Invalid parameter " + paramname);
089: }
090: }
091: }
092: }
093:
094: /**
095: * Checks that an expression was specified.
096: *
097: */
098: public void verifySettings() {
099: if (userProvidedExpression == null) {
100: setError("The expression attribute is required");
101: }
102: }
103:
104: /**
105: * Tests a regular expression against each line of text in the file.
106: *
107: * @param basedir the base directory the scan is being done from
108: * @param filename is the name of the file to check
109: * @param file is a java.io.File object the selector can use
110: * @return whether the file should be selected or not
111: */
112: public boolean isSelected(File basedir, String filename, File file) {
113: return isSelected(new FileResource(file));
114: }
115:
116: /**
117: * Tests a regular expression against each line of text in a Resource.
118: *
119: * @param r the Resource to check.
120: * @return whether the Resource is selected or not
121: */
122: public boolean isSelected(Resource r) {
123: String teststr = null;
124: BufferedReader in = null;
125:
126: // throw BuildException on error
127:
128: validate();
129:
130: if (r.isDirectory()) {
131: return true;
132: }
133:
134: if (myRegExp == null) {
135: myRegExp = new RegularExpression();
136: myRegExp.setPattern(userProvidedExpression);
137: myExpression = myRegExp.getRegexp(getProject());
138: }
139:
140: try {
141: in = new BufferedReader(new InputStreamReader(r
142: .getInputStream()));
143: } catch (Exception e) {
144: throw new BuildException("Could not get InputStream from "
145: + r.toLongString(), e);
146: }
147: try {
148: teststr = in.readLine();
149:
150: while (teststr != null) {
151:
152: if (myExpression.matches(teststr)) {
153: return true;
154: }
155: teststr = in.readLine();
156: }
157:
158: return false;
159: } catch (IOException ioe) {
160: throw new BuildException("Could not read "
161: + r.toLongString());
162: } finally {
163: if (in != null) {
164: try {
165: in.close();
166: } catch (Exception e) {
167: throw new BuildException("Could not close "
168: + r.toLongString());
169: }
170: }
171: }
172: }
173: }
|