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]

Reply via email to