|
|
@@ -64,20 +64,19 @@ import org.apache.tools.ant.BuildException; |
|
|
|
import org.apache.tools.ant.ComponentHelper; |
|
|
|
import org.apache.tools.ant.Project; |
|
|
|
import org.apache.tools.ant.ProjectHelper; |
|
|
|
import org.apache.tools.ant.RuntimeConfigurable; |
|
|
|
import org.apache.tools.ant.Task; |
|
|
|
import org.apache.tools.ant.TaskContainer; |
|
|
|
import org.apache.tools.ant.UnknownElement; |
|
|
|
|
|
|
|
import org.apache.tools.ant.types.EnumeratedAttribute; |
|
|
|
|
|
|
|
/** |
|
|
|
* Describe class <code>MacroDef</code> here. |
|
|
|
* |
|
|
|
* @author Peter Reilly |
|
|
|
* @since Ant 1.6 |
|
|
|
*/ |
|
|
|
public class MacroDef extends AntlibDefinition implements TaskContainer { |
|
|
|
private UnknownElement nestedTask; |
|
|
|
public class MacroDef extends AntlibDefinition { |
|
|
|
private NestedSequential nestedSequential; |
|
|
|
private String name; |
|
|
|
private List attributes = new ArrayList(); |
|
|
|
private Map elements = new HashMap(); |
|
|
@@ -91,26 +90,81 @@ public class MacroDef extends AntlibDefinition implements TaskContainer { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Add a nested task to ExtendType |
|
|
|
* @param nestedTask Nested task/type to extend |
|
|
|
* This is the sequential nested element of the macrodef. |
|
|
|
* |
|
|
|
* @return a sequential element to be configured. |
|
|
|
*/ |
|
|
|
public void addTask(Task nestedTask) { |
|
|
|
if (this.nestedTask != null) { |
|
|
|
public NestedSequential createSequential() { |
|
|
|
if (this.nestedSequential != null) { |
|
|
|
throw new BuildException("Only one sequential allowed"); |
|
|
|
} |
|
|
|
UnknownElement ue = (UnknownElement) nestedTask; |
|
|
|
if (!ue.getNamespace().equals("") |
|
|
|
|| !ue.getTag().equals("sequential")) { |
|
|
|
throw new BuildException("Unsupported tag " + ue.getQName()); |
|
|
|
this.nestedSequential = new NestedSequential(); |
|
|
|
return this.nestedSequential; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* The class corresponding to the sequential nested element. |
|
|
|
* This is a simple task container. |
|
|
|
*/ |
|
|
|
public static class NestedSequential implements TaskContainer { |
|
|
|
private List nested = new ArrayList(); |
|
|
|
|
|
|
|
/** |
|
|
|
* Add a task or type to the container. |
|
|
|
* |
|
|
|
* @param task an unknown element. |
|
|
|
*/ |
|
|
|
public void addTask(Task task) { |
|
|
|
nested.add(task); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @return the list of unknown elements |
|
|
|
*/ |
|
|
|
public List getNested() { |
|
|
|
return nested; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* A compare function to compare this with another |
|
|
|
* NestedSequential. |
|
|
|
* It calls similar on the nested unknown elements. |
|
|
|
* |
|
|
|
* @param other the nested sequential to compare with. |
|
|
|
* @return true if they are similar, false otherwise |
|
|
|
*/ |
|
|
|
public boolean similar(NestedSequential other) { |
|
|
|
if (nested.size() != other.nested.size()) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
for (int i = 0; i < nested.size(); ++i) { |
|
|
|
UnknownElement me = (UnknownElement) nested.get(i); |
|
|
|
UnknownElement o = (UnknownElement) other.nested.get(i); |
|
|
|
if (!me.similar(o)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
this.nestedTask = ue; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @return the nested task |
|
|
|
* Convert the nested sequential to an unknown element |
|
|
|
* @return the nested sequential as an unknown element. |
|
|
|
*/ |
|
|
|
public UnknownElement getNestedTask() { |
|
|
|
return nestedTask; |
|
|
|
UnknownElement ret = new UnknownElement("sequential"); |
|
|
|
ret.setTaskName("sequential"); |
|
|
|
ret.setNamespace(""); |
|
|
|
ret.setQName("sequential"); |
|
|
|
new RuntimeConfigurable(ret, "sequential"); |
|
|
|
for (int i = 0; i < nestedSequential.getNested().size(); ++i) { |
|
|
|
UnknownElement e = |
|
|
|
(UnknownElement) nestedSequential.getNested().get(i); |
|
|
|
ret.addChild(e); |
|
|
|
ret.getWrapper().addChild(e.getWrapper()); |
|
|
|
} |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -188,8 +242,8 @@ public class MacroDef extends AntlibDefinition implements TaskContainer { |
|
|
|
* |
|
|
|
*/ |
|
|
|
public void execute() { |
|
|
|
if (nestedTask == null) { |
|
|
|
throw new BuildException("Missing nested element"); |
|
|
|
if (nestedSequential == null) { |
|
|
|
throw new BuildException("Missing sequential element"); |
|
|
|
} |
|
|
|
if (name == null) { |
|
|
|
throw new BuildException("Name not specified"); |
|
|
@@ -387,7 +441,7 @@ public class MacroDef extends AntlibDefinition implements TaskContainer { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!nestedTask.similar(other.nestedTask)) { |
|
|
|
if (!nestedSequential.similar(other.nestedSequential)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (!attributes.equals(other.attributes)) { |
|
|
|