diff --git a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java new file mode 100644 index 000000000..8e2e2e999 --- /dev/null +++ b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/filters/LineContainsRegExp.java @@ -0,0 +1,208 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; +import java.util.Vector; + +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.RegularExpression; +import org.apache.tools.ant.util.regexp.Regexp; + +/** + * Filter Reader to fetch only those lines that contain user specified + * regular expression matching strings. + * + * Example: + * ======= + * + * <linecontainsregexp> + * <regexp pattern="foo*"> + * </linecontainsregexp> + * + * Or: + * + * <filterreader classname="org.apache.tools.ant.filters.LineContainsRegExp"> + * <param type="regexp" value="foo*"/> + * </filterreader> + * + * This will fetch all those lines that contain the pattern foo + * + * @author Magesh Umasankar + */ +public final class LineContainsRegExp + extends BaseParamFilterReader + implements ChainableReader +{ + /** contains key */ + private static final String REGEXP_KEY = "regexp"; + + /** Vector that holds the strings that input lines must contain. */ + private Vector regexps = new Vector(); + + /** Currently read in line. */ + private String line = null; + + /** + * This constructor is a dummy constructor and is + * not meant to be used by any class other than Ant's + * introspection mechanism. This will close the filter + * that is created making it useless for further operations. + */ + public LineContainsRegExp() { + super(); + } + + /** + * Create a new filtered reader. + * + * @param in a Reader object providing the underlying stream. + */ + public LineContainsRegExp(final Reader in) { + super(in); + } + + /** + * Choose only those lines that contains + * user defined values. + */ + public final int read() throws IOException { + if (!getInitialized()) { + initialize(); + setInitialized(true); + } + + int ch = -1; + + if (line != null) { + ch = line.charAt(0); + if (line.length() == 1) { + line = null; + } else { + line = line.substring(1); + } + } else { + line = readLine(); + if (line == null) { + ch = -1; + } else { + final int regexpsSize = regexps.size(); + for (int i = 0; i < regexpsSize; i++) { + RegularExpression regexp = (RegularExpression) + regexps.elementAt(i); + Regexp re = regexp.getRegexp(getProject()); + boolean matches = re.matches(line); + if (!matches) { + line = null; + break; + } + } + + return read(); + } + } + + return ch; + } + + /** + * Add a contains element. + */ + public final void addConfiguredRegexp(final RegularExpression regExp) { + this.regexps.addElement(regExp); + } + + /** + * Set regexps vector. + */ + private void setRegexps(final Vector regexps) { + this.regexps = regexps; + } + + /** + * Get regexps vector. + */ + private final Vector getRegexps() { + return regexps; + } + + /** + * Create a new LineContainsRegExp using the passed in + * Reader for instantiation. + */ + public final Reader chain(final Reader rdr) { + LineContainsRegExp newFilter = new LineContainsRegExp(rdr); + newFilter.setRegexps(getRegexps()); + newFilter.setInitialized(true); + return newFilter; + } + + /** + * Parse params to add user defined contains strings. + */ + private final void initialize() { + Parameter[] params = getParameters(); + if (params != null) { + for (int i = 0; i < params.length; i++) { + if (REGEXP_KEY.equals(params[i].getType())) { + String pattern = params[i].getValue(); + RegularExpression regexp = new RegularExpression(); + regexp.setPattern(pattern); + regexps.addElement(regexp); + } + } + } + } +} diff --git a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/types/FilterChain.java b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/types/FilterChain.java index 441ead33a..b8af0ea71 100644 --- a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/types/FilterChain.java +++ b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/types/FilterChain.java @@ -58,6 +58,7 @@ import java.util.Vector; import org.apache.tools.ant.filters.ExpandProperties; import org.apache.tools.ant.filters.HeadFilter; import org.apache.tools.ant.filters.LineContains; +import org.apache.tools.ant.filters.LineContainsRegExp; import org.apache.tools.ant.filters.PrefixLines; import org.apache.tools.ant.filters.ReplaceTokens; import org.apache.tools.ant.filters.StripJavaComments; @@ -95,6 +96,11 @@ public final class FilterChain { filterReaders.addElement(lineContains); } + public final void addLineContainsRegExp(final LineContainsRegExp + lineContainsRegExp) { + filterReaders.addElement(lineContainsRegExp); + } + public final void addPrefixLines(final PrefixLines prefixLines) { filterReaders.addElement(prefixLines); }