/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.jikesrvm.tools.ant; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.RegularExpression; import org.apache.tools.ant.util.regexp.Regexp; /** * Filter out any lines from input that match the supplied patterns. */ public class LineFilterTask extends Task { private final ArrayList<RegularExpression> patterns = new ArrayList<RegularExpression>(); private File src; private File dest; public void setSrc(final File src) { this.src = src; } public void setDest(final File dest) { this.dest = dest; } public void addFilter(final RegularExpression regex) { patterns.add(regex); } public void execute() throws BuildException { if (null == src) throw new BuildException("src not set."); if (null == dest) throw new BuildException("dest not set."); if (0 == patterns.size()) throw new BuildException("No patterns specified."); final ArrayList<Regexp> regexpList = new ArrayList<Regexp>(); for (final RegularExpression pattern : patterns) { regexpList.add(pattern.getRegexp(getProject())); } final Regexp[] regexps = regexpList.toArray(new Regexp[regexpList.size()]); BufferedReader reader = null; BufferedWriter writer = null; try { reader = new BufferedReader(new FileReader(src)); writer = new BufferedWriter(new FileWriter(dest)); String line = reader.readLine(); while (null != line) { if (!lineMatches(line, regexps)) { writer.write(line); writer.write('\n'); } line = reader.readLine(); } } catch (IOException e) { throw new BuildException("Error truncating file " + src, e); } finally { if (null != reader) { try { reader.close(); } catch (IOException e) { } } if (null != writer) { try { writer.close(); } catch (final IOException ioe) { throw new BuildException(ioe); } } } } private boolean lineMatches(final String line, final Regexp[] regexps) { for (Regexp regexp : regexps) { if (regexp.matches(line)) { return true; } } return false; } }