Browse Source

support regular expressions in filename and name selectors. PR 45284.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@685887 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 17 years ago
parent
commit
d814a03e98
8 changed files with 256 additions and 19 deletions
  1. +10
    -0
      WHATSNEW
  2. +8
    -2
      docs/manual/CoreTypes/resources.html
  3. +6
    -1
      docs/manual/CoreTypes/selectors.html
  4. +49
    -2
      src/main/org/apache/tools/ant/types/resources/selectors/Name.java
  5. +44
    -13
      src/main/org/apache/tools/ant/types/selectors/FilenameSelector.java
  6. +64
    -0
      src/tests/antunit/types/resources/selectors/name-test.xml
  7. +74
    -0
      src/tests/antunit/types/selectors/filename-test.xml
  8. +1
    -1
      src/tests/junit/org/apache/tools/ant/types/selectors/FilenameSelectorTest.java

+ 10
- 0
WHATSNEW View File

@@ -257,6 +257,16 @@ Other changes:
write.
Bugzilla Report 45081.

* The filename file selector has a new attribute regex that allows
files to be selected by matching their names against a regular
expression.
Bugzilla Report 45284

* The name resource selector has a new attribute regex that allows
resources to be selected by matching their names against a regular
expression.
Bugzilla Report 45284

Changes from Ant 1.7.0 TO Ant 1.7.1
=============================================



+ 8
- 2
docs/manual/CoreTypes/resources.html View File

@@ -503,8 +503,14 @@ platforms.
</tr>
<tr>
<td valign="top">name</td>
<td valign="top">The name pattern to test</td>
<td align="center" valign="top">Yes</td>
<td valign="top">The name pattern to test using standard Ant
patterns.</td>
<td valign="top" align="center" rowspan="2">Exactly one of
the two</td>
</tr>
<tr>
<td valign="top">regex</td>
<td valign="top">The regular expression matching files to select.</td>
</tr>
<tr>
<td valign="top">casesensitive</td>


+ 6
- 1
docs/manual/CoreTypes/selectors.html View File

@@ -435,7 +435,12 @@
<td valign="top">The name of files to select. The name parameter
can contain the standard Ant wildcard characters.
</td>
<td valign="top" align="center">Yes</td>
<td valign="top" align="center" rowspan="2">Exactly one of
the two</td>
</tr>
<tr>
<td valign="top">regex</td>
<td valign="top">The regular expression matching files to select.</td>
</tr>
<tr>
<td valign="top">casesensitive</td>


+ 49
- 2
src/main/org/apache/tools/ant/types/resources/selectors/Name.java View File

@@ -17,17 +17,31 @@
*/
package org.apache.tools.ant.types.resources.selectors;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.RegularExpression;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.selectors.SelectorUtils;
import org.apache.tools.ant.util.regexp.Regexp;

