You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by pe...@apache.org on 2003/08/15 17:04:29 UTC
cvs commit: ant/src/main/org/apache/tools/ant/taskdefs MacroDef.java DefBase.java MacroInstance.java PreSetDef.java
peterreilly 2003/08/15 08:04:29
Modified: src/main/org/apache/tools/ant AntTypeDefinition.java
ComponentHelper.java UnknownElement.java
src/main/org/apache/tools/ant/taskdefs MacroDef.java
DefBase.java MacroInstance.java PreSetDef.java
Log:
* add equality and similar methods for the ant definitions
used to check if a new definition overriding a previous
definition is actually the same definition via a ant or
antcall command
* remove pointless check for antlib: in setUri
Revision Changes Path
1.6 +65 -2 ant/src/main/org/apache/tools/ant/AntTypeDefinition.java
Index: AntTypeDefinition.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/AntTypeDefinition.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AntTypeDefinition.java 15 Aug 2003 08:40:37 -0000 1.5
+++ AntTypeDefinition.java 15 Aug 2003 15:04:29 -0000 1.6
@@ -329,7 +329,7 @@
}
/**
- * Equality method for this definition
+ * Equality method for this definition (assumes the names are the same)
*
* @param other another definition
* @param project the project the definition
@@ -345,6 +345,69 @@
if (!(other.getTypeClass(project).equals(getTypeClass(project)))) {
return false;
}
- return other.getExposedClass(project).equals(getExposedClass(project));
+ if (!other.getExposedClass(project).equals(getExposedClass(project))) {
+ return false;
+ }
+ if (other.adapterClass != adapterClass) {
+ return false;
+ }
+ if (other.adaptToClass != adaptToClass) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Similar definition
+ * used to compare two definitions defined twice with the same
+ * name and the same types.
+ * the classloader may be different but have the same
+ * path so #sameDefinition cannot
+ * be used.
+ * @param other the definition to compare to
+ * @param project the current project
+ * @return true if the definitions are the same
+ */
+ public boolean similarDefinition(AntTypeDefinition other, Project project) {
+ if (other == null) {
+ return false;
+ }
+ if (getClass() != other.getClass()) {
+ return false;
+ }
+ if (!getClassName().equals(other.getClassName())) {
+ return false;
+ }
+ if (!extractClassname(adapterClass).equals(
+ extractClassname(other.adapterClass))) {
+ return false;
+ }
+ if (!extractClassname(adaptToClass).equals(
+ extractClassname(other.adaptToClass))) {
+ return false;
+ }
+ // all the names are the same: check if the class path of the loader
+ // is the same
+ ClassLoader oldLoader = other.getClassLoader();
+ ClassLoader newLoader = this.getClassLoader();
+ if (oldLoader != null
+ && newLoader != null
+ && oldLoader instanceof AntClassLoader
+ && newLoader instanceof AntClassLoader
+ && ((AntClassLoader) oldLoader).getClasspath()
+ .equals(((AntClassLoader) newLoader).getClasspath())
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private String extractClassname(Class c) {
+ if (c == null) {
+ return "<null>";
+ } else {
+ return c.getClass().getName();
+ }
}
}
1.25 +11 -13 ant/src/main/org/apache/tools/ant/ComponentHelper.java
Index: ComponentHelper.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/ComponentHelper.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- ComponentHelper.java 15 Aug 2003 08:40:37 -0000 1.24
+++ ComponentHelper.java 15 Aug 2003 15:04:29 -0000 1.25
@@ -670,21 +670,19 @@
if (sameDefinition(def, old)) {
return;
}
+ int logLevel = Project.MSG_WARN;
+ if (def.similarDefinition(old, project)) {
+ logLevel = Project.MSG_VERBOSE;
+ }
Class oldClass = antTypeTable.getExposedClass(name);
- if (oldClass != null && Task.class.isAssignableFrom(oldClass)) {
- int logLevel = Project.MSG_WARN;
- if (def.getClassName().equals(old.getClassName())
- && def.getClassLoader() == old.getClassLoader()) {
- logLevel = Project.MSG_VERBOSE;
- }
- project.log(
- "Trying to override old definition of task "
- + name, logLevel);
+ boolean isTask =
+ (oldClass != null && Task.class.isAssignableFrom(oldClass));
+ project.log(
+ "Trying to override old definition of "
+ + (isTask ? "task" : "datatype")
+ + " " + name, logLevel);
+ if (isTask) {
invalidateCreatedTasks(name);
- } else {
- project.log(
- "Trying to override old definition of datatype "
- + name, Project.MSG_WARN);
}
}
project.log(" +Datatype " + name + " " + def.getClassName(),
1.62 +48 -0 ant/src/main/org/apache/tools/ant/UnknownElement.java
Index: UnknownElement.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/UnknownElement.java,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -r1.61 -r1.62
--- UnknownElement.java 13 Aug 2003 13:44:26 -0000 1.61
+++ UnknownElement.java 15 Aug 2003 15:04:29 -0000 1.62
@@ -530,4 +530,52 @@
}
return false;
}
+
+ /**
+ * like contents equals, but ignores project
+ * @param obj the object to check against
+ * @return true if this unknownelement has the same contents the other
+ */
+ public boolean similar(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!getClass().getName().equals(obj.getClass().getName())) {
+ return false;
+ }
+ UnknownElement other = (UnknownElement) obj;
+ if (!equalsString(elementName, other.elementName)) {
+ return false;
+ }
+ if (!namespace.equals(other.namespace)) {
+ return false;
+ }
+ if (!qname.equals(other.qname)) {
+ return false;
+ }
+ if (!getWrapper().getAttributeMap().equals(
+ other.getWrapper().getAttributeMap())) {
+ return false;
+ }
+ if (children == null) {
+ return other.children == null;
+ }
+ if (children.size() != other.children.size()) {
+ return false;
+ }
+ for (int i = 0; i < children.size(); ++i) {
+ UnknownElement child = (UnknownElement) children.get(i);
+ if (!child.similar(other.children.get(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean equalsString(String a, String b) {
+ if (a == null) {
+ return b == null;
+ }
+ return a.equals(b);
+ }
}
1.4 +125 -8 ant/src/main/org/apache/tools/ant/taskdefs/MacroDef.java
Index: MacroDef.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/MacroDef.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MacroDef.java 15 Aug 2003 09:33:45 -0000 1.3
+++ MacroDef.java 15 Aug 2003 15:04:29 -0000 1.4
@@ -102,7 +102,7 @@
if (uri.equals(ProjectHelper.ANT_CORE_URI)) {
uri = "";
}
- if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
+ if (uri.startsWith("ant:")) {
throw new BuildException("Attempt to use a reserved URI " + uri);
}
this.uri = uri;
@@ -283,6 +283,7 @@
public static class Attribute {
private String name;
private String defaultValue;
+
/**
* The name of the attribute.
*
@@ -319,6 +320,35 @@
public String getDefault() {
return defaultValue;
}
+
+ /**
+ * equality method
+ *
+ * @param obj an <code>Object</code> value
+ * @return a <code>boolean</code> value
+ */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (obj.getClass() != getClass()) {
+ return false;
+ }
+ Attribute other = (Attribute) obj;
+ if (name == null) {
+ return other.name == null;
+ }
+ if (!name.equals(other.name)) {
+ return false;
+ }
+ if (defaultValue == null) {
+ return other.defaultValue == null;
+ }
+ if (!name.equals(other.defaultValue)) {
+ return false;
+ }
+ return true;
+ }
}
/**
@@ -364,6 +394,74 @@
public boolean isOptional() {
return optional;
}
+
+ /**
+ * equality method
+ *
+ * @param obj an <code>Object</code> value
+ * @return a <code>boolean</code> value
+ */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (obj.getClass() != getClass()) {
+ return false;
+ }
+ TemplateElement other = (TemplateElement) obj;
+ if (name == null) {
+ return other.name == null;
+ }
+ if (!name.equals(other.name)) {
+ return false;
+ }
+ return optional == other.optional;
+ }
+ }
+
+ /**
+ * equality method for macrodef, ignores project and
+ * runtime info.
+ *
+ * @param obj an <code>Object</code> value
+ * @return a <code>boolean</code> value
+ */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!obj.getClass().equals(getClass())) {
+ return false;
+ }
+ MacroDef other = (MacroDef) obj;
+ if (name == null) {
+ return other.name == null;
+ }
+ if (!name.equals(other.name)) {
+ return false;
+ }
+ if (uri == null || uri.equals("")
+ || uri.equals(ProjectHelper.ANT_CORE_URI)) {
+ return other.uri == null || other.uri.equals("")
+ || other.uri.equals(ProjectHelper.ANT_CORE_URI);
+ }
+ if (!uri.equals(other.uri)) {
+ return false;
+ }
+
+ if (attributeStyle != other.attributeStyle) {
+ return false;
+ }
+ if (!nestedTask.similar(other.nestedTask)) {
+ return false;
+ }
+ if (!attributes.equals(other.attributes)) {
+ return false;
+ }
+ if (!elements.equals(other.elements)) {
+ return false;
+ }
+ return true;
}
/**
@@ -372,15 +470,15 @@
* is given.
*/
private static class MyAntTypeDefinition extends AntTypeDefinition {
- private MacroDef template;
+ private MacroDef macroDef;
/**
* Creates a new <code>MyAntTypeDefinition</code> instance.
*
- * @param template a <code>MacroDef</code> value
+ * @param macroDef a <code>MacroDef</code> value
*/
- public MyAntTypeDefinition(MacroDef template) {
- this.template = template;
+ public MyAntTypeDefinition(MacroDef macroDef) {
+ this.macroDef = macroDef;
}
/**
@@ -394,20 +492,39 @@
if (o == null) {
return null;
}
- ((MacroInstance) o).setTemplate(template);
+ ((MacroInstance) o).setMacroDef(macroDef);
return o;
}
/**
* Equality method for this definition
- * This only checks for pointer equality.
*
* @param other another definition
* @param project the current project
* @return true if the definitions are the same
*/
public boolean sameDefinition(AntTypeDefinition other, Project project) {
- return this == other;
+ if (!super.sameDefinition(other, project)) {
+ return false;
+ }
+ MyAntTypeDefinition otherDef = (MyAntTypeDefinition) other;
+ return macroDef.equals(otherDef.macroDef);
+ }
+
+ /**
+ * Similiar method for this definition
+ *
+ * @param other another definition
+ * @param project the current project
+ * @return true if the definitions are the same
+ */
+ public boolean similarDefinition(
+ AntTypeDefinition other, Project project) {
+ if (!super.similarDefinition(other, project)) {
+ return false;
+ }
+ MyAntTypeDefinition otherDef = (MyAntTypeDefinition) other;
+ return macroDef.equals(otherDef.macroDef);
}
}
}
1.4 +1 -1 ant/src/main/org/apache/tools/ant/taskdefs/DefBase.java
Index: DefBase.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/DefBase.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- DefBase.java 14 Aug 2003 09:45:39 -0000 1.3
+++ DefBase.java 15 Aug 2003 15:04:29 -0000 1.4
@@ -93,7 +93,7 @@
if (uri.equals(ProjectHelper.ANT_CORE_URI)) {
uri = "";
}
- if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
+ if (uri.startsWith("ant:")) {
throw new BuildException("Attempt to use a reserved URI " + uri);
}
this.uri = uri;
1.4 +11 -11 ant/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java
Index: MacroInstance.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/MacroInstance.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- MacroInstance.java 15 Aug 2003 09:33:45 -0000 1.3
+++ MacroInstance.java 15 Aug 2003 15:04:29 -0000 1.4
@@ -80,7 +80,7 @@
* @since Ant 1.6
*/
public class MacroInstance extends Task implements DynamicConfigurator {
- private MacroDef template;
+ private MacroDef macroDef;
private Map map = new HashMap();
private Map elements = new HashMap();
private Hashtable localProperties = new Hashtable();
@@ -88,10 +88,10 @@
/**
* Called from MacroDef.MyAntTypeDefinition#create()
*
- * @param template a <code>MacroDef</code> value
+ * @param macroDef a <code>MacroDef</code> value
*/
- protected void setTemplate(MacroDef template) {
- this.template = template;
+ protected void setMacroDef(MacroDef macroDef) {
+ this.macroDef = macroDef;
}
/**
@@ -112,7 +112,7 @@
* has already been seen
*/
public Object createDynamicElement(String name) throws BuildException {
- if (template.getElements().get(name) == null) {
+ if (macroDef.getElements().get(name) == null) {
throw new BuildException("unsupported element " + name);
}
if (elements.get(name) != null) {
@@ -130,7 +130,7 @@
private List unknownElements = new ArrayList();
/**
- * Add an unknown element (to be snipped into the template instance)
+ * Add an unknown element (to be snipped into the macroDef instance)
*
* @param nestedTask an unknown element
*/
@@ -225,7 +225,7 @@
}
private String macroSubs(String s, Map macroMapping) {
- if (template.getAttributeStyle() == MacroDef.AttributeStyle.ANT) {
+ if (macroDef.getAttributeStyle() == MacroDef.AttributeStyle.ANT) {
return macroSubsAnt(s, macroMapping);
} else {
return macroSubsXPath(s, macroMapping);
@@ -259,7 +259,7 @@
UnknownElement unknownElement = (UnknownElement) r.getProxy();
String tag = unknownElement.getTag();
MacroDef.TemplateElement templateElement =
- (MacroDef.TemplateElement) template.getElements().get(tag);
+ (MacroDef.TemplateElement) macroDef.getElements().get(tag);
if (templateElement == null) {
UnknownElement child = copy(unknownElement);
rc.addChild(child.getWrapper());
@@ -294,9 +294,9 @@
public void execute() {
localProperties = new Hashtable();
Set copyKeys = new HashSet(map.keySet());
- for (int i = 0; i < template.getAttributes().size(); ++i) {
+ for (int i = 0; i < macroDef.getAttributes().size(); ++i) {
MacroDef.Attribute attribute =
- (MacroDef.Attribute) template.getAttributes().get(i);
+ (MacroDef.Attribute) macroDef.getAttributes().get(i);
String value = (String) map.get(attribute.getName());
if (value == null) {
value = attribute.getDefault();
@@ -315,7 +315,7 @@
}
// need to set the project on unknown element
- UnknownElement c = copy(template.getNestedTask());
+ UnknownElement c = copy(macroDef.getNestedTask());
c.init();
c.perform();
}
1.5 +40 -3 ant/src/main/org/apache/tools/ant/taskdefs/PreSetDef.java
Index: PreSetDef.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/PreSetDef.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- PreSetDef.java 15 Aug 2003 09:09:29 -0000 1.4
+++ PreSetDef.java 15 Aug 2003 15:04:29 -0000 1.5
@@ -99,7 +99,7 @@
if (uri.equals(ProjectHelper.ANT_CORE_URI)) {
uri = "";
}
- if (uri.startsWith("ant:") && !uri.startsWith("antlib:")) {
+ if (uri.startsWith("ant:")) {
throw new BuildException("Attempt to use a reserved URI " + uri);
}
this.uri = uri;
@@ -266,14 +266,51 @@
/**
* Equality method for this definition
- * This only checks for pointer equality.
*
* @param other another definition
* @param project the current project
* @return true if the definitions are the same
*/
public boolean sameDefinition(AntTypeDefinition other, Project project) {
- return this == other;
+ if (other == null) {
+ return false;
+ }
+ if (other.getClass() != getClass()) {
+ return false;
+ }
+ MyAntTypeDefinition otherDef = (MyAntTypeDefinition) other;
+ if (!parent.sameDefinition(otherDef.parent, project)) {
+ return false;
+ }
+ if (!element.similar(otherDef.element)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Similiar method for this definition
+ *
+ * @param other another definition
+ * @param project the current project
+ * @return true if the definitions are the same
+ */
+ public boolean similarDefinition(
+ AntTypeDefinition other, Project project) {
+ if (other == null) {
+ return false;
+ }
+ if (!other.getClass().getName().equals(getClass().getName())) {
+ return false;
+ }
+ MyAntTypeDefinition otherDef = (MyAntTypeDefinition) other;
+ if (!parent.similarDefinition(otherDef.parent, project)) {
+ return false;
+ }
+ if (!element.similar(otherDef.element)) {
+ return false;
+ }
+ return true;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org