Browse Source

Push setLocation down to ProjectComponent, reflect it into adapted tasks

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@442287 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 19 years ago
parent
commit
74434ce5d0
7 changed files with 152 additions and 37 deletions
  1. +4
    -0
      WHATSNEW
  2. +38
    -0
      src/etc/testcases/core/location.xml
  3. +34
    -0
      src/main/org/apache/tools/ant/ProjectComponent.java
  4. +0
    -34
      src/main/org/apache/tools/ant/Task.java
  5. +16
    -2
      src/main/org/apache/tools/ant/TaskAdapter.java
  6. +6
    -1
      src/main/org/apache/tools/ant/UnknownElement.java
  7. +54
    -0
      src/testcases/org/apache/tools/ant/LocationTest.java

+ 4
- 0
WHATSNEW View File

@@ -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
======================================== ========================================




+ 38
- 0
src/etc/testcases/core/location.xml View File

@@ -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
- 0
src/main/org/apache/tools/ant/ProjectComponent.java View File

@@ -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.
* *


+ 0
- 34
src/main/org/apache/tools/ant/Task.java View File

@@ -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.
* *


+ 16
- 2
src/main/org/apache/tools/ant/TaskAdapter.java View File

@@ -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()});


+ 6
- 1
src/main/org/apache/tools/ant/UnknownElement.java View File

@@ -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;


+ 54
- 0
src/testcases/org/apache/tools/ant/LocationTest.java View File

@@ -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);
}
}

Loading…
Cancel
Save