git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@721698 13f79535-47bb-0310-9956-ffa450edef68master
@@ -525,9 +525,7 @@ public abstract class ArchiveFileSet extends FileSet { | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (src != null) { | if (src != null) { | ||||
stk.push(src); | |||||
invokeCircularReferenceCheck(src, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(src, stk, p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -171,6 +171,26 @@ public abstract class DataType extends ProjectComponent implements Cloneable { | |||||
dt.dieOnCircularReference(stk, p); | dt.dieOnCircularReference(stk, p); | ||||
} | } | ||||
/** | |||||
* Allow DataTypes outside org.apache.tools.ant.types to indirectly call | |||||
* dieOnCircularReference on nested DataTypes. | |||||
* | |||||
* <p>Pushes dt on the stack, runs dieOnCircularReference and pops | |||||
* it again.</p> | |||||
* @param dt the DataType to check. | |||||
* @param stk the stack of references to check. | |||||
* @param p the project to use to dereference the references. | |||||
* @throws BuildException on error. | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public static void pushAndInvokeCircularReferenceCheck(DataType dt, | |||||
Stack stk, | |||||
Project p) { | |||||
stk.push(dt); | |||||
dt.dieOnCircularReference(stk, p); | |||||
stk.pop(); | |||||
} | |||||
/** | /** | ||||
* Performs the check for circular references and returns the | * Performs the check for circular references and returns the | ||||
* referenced object. | * referenced object. | ||||
@@ -478,9 +478,7 @@ public class Path extends DataType implements Cloneable, ResourceCollection { | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (union != null) { | if (union != null) { | ||||
stk.push(union); | |||||
invokeCircularReferenceCheck(union, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(union, stk, p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -461,14 +461,10 @@ public class XMLCatalog extends DataType | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (classpath != null) { | if (classpath != null) { | ||||
stk.push(classpath); | |||||
invokeCircularReferenceCheck(classpath, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(classpath, stk, p); | |||||
} | } | ||||
if (catalogPath != null) { | if (catalogPath != null) { | ||||
stk.push(catalogPath); | |||||
invokeCircularReferenceCheck(catalogPath, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(catalogPath, stk, p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -183,15 +183,10 @@ public class Archives extends DataType | |||||
if (isReference()) { | if (isReference()) { | ||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
checkForCircularReference(zips, stk, p); | |||||
checkForCircularReference(tars, stk, p); | |||||
pushAndInvokeCircularReferenceCheck(zips, stk, p); | |||||
pushAndInvokeCircularReferenceCheck(tars, stk, p); | |||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
} | } | ||||
protected void checkForCircularReference(DataType t, Stack stk, Project p) { | |||||
stk.push(t); | |||||
invokeCircularReferenceCheck(t, stk, p); | |||||
stk.pop(); | |||||
} | |||||
} | } |
@@ -185,9 +185,7 @@ public abstract class BaseResourceCollectionContainer | |||||
for (Iterator i = rc.iterator(); i.hasNext();) { | for (Iterator i = rc.iterator(); i.hasNext();) { | ||||
Object o = i.next(); | Object o = i.next(); | ||||
if (o instanceof DataType) { | if (o instanceof DataType) { | ||||
stk.push(o); | |||||
invokeCircularReferenceCheck((DataType) o, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p); | |||||
} | } | ||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
@@ -147,9 +147,7 @@ public abstract class BaseResourceCollectionWrapper | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (rc instanceof DataType) { | if (rc instanceof DataType) { | ||||
stk.push(rc); | |||||
invokeCircularReferenceCheck((DataType) rc, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) rc, stk, p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -161,14 +161,10 @@ public class MappedResourceCollection | |||||
} else { | } else { | ||||
checkInitialized(); | checkInitialized(); | ||||
if (mapper != null) { | if (mapper != null) { | ||||
stk.push(mapper); | |||||
invokeCircularReferenceCheck(mapper, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(mapper, stk, p); | |||||
} | } | ||||
if (nested instanceof DataType) { | if (nested instanceof DataType) { | ||||
stk.push(nested); | |||||
invokeCircularReferenceCheck((DataType) nested, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) nested, stk, p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -209,9 +209,7 @@ public abstract class ResourceDecorator extends Resource { | |||||
if (isReference()) { | if (isReference()) { | ||||
super.dieOnCircularReference(stack, project); | super.dieOnCircularReference(stack, project); | ||||
} else { | } else { | ||||
stack.push(resource); | |||||
invokeCircularReferenceCheck(resource, stack, project); | |||||
stack.pop(); | |||||
pushAndInvokeCircularReferenceCheck(resource, stack, project); | |||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
} | } | ||||
@@ -208,7 +208,7 @@ public class Resources extends DataType implements ResourceCollection { | |||||
for (Iterator i = getNested().iterator(); i.hasNext();) { | for (Iterator i = getNested().iterator(); i.hasNext();) { | ||||
Object o = i.next(); | Object o = i.next(); | ||||
if (o instanceof DataType) { | if (o instanceof DataType) { | ||||
invokeCircularReferenceCheck((DataType) o, stk, p); | |||||
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p); | |||||
} | } | ||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
@@ -157,9 +157,7 @@ outer: for (Iterator ri = w.getResourceCollection().iterator(); ri.hasNext( | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
if (!isReference()) { | if (!isReference()) { | ||||
stk.push(w); | |||||
invokeCircularReferenceCheck(w, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck(w, stk, p); | |||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
} | } | ||||
@@ -144,9 +144,7 @@ public class Sort extends BaseResourceCollectionWrapper { | |||||
if (isReference()) { | if (isReference()) { | ||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
stk.push(comp); | |||||
DataType.invokeCircularReferenceCheck(comp, stk, p); | |||||
stk.pop(); | |||||
DataType.pushAndInvokeCircularReferenceCheck(comp, stk, p); | |||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
} | } | ||||
@@ -121,9 +121,8 @@ public class Tokens extends BaseResourceCollectionWrapper { | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (tokenizer instanceof DataType) { | if (tokenizer instanceof DataType) { | ||||
stk.push(tokenizer); | |||||
invokeCircularReferenceCheck((DataType) tokenizer, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) tokenizer, stk, | |||||
p); | |||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
@@ -114,9 +114,8 @@ s. | |||||
for (Iterator i = v.iterator(); i.hasNext();) { | for (Iterator i = v.iterator(); i.hasNext();) { | ||||
Object o = i.next(); | Object o = i.next(); | ||||
if (o instanceof DataType) { | if (o instanceof DataType) { | ||||
stk.push(o); | |||||
invokeCircularReferenceCheck((DataType) o, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) o, stk, | |||||
p); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -137,13 +137,9 @@ public class Compare extends DataType implements ResourceSelector { | |||||
super.dieOnCircularReference(stk, p); | super.dieOnCircularReference(stk, p); | ||||
} else { | } else { | ||||
if (control != null) { | if (control != null) { | ||||
stk.push(control); | |||||
DataType.invokeCircularReferenceCheck(control, stk, p); | |||||
stk.pop(); | |||||
DataType.pushAndInvokeCircularReferenceCheck(control, stk, p); | |||||
} | } | ||||
stk.push(comp); | |||||
DataType.invokeCircularReferenceCheck(comp, stk, p); | |||||
stk.pop(); | |||||
DataType.pushAndInvokeCircularReferenceCheck(comp, stk, p); | |||||
setChecked(true); | setChecked(true); | ||||
} | } | ||||
} | } | ||||
@@ -118,9 +118,7 @@ public class ResourceSelectorContainer extends DataType { | |||||
for (Iterator i = v.iterator(); i.hasNext();) { | for (Iterator i = v.iterator(); i.hasNext();) { | ||||
Object o = i.next(); | Object o = i.next(); | ||||
if (o instanceof DataType) { | if (o instanceof DataType) { | ||||
stk.push(o); | |||||
invokeCircularReferenceCheck((DataType) o, stk, p); | |||||
stk.pop(); | |||||
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p); | |||||
} | } | ||||
} | } | ||||
setChecked(true); | setChecked(true); | ||||