git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@465065 13f79535-47bb-0310-9956-ffa450edef68master
@@ -16,6 +16,9 @@ Other changes: | |||||
of Watchdog, ExecuteWatchdog and ExecuteJava, which could reduce the occurence | of Watchdog, ExecuteWatchdog and ExecuteJava, which could reduce the occurence | ||||
of race conditions here, especially on Java1.5+. | of race conditions here, especially on Java1.5+. | ||||
* Allow broken reference build files. The defer reference processing would | |||||
break too many files - so allow them with a warning. | |||||
Changes from Ant 1.7.0Beta2 to Ant 1.7.0Beta3 | Changes from Ant 1.7.0Beta2 to Ant 1.7.0Beta3 | ||||
============================================= | ============================================= | ||||
@@ -33,6 +33,7 @@ import java.util.Stack; | |||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Set; | import java.util.Set; | ||||
import java.util.HashSet; | import java.util.HashSet; | ||||
import java.util.HashMap; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.WeakHashMap; | import java.util.WeakHashMap; | ||||
import org.apache.tools.ant.input.DefaultInputHandler; | import org.apache.tools.ant.input.DefaultInputHandler; | ||||
@@ -61,6 +62,8 @@ import org.apache.tools.ant.util.StringUtils; | |||||
* | * | ||||
*/ | */ | ||||
public class Project implements ResourceFactory { | public class Project implements ResourceFactory { | ||||
private static final String LINE_SEP = System.getProperty("line.separator"); | |||||
/** Message priority of "error". */ | /** Message priority of "error". */ | ||||
public static final int MSG_ERR = 0; | public static final int MSG_ERR = 0; | ||||
/** Message priority of "warning". */ | /** Message priority of "warning". */ | ||||
@@ -136,6 +139,12 @@ public class Project implements ResourceFactory { | |||||
/** Map of references within the project (paths etc) (String to Object). */ | /** Map of references within the project (paths etc) (String to Object). */ | ||||
private Hashtable references = new AntRefTable(); | private Hashtable references = new AntRefTable(); | ||||
/** Map of id references - used for indicating broken build files */ | |||||
private HashMap idReferences = new HashMap(); | |||||
/** the parent project for old id resolution (if inheritreferences is set) */ | |||||
private Project parentIdProject = null; | |||||
/** Name of the project's default target. */ | /** Name of the project's default target. */ | ||||
private String defaultTarget; | private String defaultTarget; | ||||
@@ -1814,6 +1823,46 @@ public class Project implements ResourceFactory { | |||||
return new BuildException(new String(sb)); | return new BuildException(new String(sb)); | ||||
} | } | ||||
/** | |||||
* Inherit the id references. | |||||
* @param parent the parent project of this project. | |||||
*/ | |||||
public void inheritIDReferences(Project parent) { | |||||
parentIdProject = parent; | |||||
} | |||||
/** | |||||
* Attempt to resolve an Unknown Reference using the | |||||
* parsed id's - for BC. | |||||
*/ | |||||
private Object resolveIdReference(String key, Project callerProject) { | |||||
UnknownElement origUE = (UnknownElement) idReferences.get(key); | |||||
if (origUE == null) { | |||||
return parentIdProject == null | |||||
? null | |||||
: parentIdProject.resolveIdReference(key, callerProject); | |||||
} | |||||
callerProject.log( | |||||
"Warning: Reference " + key + " has not been set at runtime," | |||||
+ " but was found during" + LINE_SEP | |||||
+ "build file parsing, attempting to resolve." | |||||
+ " Future versions of Ant may support" + LINE_SEP | |||||
+ " referencing ids defined in non-executed targets.", MSG_WARN); | |||||
UnknownElement copyUE = origUE.copy(callerProject); | |||||
copyUE.maybeConfigure(); | |||||
return copyUE.getRealThing(); | |||||
} | |||||
/** | |||||
* Add an id reference. | |||||
* Used for broken build files. | |||||
* @param id the id to set. | |||||
* @param value the value to set it to (Unknown element in this case. | |||||
*/ | |||||
public void addIdReference(String id, Object value) { | |||||
idReferences.put(id, value); | |||||
} | |||||
/** | /** | ||||
* Add a reference to the project. | * Add a reference to the project. | ||||
* | * | ||||
@@ -1856,7 +1905,12 @@ public class Project implements ResourceFactory { | |||||
* there is no such reference in the project. | * there is no such reference in the project. | ||||
*/ | */ | ||||
public Object getReference(String key) { | public Object getReference(String key) { | ||||
return references.get(key); | |||||
Object ret = references.get(key); | |||||
if (ret != null) { | |||||
return ret; | |||||
} | |||||
// Check for old id behaviour | |||||
return resolveIdReference(key, this); | |||||
} | } | ||||
/** | /** | ||||
@@ -19,8 +19,10 @@ | |||||
package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Enumeration; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import org.apache.tools.ant.taskdefs.PreSetDef; | import org.apache.tools.ant.taskdefs.PreSetDef; | ||||
@@ -621,4 +623,45 @@ public class UnknownElement extends Task { | |||||
private static boolean equalsString(String a, String b) { | private static boolean equalsString(String a, String b) { | ||||
return (a == null) ? (b == null) : a.equals(b); | return (a == null) ? (b == null) : a.equals(b); | ||||
} | } | ||||
/** | |||||
* Make a copy of the unknown element and set it in the new project. | |||||
* @param newProject the project to create the UE in. | |||||
* @return the copied UE. | |||||
*/ | |||||
public UnknownElement copy(Project newProject) { | |||||
UnknownElement ret = new UnknownElement(getTag()); | |||||
ret.setNamespace(getNamespace()); | |||||
ret.setProject(newProject); | |||||
ret.setQName(getQName()); | |||||
ret.setTaskType(getTaskType()); | |||||
ret.setTaskName(getTaskName()); | |||||
ret.setLocation(getLocation()); | |||||
if (getOwningTarget() == null) { | |||||
Target t = new Target(); | |||||
t.setProject(getProject()); | |||||
ret.setOwningTarget(t); | |||||
} else { | |||||
ret.setOwningTarget(getOwningTarget()); | |||||
} | |||||
RuntimeConfigurable copyRC = new RuntimeConfigurable( | |||||
ret, getTaskName()); | |||||
copyRC.setPolyType(getWrapper().getPolyType()); | |||||
Map m = getWrapper().getAttributeMap(); | |||||
for (Iterator i = m.entrySet().iterator(); i.hasNext();) { | |||||
Map.Entry entry = (Map.Entry) i.next(); | |||||
copyRC.setAttribute( | |||||
(String) entry.getKey(), (String) entry.getValue()); | |||||
} | |||||
copyRC.addText(getWrapper().getText().toString()); | |||||
for (Enumeration e = getWrapper().getChildren(); e.hasMoreElements();) { | |||||
RuntimeConfigurable r = (RuntimeConfigurable) e.nextElement(); | |||||
UnknownElement ueChild = (UnknownElement) r.getProxy(); | |||||
UnknownElement copyChild = ueChild.copy(newProject); | |||||
copyRC.addChild(copyChild.getWrapper()); | |||||
ret.addChild(copyChild); | |||||
} | |||||
return ret; | |||||
} | |||||
} | } |
@@ -268,7 +268,7 @@ public class AntXMLContext { | |||||
public void configureId(Object element, Attributes attr) { | public void configureId(Object element, Attributes attr) { | ||||
String id = attr.getValue("id"); | String id = attr.getValue("id"); | ||||
if (id != null) { | if (id != null) { | ||||
project.addReference(id, element); | |||||
project.addIdReference(id, element); | |||||
} | } | ||||
} | } | ||||
@@ -1015,6 +1015,8 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
context.getCurrentTarget().addTask(task); | context.getCurrentTarget().addTask(task); | ||||
} | } | ||||
context.configureId(task, attrs); | |||||
// container.addTask(task); | // container.addTask(task); | ||||
// This is a nop in UE: task.init(); | // This is a nop in UE: task.init(); | ||||
@@ -491,6 +491,7 @@ public class Ant extends Task { | |||||
continue; | continue; | ||||
} | } | ||||
copyReference(key, key); | copyReference(key, key); | ||||
newProject.inheritIDReferences(getProject()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -5,10 +5,10 @@ | |||||
<target name="test-notcalled"> | <target name="test-notcalled"> | ||||
<!-- bug 36955 --> | <!-- bug 36955 --> | ||||
<au:expectfailure> | |||||
<pathconvert property="_output2" refid="ref1" | |||||
pathsep="${line.separator}" /> | |||||
</au:expectfailure> | |||||
<pathconvert property="_output2" refid="ref1" | |||||
pathsep="${line.separator}" /> | |||||
<echo>${_output2}</echo> | |||||
<au:assertLogContains text="Future versions of Ant"/> | |||||
</target> | </target> | ||||
<target name="test-macrodef-embedded-ref"> | <target name="test-macrodef-embedded-ref"> | ||||