diff --git a/WHATSNEW b/WHATSNEW
index b56993bb7..11a2bbbcf 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -16,6 +16,11 @@ Changes that could break older environments:
it comes to bootclasspath handling), then the bootclasspath of the
VM running Ant will be added to the bootclasspath you've specified.
+* The Reference class now has a project field that will get
+ used (if set) in preference to the passed in project, when
+ dereferencing the reference.
+ Bugzilla Report 25777.
+
Fixed bugs:
-----------
diff --git a/src/etc/testcases/taskdefs/ant.xml b/src/etc/testcases/taskdefs/ant.xml
index dc570ab5b..3531d3f32 100644
--- a/src/etc/testcases/taskdefs/ant.xml
+++ b/src/etc/testcases/taskdefs/ant.xml
@@ -82,6 +82,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/etc/testcases/taskdefs/ant/references.xml b/src/etc/testcases/taskdefs/ant/references.xml
index 937a0e590..f053c9807 100644
--- a/src/etc/testcases/taskdefs/ant/references.xml
+++ b/src/etc/testcases/taskdefs/ant/references.xml
@@ -7,4 +7,10 @@
-
\ No newline at end of file
+
+
+
+ ${myprop}
+
+
+
diff --git a/src/main/org/apache/tools/ant/types/Reference.java b/src/main/org/apache/tools/ant/types/Reference.java
index 93714b8f9..e34bff9f4 100644
--- a/src/main/org/apache/tools/ant/types/Reference.java
+++ b/src/main/org/apache/tools/ant/types/Reference.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2002,2004 The Apache Software Foundation
+ * Copyright 2000-2002,2004-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,15 +27,31 @@ import org.apache.tools.ant.Project;
public class Reference {
private String refid;
+ private Project project;
+ /**
+ * @deprecated Please use {@link Reference#Reference(Project,String)} instead.
+ */
public Reference() {
- super();
}
+ /**
+ * @deprecated Please use {@link Reference#Reference(Project,String)} instead.
+ */
public Reference(String id) {
- this();
setRefId(id);
}
+
+ /**
+ * Create a reference to a named ID in a particular project.
+ * @param p the project this reference is associated with
+ * @param id the name of this reference
+ * @since Ant 1.7
+ */
+ public Reference(Project p, String id) {
+ setRefId(id);
+ setProject(p);
+ }
public void setRefId(String id) {
refid = id;
@@ -44,16 +60,59 @@ public class Reference {
public String getRefId() {
return refid;
}
+
+ /**
+ * Set the associated project. Should not normally be necessary;
+ * use {@link Reference#Reference(Project,String)}.
+ * @param p the project to use
+ * @since Ant 1.7
+ */
+ public void setProject(Project p) {
+ this.project = p;
+ }
+
+ /**
+ * Get the associated project, if any; may be null.
+ * @return the associated project
+ * @since Ant 1.7
+ */
+ public Project getProject() {
+ return project;
+ }
- public Object getReferencedObject(Project project) throws BuildException {
+ /**
+ * Resolve the reference, using the associated project if
+ * it set, otherwise use the passed in project.
+ * @param fallback the fallback project to use if the project attribute of
+ * reference is not set.
+ * @return the dereferenced object.
+ * @throws BuildException if the reference cannot be dereferenced.
+ */
+ public Object getReferencedObject(Project fallback) throws BuildException {
if (refid == null) {
throw new BuildException("No reference specified");
}
- Object o = project.getReference(refid);
+
+ Object o = project == null ? fallback.getReference(refid) : project.getReference(refid);
if (o == null) {
throw new BuildException("Reference " + refid + " not found.");
}
return o;
}
+
+ /**
+ * Resolve the reference, looking in the associated project.
+ * @see Project#getReference
+ * @return the dereferenced object.
+ * @throws BuildException if the project is null or the reference cannot be dereferenced
+ * @since Ant 1.7
+ */
+ public Object getReferencedObject() throws BuildException {
+ if (project == null) {
+ throw new BuildException("No project set on reference to " + refid);
+ }
+ return getReferencedObject(project);
+ }
+
}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java b/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java
index 61c2eb625..d6e1e5c50 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/AntTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2000-2004 The Apache Software Foundation
+ * Copyright 2000-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -173,6 +173,10 @@ public class AntTest extends BuildFileTest {
new boolean[] {false, true}, p);
}
+ public void testInheritPath() {
+ executeTarget("testInheritPath");
+ }
+
protected void testReference(String target, String[] keys,
boolean[] expect, Object value) {
ReferenceChecker rc = new ReferenceChecker(keys, expect, value);