/**
* Name ResourceSelector.
* @since Ant 1.7
*/
public class Name implements ResourceSelector {
private String regex = null;
private String pattern;
private boolean cs = true;

// caches for performance reasons
private RegularExpression reg;
private Regexp expression;

private Project project;

public void setProject(Project p) {
project = p;
}

/**
* Set the pattern to compare names against.
* @param n the pattern String to set.
@@ -44,6 +58,23 @@ public class Name implements ResourceSelector {
return pattern;
}

/**
* Set the regular expression to compare names against.
* @param r the regex to set.
*/
public void setRegex(String r) {
regex = r;
reg = null;
}

/**
* Get the regular expression used by this Name ResourceSelector.
* @return the String selection pattern.
*/
public String getRegex() {
return regex;
}

/**
* Set whether the name comparisons are case-sensitive.
* @param b boolean case-sensitivity flag.
@@ -67,11 +98,27 @@ public class Name implements ResourceSelector {
*/
public boolean isSelected(Resource r) {
String n = r.getName();
if (SelectorUtils.match(pattern, n, cs)) {
if (matches(n)) {
return true;
}
String s = r.toString();
return s.equals(n) ? false : SelectorUtils.match(pattern, s, cs);
return s.equals(n) ? false : matches(s);
}

private boolean matches(String name) {
if (pattern != null) {
return SelectorUtils.match(pattern, name, cs);
} else {
if (reg == null) {
reg = new RegularExpression();
reg.setPattern(regex);
expression = reg.getRegexp(project);
}
int options = Regexp.MATCH_DEFAULT;
if (!cs) {
options |= Regexp.MATCH_CASE_INSENSITIVE;
}
return expression.matches(name, options);
}
}
}

+ 44
- 13
src/main/org/apache/tools/ant/types/selectors/FilenameSelector.java View File

@@ -22,6 +22,8 @@ import java.io.File;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Parameter;
import org.apache.tools.ant.types.RegularExpression;
import org.apache.tools.ant.util.regexp.Regexp;

/**
* Selector that filters files based on the filename.
@@ -31,6 +33,7 @@ import org.apache.tools.ant.types.Parameter;
public class FilenameSelector extends BaseExtendSelector {

private String pattern = null;
private String regex = null;
private boolean casesensitive = true;

private boolean negated = false;
@@ -40,6 +43,12 @@ public class FilenameSelector extends BaseExtendSelector {
public static final String CASE_KEY = "casesensitive";
/** Used for parameterized custom selector */
public static final String NEGATE_KEY = "negate";
/** Used for parameterized custom selector */
public static final String REGEX_KEY = "regex";

// caches for performance reasons
private RegularExpression reg;
private Regexp expression;

/**
* Creates a new <code>FilenameSelector</code> instance.
@@ -53,19 +62,14 @@ public class FilenameSelector extends BaseExtendSelector {
*/
public String toString() {
StringBuffer buf = new StringBuffer("{filenameselector name: ");
if (pattern != null) {
buf.append(pattern);
buf.append(" negate: ");
if (negated) {
buf.append("true");
} else {
buf.append("false");
}
buf.append(" casesensitive: ");
if (casesensitive) {
buf.append("true");
} else {
buf.append("false");
if (regex != null) {
buf.append(regex).append(" [as regular expression]");
}
buf.append(" negate: ").append(negated);
buf.append(" casesensitive: ").append(casesensitive);
buf.append("}");
return buf.toString();
}
@@ -86,6 +90,17 @@ public class FilenameSelector extends BaseExtendSelector {
this.pattern = pattern;
}

/**
* The regular expression the file name will be matched against.
*
* @param pattern the regular expression that any filename must match
* against in order to be selected.
*/
public void setRegex(String pattern) {
this.regex = pattern;
this.reg = null;
}

/**
* Whether to ignore case when checking filenames.
*
@@ -125,6 +140,8 @@ public class FilenameSelector extends BaseExtendSelector {
parameters[i].getValue()));
} else if (NEGATE_KEY.equalsIgnoreCase(paramname)) {
setNegate(Project.toBoolean(parameters[i].getValue()));
} else if (REGEX_KEY.equalsIgnoreCase(paramname)) {
setRegex(parameters[i].getValue());
} else {
setError("Invalid parameter " + paramname);
}
@@ -138,8 +155,10 @@ public class FilenameSelector extends BaseExtendSelector {
*
*/
public void verifySettings() {
if (pattern == null) {
setError("The name attribute is required");
if (pattern == null && regex == null) {
setError("The name or regex attribute is required");
} else if (pattern != null && regex != null) {
setError("Only one of name and regex attribute is allowed");
}
}

@@ -157,9 +176,21 @@ public class FilenameSelector extends BaseExtendSelector {
*/
public boolean isSelected(File basedir, String filename, File file) {
validate();
if (pattern != null) {
return (SelectorUtils.matchPath(pattern, filename,
casesensitive) == !(negated));
} else {
if (reg == null) {
reg = new RegularExpression();
reg.setPattern(regex);
expression = reg.getRegexp(getProject());
}
int options = Regexp.MATCH_DEFAULT;
if (!casesensitive) {
options |= Regexp.MATCH_CASE_INSENSITIVE;
}
return expression.matches(filename, options) == !negated;
}
}

}


+ 64
- 0
src/tests/antunit/types/resources/selectors/name-test.xml View File

@@ -0,0 +1,64 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
-->
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit"
xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">

<import file="../../../antunit-base.xml" />

<property name="dir" location="testdir"/>
<property name="file" value="testfile"/>

<target name="createTestdir">
<mkdir dir="${dir}"/>
<touch file="${dir}/${file}"/>
</target>

<target name="tearDown">
<delete dir="${dir}"/>
</target>

<target name="testPattern" depends="createTestdir">
<au:assertTrue>
<resourcecount when="equal" count="1">
<restrict>
<fileset dir="${dir}"/>
<rsel:name name="*"/>
</restrict>
</resourcecount>
</au:assertTrue>
<au:assertTrue>
<resourcecount when="equal" count="0">
<restrict>
<fileset dir="${dir}"/>
<rsel:name name=".*"/>
</restrict>
</resourcecount>
</au:assertTrue>
</target>

<target name="testRegex" depends="createTestdir">
<au:assertTrue>
<resourcecount when="equal" count="1">
<restrict>
<fileset dir="${dir}"/>
<rsel:name regex=".*"/>
</restrict>
</resourcecount>
</au:assertTrue>
</target>
</project>

+ 74
- 0
src/tests/antunit/types/selectors/filename-test.xml View File

@@ -0,0 +1,74 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
-->
<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit">

<import file="../../antunit-base.xml" />

<property name="dir" location="testdir"/>
<property name="file" value="testfile"/>

<target name="createTestdir">
<mkdir dir="${dir}"/>
<touch file="${dir}/${file}"/>
</target>

<target name="tearDown">
<delete dir="${dir}"/>
</target>

<target name="testPattern" depends="createTestdir">
<au:assertTrue>
<resourcecount when="equal" count="1">
<fileset dir="${dir}">
<filename name="*"/>
</fileset>
</resourcecount>
</au:assertTrue>
<au:assertTrue>
<resourcecount when="equal" count="0">
<fileset dir="${dir}">
<filename name="*" negate="true"/>
</fileset>
</resourcecount>
</au:assertTrue>
<au:assertTrue>
<resourcecount when="equal" count="0">
<fileset dir="${dir}">
<filename name=".*"/>
</fileset>
</resourcecount>
</au:assertTrue>
</target>

<target name="testRegex" depends="createTestdir">
<au:assertTrue>
<resourcecount when="equal" count="1">
<fileset dir="${dir}">
<filename regex=".*"/>
</fileset>
</resourcecount>
</au:assertTrue>
<au:assertTrue>
<resourcecount when="equal" count="0">
<fileset dir="${dir}">
<filename regex=".*" negate="true"/>
</fileset>
</resourcecount>
</au:assertTrue>
</target>
</project>

+ 1
- 1
src/tests/junit/org/apache/tools/ant/types/selectors/FilenameSelectorTest.java View File

@@ -51,7 +51,7 @@ public class FilenameSelectorTest extends BaseSelectorTest {
s.isSelected(basedir,filenames[0],files[0]);
fail("FilenameSelector did not check for required fields");
} catch (BuildException be1) {
assertEquals("The name attribute is required", be1.getMessage());
assertEquals("The name or regex attribute is required", be1.getMessage());
}

s = (FilenameSelector)getInstance();


Loading…
Cancel
Save