Browse Source

Adapt DTD to recent changes (types can be specified in targets and the

TaskContainer concept).


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269390 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 24 years ago
parent
commit
6c36c507ed
2 changed files with 67 additions and 33 deletions
  1. +8
    -0
      src/main/org/apache/tools/ant/IntrospectionHelper.java
  2. +59
    -33
      src/main/org/apache/tools/ant/taskdefs/AntStructure.java

+ 8
- 0
src/main/org/apache/tools/ant/IntrospectionHelper.java View File

@@ -132,6 +132,14 @@ public class IntrospectionHelper implements BuildListener {
continue;
}
// hide addTask for TaskContainers
if (org.apache.tools.ant.TaskContainer.class.isAssignableFrom(bean)
&& args.length == 1 && "addTask".equals(name)
&& org.apache.tools.ant.Task.class.equals(args[0])) {
continue;
}

if ("addText".equals(name)
&& java.lang.Void.TYPE.equals(returnType)
&& args.length == 1


+ 59
- 33
src/main/org/apache/tools/ant/taskdefs/AntStructure.java View File

@@ -58,6 +58,7 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.IntrospectionHelper;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.TaskContainer;
import org.apache.tools.ant.types.EnumeratedAttribute;

import java.util.Enumeration;
@@ -69,12 +70,18 @@ import java.io.*;
* Creates a partial DTD for Ant from the currently known tasks.
*
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*
* @version $Revision$
*/

public class AntStructure extends Task {

private final String lSep = System.getProperty("line.separator");

private final String BOOLEAN = "%boolean;";
private final String TASKS = "%tasks;";
private final String TYPES = "%types;";

private Hashtable visited = new Hashtable();

private File output;
@@ -95,10 +102,10 @@ public class AntStructure extends Task {
PrintWriter out = null;
try {
try {
out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(output), "ISO8859_1"));
out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(output), "UTF8"));
} catch (UnsupportedEncodingException ue) {
/*
* Plain impossible with ISO8859_1, see
* Plain impossible with UTF8, see
* http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html
*
* fallback to platform specific anyway.
@@ -106,26 +113,21 @@ public class AntStructure extends Task {
out = new PrintWriter(new FileWriter(output));
}
Enumeration dataTypes = project.getDataTypeDefinitions().keys();
printHead(out, dataTypes);
printHead(out, project.getTaskDefinitions().keys(),
project.getDataTypeDefinitions().keys());

Vector tasks = new Vector();
Enumeration enum = project.getTaskDefinitions().keys();
while (enum.hasMoreElements()) {
String taskName = (String) enum.nextElement();
tasks.addElement(taskName);
}
printTargetDecl(out, tasks);
printTargetDecl(out);

dataTypes = project.getDataTypeDefinitions().keys();
Enumeration dataTypes = project.getDataTypeDefinitions().keys();
while (dataTypes.hasMoreElements()) {
String typeName = (String) dataTypes.nextElement();
printElementDecl(out, typeName,
(Class) project.getDataTypeDefinitions().get(typeName));
}
for (int i=0; i<tasks.size(); i++) {
String taskName = (String) tasks.elementAt(i);
Enumeration tasks = project.getTaskDefinitions().keys();
while (tasks.hasMoreElements()) {
String taskName = (String) tasks.nextElement();
printElementDecl(out, taskName,
(Class) project.getTaskDefinitions().get(taskName));
}
@@ -142,17 +144,39 @@ public class AntStructure extends Task {
}
}

private void printHead(PrintWriter out, Enumeration enum) {
out.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>");
private void printHead(PrintWriter out, Enumeration tasks,
Enumeration types) {
out.println("<?xml version=\"1.0\" ?>");
out.println("<!ENTITY % boolean \"(true|false|on|off|yes|no)\">");
out.println("");
out.print("<!ELEMENT project (target | property | taskdef");
while (enum.hasMoreElements()) {
String typeName = (String) enum.nextElement();
out.print(" | "+typeName);
out.print("<!ENTITY % tasks \"");
boolean first = true;
while (tasks.hasMoreElements()) {
String taskName = (String) tasks.nextElement();
if (!first) {
out.print(" | ");
} else {
first = false;
}
out.print(taskName);
}
out.println("\">");
out.print("<!ENTITY % types \"");
first = true;
while (types.hasMoreElements()) {
String typeName = (String) types.nextElement();
if (!first) {
out.print(" | ");
} else {
first = false;
}
out.print(typeName);
}
out.println("\">");

out.println("");
out.print("<!ELEMENT project (target | property | taskdef | ");
out.print(TYPES);
out.println(")*>");
out.println("<!ATTLIST project");
out.println(" name CDATA #REQUIRED");
@@ -161,16 +185,11 @@ public class AntStructure extends Task {
out.println("");
}

private void printTargetDecl(PrintWriter out, Vector tasks) {
private void printTargetDecl(PrintWriter out) {
out.print("<!ELEMENT target (");
for (int i=0; i<tasks.size(); i++) {
String taskName = (String) tasks.elementAt(i);
if (i > 0) {
out.print(" | ");
}
out.print(taskName);
}
out.print(TASKS);
out.print(" | ");
out.print(TYPES);
out.println(")*>");
out.println("");

@@ -222,6 +241,10 @@ public class AntStructure extends Task {
v.addElement("#PCDATA");
}

if (TaskContainer.class.isAssignableFrom(element)) {
v.addElement(TASKS);
}

Enumeration enum = ih.getNestedElements();
while (enum.hasMoreElements()) {
v.addElement((String) enum.nextElement());
@@ -258,7 +281,7 @@ public class AntStructure extends Task {
Class type = ih.getAttributeType(attrName);
if (type.equals(java.lang.Boolean.class) ||
type.equals(java.lang.Boolean.TYPE)) {
sb.append("%boolean; ");
sb.append(BOOLEAN).append(" ");
} else if (org.apache.tools.ant.types.Reference.class.isAssignableFrom(type)) {
sb.append("IDREF ");
} else if (org.apache.tools.ant.types.EnumeratedAttribute.class.isAssignableFrom(type)) {
@@ -295,7 +318,10 @@ public class AntStructure extends Task {

for (int i=0; i<v.size(); i++) {
String nestedName = (String) v.elementAt(i);
if (!"#PCDATA".equals(nestedName)) {
if (!"#PCDATA".equals(nestedName) &&
!TASKS.equals(nestedName) &&
!TYPES.equals(nestedName)
) {
printElementDecl(out, nestedName, ih.getElementType(nestedName));
}
}


Loading…
Cancel
Save