Author: peterreilly
Date: Tue Oct 17 14:33:42 2006
New Revision: 465065
URL: http://svn.apache.org/viewvc?view=rev&rev=465065
Log:
add fall-back for undefined references that are parsed
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/src/main/org/apache/tools/ant/Project.java
ant/core/trunk/src/main/org/apache/tools/ant/UnknownElement.java
ant/core/trunk/src/main/org/apache/tools/ant/helper/AntXMLContext.java
ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Ant.java
ant/core/trunk/src/tests/antunit/types/defer-reference-test.xml
Modified: ant/core/trunk/WHATSNEW
URL:
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Oct 17 14:33:42 2006
@@ -16,6 +16,9 @@
of Watchdog, ExecuteWatchdog and ExecuteJava, which could reduce the
occurence
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
=============================================
Modified: ant/core/trunk/src/main/org/apache/tools/ant/Project.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/Project.java?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/Project.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/Project.java Tue Oct 17
14:33:42 2006
@@ -33,6 +33,7 @@
import java.util.Vector;
import java.util.Set;
import java.util.HashSet;
+import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import org.apache.tools.ant.input.DefaultInputHandler;
@@ -61,6 +62,8 @@
*
*/
public class Project implements ResourceFactory {
+ private static final String LINE_SEP =
System.getProperty("line.separator");
+
/** Message priority of "error". */
public static final int MSG_ERR = 0;
/** Message priority of "warning". */
@@ -136,6 +139,12 @@
/** Map of references within the project (paths etc) (String to Object). */
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. */
private String defaultTarget;
@@ -1815,6 +1824,46 @@
}
/**
+ * 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.
*
* @param referenceName The name of the reference. Must not be
<code>null</code>.
@@ -1856,7 +1905,12 @@
* there is no such reference in the project.
*/
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);
}
/**
Modified: ant/core/trunk/src/main/org/apache/tools/ant/UnknownElement.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/UnknownElement.java?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/UnknownElement.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/UnknownElement.java Tue Oct 17
14:33:42 2006
@@ -19,8 +19,10 @@
package org.apache.tools.ant;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.io.IOException;
import org.apache.tools.ant.taskdefs.PreSetDef;
@@ -620,5 +622,46 @@
private static boolean equalsString(String a, String 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;
}
}
Modified: ant/core/trunk/src/main/org/apache/tools/ant/helper/AntXMLContext.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/helper/AntXMLContext.java?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/helper/AntXMLContext.java
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/helper/AntXMLContext.java Tue
Oct 17 14:33:42 2006
@@ -268,7 +268,7 @@
public void configureId(Object element, Attributes attr) {
String id = attr.getValue("id");
if (id != null) {
- project.addReference(id, element);
+ project.addIdReference(id, element);
}
}
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java Tue
Oct 17 14:33:42 2006
@@ -1015,6 +1015,8 @@
context.getCurrentTarget().addTask(task);
}
+ context.configureId(task, attrs);
+
// container.addTask(task);
// This is a nop in UE: task.init();
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Ant.java
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Ant.java?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Ant.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Ant.java Tue Oct 17
14:33:42 2006
@@ -491,6 +491,7 @@
continue;
}
copyReference(key, key);
+ newProject.inheritIDReferences(getProject());
}
}
}
Modified: ant/core/trunk/src/tests/antunit/types/defer-reference-test.xml
URL:
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/types/defer-reference-test.xml?view=diff&rev=465065&r1=465064&r2=465065
==============================================================================
--- ant/core/trunk/src/tests/antunit/types/defer-reference-test.xml (original)
+++ ant/core/trunk/src/tests/antunit/types/defer-reference-test.xml Tue Oct 17
14:33:42 2006
@@ -5,10 +5,10 @@
<target name="test-notcalled">
<!-- 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 name="test-macrodef-embedded-ref">
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]