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. * Copy of UnknownElement in macroinstance was not recursive.
Bugzilla report 40238. Bugzilla report 40238.


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

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




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

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


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

<target name="namespacetest" xmlns:prefix="uri"> <target name="namespacetest" xmlns:prefix="uri">
<typedef name="eq" uri="uri" <typedef name="eq" uri="uri"
classname="org.apache.tools.ant.taskdefs.condition.Equals"/> 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 = constructor =
args[0].getConstructor(new Class[] {Project.class}); args[0].getConstructor(new Class[] {Project.class});
} }

String propName = getPropertyName(name, "add"); 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]); nestedTypes.put(propName, args[0]);
nestedCreators.put(propName, new AddNestedCreator(m, nestedCreators.put(propName, new AddNestedCreator(m,
constructor, AddNestedCreator.ADD)); constructor, AddNestedCreator.ADD));
@@ -1439,6 +1448,8 @@ public final class IntrospectionHelper implements BuildListener {
* the addTypeMethods array. The array is * the addTypeMethods array. The array is
* ordered so that the more derived classes * ordered so that the more derived classes
* are first. * are first.
* If both add and addConfigured are present, the addConfigured
* will take priority.
* @param method the <code>Method</code> to insert. * @param method the <code>Method</code> to insert.
*/ */
private void insertAddTypeMethod(Method method) { private void insertAddTypeMethod(Method method) {
@@ -1446,6 +1457,10 @@ public final class IntrospectionHelper implements BuildListener {
for (int c = 0; c < addTypeMethods.size(); ++c) { for (int c = 0; c < addTypeMethods.size(); ++c) {
Method current = (Method) addTypeMethods.get(c); Method current = (Method) addTypeMethods.get(c);
if (current.getParameterTypes()[0].equals(argClass)) { if (current.getParameterTypes()[0].equals(argClass)) {
if (method.getName().equals("addConfigured")) {
// add configured replaces the add method
addTypeMethods.set(c, method);
}
return; // Already present return; // Already present
} }
if (current.getParameterTypes()[0].isAssignableFrom( 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; 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>. * Add a nested <code>FileNameMapper</code>.
* @param fileNameMapper the <code>FileNameMapper</code> to add. * @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()); 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>. * Add a <code>FileNameMapper</code>.
* @param fileNameMapper 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; package org.apache.tools.ant.types;


import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.condition.Condition; 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"); "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() { public void testNamespace() {
executeTarget("namespacetest"); executeTarget("namespacetest");
} }
@@ -151,6 +158,25 @@ public class AddTypeTest extends BuildFileTest {
log("value is " + value); log("value is " + value);
this.value = 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() { public void execute() {
log("execute: value is " + value); log("execute: value is " + value);
} }


Loading…
Cancel
Save