Browse Source

fix for 40228, add code to introspectionhelper to make addconfigured higher priority than add, and add addconfigured to chainedmapper

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@436992 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Reilly 19 years ago
parent
commit
08bfc05623
6 changed files with 75 additions and 0 deletions
  1. +3
    -0
      WHATSNEW
  2. +9
    -0
      src/etc/testcases/types/addtype.xml
  3. +15
    -0
      src/main/org/apache/tools/ant/IntrospectionHelper.java
  4. +9
    -0
      src/main/org/apache/tools/ant/types/Mapper.java
  5. +13
    -0
      src/main/org/apache/tools/ant/util/ContainerMapper.java
  6. +26
    -0
      src/testcases/org/apache/tools/ant/types/AddTypeTest.java

+ 3
- 0
WHATSNEW View File

@@ -258,6 +258,9 @@ Fixed bugs:
* Copy of UnknownElement in macroinstance was not recursive.
Bugzilla report 40238.

* mixing of add and addConfigured methods in Mapper/ChainedMapper
causes incorrect chaining. Bugzilla report 40228.

Other changes:
--------------



+ 9
- 0
src/etc/testcases/types/addtype.xml View File

@@ -67,6 +67,9 @@
<typedef loaderref="nested.loader"
name = "myaddconfigured"
classname="${nested.package}AddTypeTest$MyAddConfigured"/>
<typedef loaderref="nested.loader"
name = "myaddconfiguredvalue"
classname="${nested.package}AddTypeTest$MyAddConfiguredValue"/>
<typedef loaderref="nested.loader"
name = "myvalue"
classname="${nested.package}AddTypeTest$MyValue"/>
@@ -127,6 +130,12 @@
</myaddconfigured>
</target>

<target name="myaddconfiguredvalue" depends="init">
<myaddconfiguredvalue>
<value>Value Set</value>
</myaddconfiguredvalue>
</target>

<target name="namespacetest" xmlns:prefix="uri">
<typedef name="eq" uri="uri"
classname="org.apache.tools.ant.taskdefs.condition.Equals"/>


+ 15
- 0
src/main/org/apache/tools/ant/IntrospectionHelper.java View File

@@ -267,7 +267,16 @@ public final class IntrospectionHelper implements BuildListener {
constructor =
args[0].getConstructor(new Class[] {Project.class});
}

String propName = getPropertyName(name, "add");
if (nestedTypes.get(propName) != null) {
/*
* Ignore this method as there is an addConfigured
* form of this method that has a higher
* priority
*/
continue;
}
nestedTypes.put(propName, args[0]);
nestedCreators.put(propName, new AddNestedCreator(m,
constructor, AddNestedCreator.ADD));
@@ -1439,6 +1448,8 @@ public final class IntrospectionHelper implements BuildListener {
* the addTypeMethods array. The array is
* ordered so that the more derived classes
* are first.
* If both add and addConfigured are present, the addConfigured
* will take priority.
* @param method the <code>Method</code> to insert.
*/
private void insertAddTypeMethod(Method method) {
@@ -1446,6 +1457,10 @@ public final class IntrospectionHelper implements BuildListener {
for (int c = 0; c < addTypeMethods.size(); ++c) {
Method current = (Method) addTypeMethods.get(c);
if (current.getParameterTypes()[0].equals(argClass)) {
if (method.getName().equals("addConfigured")) {
// add configured replaces the add method
addTypeMethods.set(c, method);
}
return; // Already present
}
if (current.getParameterTypes()[0].isAssignableFrom(


+ 9
- 0
src/main/org/apache/tools/ant/types/Mapper.java View File

@@ -57,6 +57,15 @@ public class Mapper extends DataType implements Cloneable {
this.type = type;
}

/**
* Cannot mix add and addconfigured in same type, so
* provide this to override the add method.
* @param fileNameMapper the <code>FileNameMapper</code> to add.
*/
public void addConfigured(FileNameMapper fileNameMapper) {
add(fileNameMapper);
}

/**
* Add a nested <code>FileNameMapper</code>.
* @param fileNameMapper the <code>FileNameMapper</code> to add.


+ 13
- 0
src/main/org/apache/tools/ant/util/ContainerMapper.java View File

@@ -40,6 +40,19 @@ public abstract class ContainerMapper implements FileNameMapper {
add(mapper.getImplementation());
}

/**
* An add configured version of the add method.
* This class used to contain an add method and an
* addConfiguredMapper method. Dur to ordering,
* the add method was always called first. This
* addConfigued method has been added to allow
* chaining to work correctly.
* @param fileNameMapper a <code>FileNameMapper</code>.
*/
public void addConfigured(FileNameMapper fileNameMapper) {
add(fileNameMapper);
}

/**
* Add a <code>FileNameMapper</code>.
* @param fileNameMapper a <code>FileNameMapper</code>.


+ 26
- 0
src/testcases/org/apache/tools/ant/types/AddTypeTest.java View File

@@ -18,6 +18,7 @@
package org.apache.tools.ant.types;

import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.condition.Condition;
@@ -86,6 +87,12 @@ public class AddTypeTest extends BuildFileTest {
"myaddconfigured", "value is Value Setexecute: value is Value Set");
}

public void testAddConfiguredValue() {
expectLogContaining(
"myaddconfiguredvalue",
"value is Value Setexecute: value is Value Set");
}

public void testNamespace() {
executeTarget("namespacetest");
}
@@ -151,6 +158,25 @@ public class AddTypeTest extends BuildFileTest {
log("value is " + value);
this.value = value;
}
public void add(MyValue value) {
throw new BuildException("Should not be called");
}
public void execute() {
log("execute: value is " + value);
}
}

public static class MyAddConfiguredValue
extends Task
{
MyValue value;
public void addConfiguredValue(MyValue value) {
log("value is " + value);
this.value = value;
}
public void addValue(MyValue value) {
throw new BuildException("Should not be called");
}
public void execute() {
log("execute: value is " + value);
}


Loading…
Cancel
Save