/* * Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sf.antcontrib.property; import java.util.Vector; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.RegularExpression; import org.apache.tools.ant.types.Substitution; import org.apache.tools.ant.util.regexp.Regexp; /**************************************************************************** * Place class description here. * * @author <a href='mailto:mattinger@yahoo.com'>Matthew Inger</a> * @author <additional author> * * @since * ****************************************************************************/ public class RegexTask extends AbstractPropertySetterTask { private String input; private RegularExpression regexp; private String select; private Substitution replace; private String defaultValue; private boolean caseSensitive = true; private boolean global = true; public RegexTask() { super(); } public void setInput(String input) { this.input = input; } public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public void setRegexp(String regex) { if (this.regexp != null) throw new BuildException("Cannot specify more than one regular expression"); this.regexp = new RegularExpression(); this.regexp.setPattern(regex); } public RegularExpression createRegexp() { if (this.regexp != null) throw new BuildException("Cannot specify more than one regular expression"); regexp = new RegularExpression(); return regexp; } public void setReplace(String replace) { if (this.replace != null) throw new BuildException("Cannot specify more than one replace expression"); if (select != null) throw new BuildException("You cannot specify both a select and replace expression"); this.replace = new Substitution(); this.replace.setExpression(replace); } public Substitution createReplace() { if (replace != null) throw new BuildException("Cannot specify more than one replace expression"); if (select != null) throw new BuildException("You cannot specify both a select and replace expression"); replace = new Substitution(); return replace; } public void setSelect(String select) { if (replace != null) throw new BuildException("You cannot specify both a select and replace expression"); this.select = select; } public void setCaseSensitive(boolean caseSensitive) { this.caseSensitive = caseSensitive; } public void setGlobal(boolean global) { this.global = global; } protected String doReplace() throws BuildException { if (replace == null) throw new BuildException("No replace expression specified."); int options = 0; if (! caseSensitive) options |= Regexp.MATCH_CASE_INSENSITIVE; if (global) options |= Regexp.REPLACE_ALL; Regexp sregex = regexp.getRegexp(project); String output = null; if (sregex.matches(input, options)) { String expression = replace.getExpression(project); output = sregex.substitute(input, expression, options); } if (output == null) output = defaultValue; return output; } protected String doSelect() throws BuildException { int options = 0; if (! caseSensitive) options |= Regexp.MATCH_CASE_INSENSITIVE; Regexp sregex = regexp.getRegexp(project); String output = select; Vector groups = sregex.getGroups(input, options); if (groups != null && groups.size() > 0) { output = RegexUtil.select(select, groups); } else { output = null; } if (output == null) output = defaultValue; return output; } protected void validate() { super.validate(); if (regexp == null) throw new BuildException("No match expression specified."); if (replace == null && select == null) throw new BuildException("You must specify either a replace or select expression"); } public void execute() throws BuildException { validate(); String output = input; if (replace != null) output = doReplace(); else output = doSelect(); if (output != null) setPropertyValue(output); } }