Browse Source

Allow references to keep references to the project that

they were created in and use that project to deference the reference.
PR: 25777
Obtained from: Jesse Glick


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@277352 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Reilly 20 years ago
parent
commit
0d08780618
5 changed files with 95 additions and 7 deletions
  1. +5
    -0
      WHATSNEW
  2. +14
    -0
      src/etc/testcases/taskdefs/ant.xml
  3. +7
    -1
      src/etc/testcases/taskdefs/ant/references.xml
  4. +64
    -5
      src/main/org/apache/tools/ant/types/Reference.java
  5. +5
    -1
      src/testcases/org/apache/tools/ant/taskdefs/AntTest.java

+ 5
- 0
WHATSNEW View File

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



+ 14
- 0
src/etc/testcases/taskdefs/ant.xml View File

@@ -82,6 +82,20 @@
</ant>
</target>

<target name="testInheritPath" description="try to pass a reference to a path, which refers itself to a second path">
<property name="rootdir" location="."/>
<path id="project.classpath">
<pathelement location="../classes"/>
</path>
<path id="test.classpath">
<pathelement location="${rootdir}/test/testframework.jar"/>
<path refid="project.classpath"/>
</path>
<ant antfile="ant/references.xml" target="testInheritPath">
<reference refid="test.classpath"/>
</ant>
</target>

<target name="testLogfilePlacement">
<ant antfile="ant.xml" target="dummy" output="test1.log"
inheritall="false" />


+ 7
- 1
src/etc/testcases/taskdefs/ant/references.xml View File

@@ -7,4 +7,10 @@
</target>

<target name="dummy" />
</project>

<target name="testInheritPath">
<pathconvert refid="test.classpath" pathsep="${line.separator}" property="myprop"/>
<echo>${myprop}</echo>
</target>

</project>

+ 64
- 5
src/main/org/apache/tools/ant/types/Reference.java View File

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

}

+ 5
- 1
src/testcases/org/apache/tools/ant/taskdefs/AntTest.java View File

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


Loading…
Cancel
Save