git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@442287 13f79535-47bb-0310-9956-ffa450edef68master
@@ -38,6 +38,10 @@ Other changes: | |||||
Bugzilla report 36772. | Bugzilla report 36772. | ||||
* added searchparents attribute to <available>. Bugzilla report 39549. | * added searchparents attribute to <available>. Bugzilla report 39549. | ||||
* tasks that don't extend Ant's Task class can will now get the build file | |||||
location reflected into a method of the signature void setLocation(Location) | |||||
- if such a method exists. | |||||
Changes from Ant 1.6.5 to Ant 1.7.0Beta1 | Changes from Ant 1.6.5 to Ant 1.7.0Beta1 | ||||
======================================== | ======================================== | ||||
@@ -0,0 +1,38 @@ | |||||
<?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 name="location" default="all"> | |||||
<target name="all"> | |||||
<fail>Only use this build file from within tests</fail> | |||||
</target> | |||||
<target name="testPlainTask"> | |||||
<echo id="echo">Hello</echo> | |||||
</target> | |||||
<target name="testStandaloneType"> | |||||
<echo id="echo2">Hello</echo> | |||||
<fileset id="fs" dir="."/> | |||||
</target> | |||||
<target name="testConditionTask"> | |||||
<condition property="foo" id="cond"> | |||||
<equals arg1="bar" arg2="baz"/> | |||||
</condition> | |||||
</target> | |||||
</project> |
@@ -34,6 +34,14 @@ public abstract class ProjectComponent { | |||||
*/ | */ | ||||
protected Project project; | protected Project project; | ||||
/** | |||||
* Location within the build file of this task definition. | |||||
* @deprecated since 1.6.x. | |||||
* You should not be accessing this variable directly. | |||||
* Please use the {@link #getLocation()} method. | |||||
*/ | |||||
protected Location location = Location.UNKNOWN_LOCATION; | |||||
/** Sole constructor. */ | /** Sole constructor. */ | ||||
public ProjectComponent() { | public ProjectComponent() { | ||||
} | } | ||||
@@ -60,6 +68,32 @@ public abstract class ProjectComponent { | |||||
return project; | return project; | ||||
} | } | ||||
/** | |||||
* Returns the file/location where this task was defined. | |||||
* | |||||
* @return the file/location where this task was defined. | |||||
* Should not return <code>null</code>. Location.UNKNOWN_LOCATION | |||||
* is used for unknown locations. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public Location getLocation() { | |||||
return location; | |||||
} | |||||
/** | |||||
* Sets the file/location where this task was defined. | |||||
* | |||||
* @param location The file/location where this task was defined. | |||||
* Should not be <code>null</code>--use | |||||
* Location.UNKNOWN_LOCATION if the location isn't known. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public void setLocation(Location location) { | |||||
this.location = location; | |||||
} | |||||
/** | /** | ||||
* Logs a message with the default (INFO) priority. | * Logs a message with the default (INFO) priority. | ||||
* | * | ||||
@@ -47,14 +47,6 @@ public abstract class Task extends ProjectComponent { | |||||
*/ | */ | ||||
protected String description; | protected String description; | ||||
/** | |||||
* Location within the build file of this task definition. | |||||
* @deprecated since 1.6.x. | |||||
* You should not be accessing this variable directly. | |||||
* Please use the {@link #getLocation()} method. | |||||
*/ | |||||
protected Location location = Location.UNKNOWN_LOCATION; | |||||
/** | /** | ||||
* Name of this task to be used for logging purposes. | * Name of this task to be used for logging purposes. | ||||
* This defaults to the same as the type, but may be | * This defaults to the same as the type, but may be | ||||
@@ -190,32 +182,6 @@ public abstract class Task extends ProjectComponent { | |||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
} | } | ||||
/** | |||||
* Returns the file/location where this task was defined. | |||||
* | |||||
* @return the file/location where this task was defined. | |||||
* Should not return <code>null</code>. Location.UNKNOWN_LOCATION | |||||
* is used for unknown locations. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public Location getLocation() { | |||||
return location; | |||||
} | |||||
/** | |||||
* Sets the file/location where this task was defined. | |||||
* | |||||
* @param location The file/location where this task was defined. | |||||
* Should not be <code>null</code>--use | |||||
* Location.UNKNOWN_LOCATION if the location isn't known. | |||||
* | |||||
* @see Location#UNKNOWN_LOCATION | |||||
*/ | |||||
public void setLocation(Location location) { | |||||
this.location = location; | |||||
} | |||||
/** | /** | ||||
* Returns the wrapper used for runtime configuration. | * Returns the wrapper used for runtime configuration. | ||||
* | * | ||||
@@ -100,9 +100,23 @@ public class TaskAdapter extends Task implements TypeAdapter { | |||||
* or the method could not be executed. | * or the method could not be executed. | ||||
*/ | */ | ||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
Method setProjectM = null; | |||||
try { | try { | ||||
setProjectM = proxy.getClass().getMethod( | |||||
Method setLocationM = proxy.getClass().getMethod( | |||||
"setLocation", new Class[] {Location.class}); | |||||
if (setLocationM != null) { | |||||
setLocationM.invoke(proxy, new Object[] {getLocation()}); | |||||
} | |||||
} catch (NoSuchMethodException e) { | |||||
// ignore this if the class being used as a task does not have | |||||
// a set location method. | |||||
} catch (Exception ex) { | |||||
log("Error setting location in " + proxy.getClass(), | |||||
Project.MSG_ERR); | |||||
throw new BuildException(ex); | |||||
} | |||||
try { | |||||
Method setProjectM = proxy.getClass().getMethod( | |||||
"setProject", new Class[] {Project.class}); | "setProject", new Class[] {Project.class}); | ||||
if (setProjectM != null) { | if (setProjectM != null) { | ||||
setProjectM.invoke(proxy, new Object[] {getProject()}); | setProjectM.invoke(proxy, new Object[] {getProject()}); | ||||
@@ -424,6 +424,9 @@ public class UnknownElement extends Task { | |||||
if (o instanceof Task) { | if (o instanceof Task) { | ||||
((Task) o).setOwningTarget(getOwningTarget()); | ((Task) o).setOwningTarget(getOwningTarget()); | ||||
} | } | ||||
if (o instanceof ProjectComponent) { | |||||
((ProjectComponent) o).setLocation(getLocation()); | |||||
} | |||||
return o; | return o; | ||||
} | } | ||||
@@ -545,7 +548,9 @@ public class UnknownElement extends Task { | |||||
childTask.setRuntimeConfigurableWrapper(childWrapper); | childTask.setRuntimeConfigurableWrapper(childWrapper); | ||||
childTask.setTaskName(childName); | childTask.setTaskName(childName); | ||||
childTask.setTaskType(childName); | childTask.setTaskType(childName); | ||||
childTask.setLocation(child.getLocation()); | |||||
} | |||||
if (realChild instanceof ProjectComponent) { | |||||
((ProjectComponent) realChild).setLocation(child.getLocation()); | |||||
} | } | ||||
child.handleChildren(realChild, childWrapper); | child.handleChildren(realChild, childWrapper); | ||||
return true; | return true; | ||||
@@ -0,0 +1,54 @@ | |||||
/* | |||||
* 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. | |||||
* | |||||
*/ | |||||
package org.apache.tools.ant; | |||||
import org.apache.tools.ant.taskdefs.ConditionTask; | |||||
import org.apache.tools.ant.taskdefs.Echo; | |||||
import org.apache.tools.ant.types.FileSet; | |||||
public class LocationTest extends BuildFileTest { | |||||
public void setUp() { | |||||
configureProject("src/etc/testcases/core/location.xml"); | |||||
} | |||||
public void testPlainTask() { | |||||
executeTarget("testPlainTask"); | |||||
Echo e = (Echo) getProject().getReference("echo"); | |||||
assertFalse(e.getLocation() == Location.UNKNOWN_LOCATION); | |||||
assertFalse(e.getLocation().getLineNumber() == 0); | |||||
} | |||||
public void testStandaloneType() { | |||||
executeTarget("testStandaloneType"); | |||||
Echo e = (Echo) getProject().getReference("echo2"); | |||||
FileSet f = (FileSet) getProject().getReference("fs"); | |||||
assertFalse(f.getLocation() == Location.UNKNOWN_LOCATION); | |||||
assertEquals(e.getLocation().getLineNumber() + 1, | |||||
f.getLocation().getLineNumber()); | |||||
} | |||||
public void testConditionTask() { | |||||
executeTarget("testConditionTask"); | |||||
TaskAdapter ta = (TaskAdapter) getProject().getReference("cond"); | |||||
ConditionTask c = (ConditionTask) ta.getProxy(); | |||||
assertFalse(c.getLocation() == Location.UNKNOWN_LOCATION); | |||||
assertFalse(c.getLocation().getLineNumber() == 0); | |||||
} | |||||
} |