/* * 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.File; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Vector; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Property; import org.apache.tools.ant.types.RegularExpression; import org.apache.tools.ant.util.regexp.Regexp; public class SelectRegexTask extends Task { private RegularExpression pattern; private int patternLines; private String select; private String property; private File file; public void setProperty(final String property) { this.property = property; } public void setSelect(final String select) { this.select = select; } public void setFile(final File file) { this.file = file; } public void setPattern(final String pattern) { this.pattern = new RegularExpression(); this.pattern.setPattern(pattern); this.patternLines = pattern.split(System.getProperty("line.separator")).length; } public void execute() { validate(); final String output = matchFile(); if (output != null) { Property p = (Property) getProject().createTask("property"); p.setName(property); p.setValue(output); p.execute(); } } private String matchFile() { BufferedReader input = null; try { final Regexp regexp = this.pattern.getRegexp(getProject()); input = new BufferedReader(new FileReader(file)); String[] lines = new String[patternLines]; String sep = System.getProperty("line.separator"); for(int i=0; i < lines.length; i++) { lines[i] = ""; } int nextLine = 0; while((lines[nextLine] = input.readLine()) != null) { StringBuilder sb = new StringBuilder(); for(int i=nextLine+1; i <= nextLine + lines.length ; i++) { String line = lines[i % lines.length]; sb.append(line); sb.append(sep); } String result = performMatching(sb.toString()); if (result != null) { return result; } nextLine = (nextLine + 1) % lines.length; } return null; } catch (IOException ioe) { throw new BuildException("Error loading file " + file, ioe, getLocation()); } finally { if (input != null) { try { input.close(); } catch (final IOException ioe) { //ignore } } } } private String performMatching(final String input) { final Regexp regexp = this.pattern.getRegexp(getProject()); final Vector groups = regexp.getGroups(input, 0); if (groups != null && !groups.isEmpty()) { String output = select; final int count = groups.size(); for (int i = 0; i < count; i++) { final String group = (String) groups.get(i); output = output.replace("\\" + i, group); } return output; } return null; } private void validate() { if (null == property) throw new BuildException("Property not set."); if (null == pattern) throw new BuildException("No regular expression specified."); if (null == select) throw new BuildException("Select not set."); if (null == file) throw new BuildException("File not set."); if (!file.exists()) throw new BuildException("File does not exist. - " + file); if (!file.isFile()) throw new BuildException("File is not a regular file. - " + file); } }