git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271581 13f79535-47bb-0310-9956-ffa450edef68master
@@ -18,22 +18,19 @@ | |||||
location="${template.dir}/task_xdoc.template"/> | location="${template.dir}/task_xdoc.template"/> | ||||
<path id="xdoclet.classpath"> | |||||
<pathelement location="${log4j.jar}"/> | |||||
<pathelement location="${xdoclet.jar}"/> | |||||
<!-- javadoc is needed --> | |||||
<pathelement path="${java.class.path}"/> | |||||
<pathelement location="${build.dir}"/> | |||||
</path> | |||||
<taskdef name="document" | |||||
classname="xdoclet.doc.DocumentDocletTask" | |||||
classpathref="xdoclet.classpath"/> | |||||
<target name="init"> | <target name="init"> | ||||
<mkdir dir="${build.dir}" /> | <mkdir dir="${build.dir}" /> | ||||
<mkdir dir="${gen.dir}" /> | <mkdir dir="${gen.dir}" /> | ||||
<!-- hack, this should be outside a target but ${build.dir} gets stripped ?? --> | |||||
<path id="xdoclet.classpath"> | |||||
<pathelement location="${log4j.jar}"/> | |||||
<pathelement location="${xdoclet.jar}"/> | |||||
<!-- javadoc is needed --> | |||||
<pathelement path="${java.class.path}"/> | |||||
<pathelement location="${build.dir}"/> | |||||
</path> | |||||
</target> | </target> | ||||
@@ -49,6 +46,10 @@ | |||||
<target name="gen" depends="compile"> | <target name="gen" depends="compile"> | ||||
<delete dir="${gen.dir}"/> | <delete dir="${gen.dir}"/> | ||||
<taskdef name="document" | |||||
classname="xdoclet.doc.DocumentDocletTask" | |||||
classpathref="xdoclet.classpath"/> | |||||
<document sourcepath="${src.root}" | <document sourcepath="${src.root}" | ||||
destdir="${gen.dir}" | destdir="${gen.dir}" | ||||
classpathref="xdoclet.classpath"> | classpathref="xdoclet.classpath"> | ||||
@@ -56,7 +57,8 @@ | |||||
<include name="*.java" unless="class.name"/> | <include name="*.java" unless="class.name"/> | ||||
<include name="${class.name}.java" if="class.name"/> | <include name="${class.name}.java" if="class.name"/> | ||||
</fileset> | </fileset> | ||||
<template templateFile="${defaults.properties.template}" | |||||
<template subTaskClassName="org.apache.tools.ant.xdoclet.AntSubTask" | |||||
templateFile="${defaults.properties.template}" | |||||
destinationfile="defaults.properties"/> | destinationfile="defaults.properties"/> | ||||
<!-- <template templateFile="${xdoc.template}" | <!-- <template templateFile="${xdoc.template}" | ||||
destinationfile="{0}.xml" extent="concrete-type"/> --> | destinationfile="{0}.xml" extent="concrete-type"/> --> | ||||
@@ -83,15 +83,31 @@ public class AntSubTask extends TemplateSubTask { | |||||
* - and only throw BuildException if at all | * - and only throw BuildException if at all | ||||
*/ | */ | ||||
protected boolean matchesGenerationRules(ClassDoc clazz) throws XDocletException { | protected boolean matchesGenerationRules(ClassDoc clazz) throws XDocletException { | ||||
MethodDoc[] methods = clazz.methods(); | |||||
if (clazz.isAbstract()) { | if (clazz.isAbstract()) { | ||||
return false; | return false; | ||||
} | } | ||||
return isAntTask(clazz);; | |||||
} | |||||
/** | |||||
* @todo pull out to utility method | |||||
* @todo add more logic (like execute method signature) | |||||
*/ | |||||
public static final boolean isAntTask(ClassDoc clazz) { | |||||
if (clazz.isAbstract()) { | |||||
return false; | |||||
} | |||||
// no inner classes (for now - but is this possible? desired?) | |||||
if (clazz.containingClass() != null) { | |||||
return false; | |||||
} | |||||
MethodDoc[] methods = clazz.methods(); | |||||
for (int i = 0; i < methods.length; i++) { | for (int i = 0; i < methods.length; i++) { | ||||
if ("execute".equals(methods[i].name())) { | if ("execute".equals(methods[i].name())) { | ||||
System.out.println("Task: " + clazz.name()); | |||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
@@ -104,12 +120,17 @@ public class AntSubTask extends TemplateSubTask { | |||||
* default class name. | * default class name. | ||||
*/ | */ | ||||
protected String getGeneratedFileName(ClassDoc clazz) throws XDocletException { | protected String getGeneratedFileName(ClassDoc clazz) throws XDocletException { | ||||
PackageDoc pak = clazz.containingPackage(); | |||||
String packageName = PackageTagsHandler.packageNameAsPathFor(pak); | |||||
String taskName = AntTagsHandler.getTaskName(clazz); | |||||
String filename = MessageFormat.format(getDestinationFile(), new Object[]{taskName}); | |||||
String filename = getDestinationFile(); | |||||
String dir = getDestDir().getAbsolutePath(); | |||||
if (filename.indexOf("{0}") != -1) { | |||||
PackageDoc pak = clazz.containingPackage(); | |||||
dir = PackageTagsHandler.packageNameAsPathFor(pak); | |||||
String taskName = AntTagsHandler.getTaskName(clazz); | |||||
filename = MessageFormat.format(getDestinationFile(), new Object[]{taskName}); | |||||
} | |||||
return new File(packageName, filename).toString(); | |||||
return new File(dir, filename).toString(); | |||||
} | } | ||||
} | } |
@@ -57,6 +57,7 @@ import com.sun.javadoc.ClassDoc; | |||||
import com.sun.javadoc.MethodDoc; | import com.sun.javadoc.MethodDoc; | ||||
import xdoclet.XDocletException; | import xdoclet.XDocletException; | ||||
import xdoclet.XDocletTagSupport; | import xdoclet.XDocletTagSupport; | ||||
import xdoclet.tags.AbstractProgramElementTagsHandler; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
@@ -80,6 +81,24 @@ import java.util.Properties; | |||||
*/ | */ | ||||
public class AntTagsHandler extends XDocletTagSupport { | public class AntTagsHandler extends XDocletTagSupport { | ||||
/** | |||||
* @todo add check for execute method | |||||
*/ | |||||
public void forAllTasks(String template, Properties attributes) throws XDocletException { | |||||
ClassDoc[] classes = AbstractProgramElementTagsHandler.getAllClasses(); | |||||
ClassDoc cur_class = null; | |||||
for (int i = 0; i < classes.length; i++) { | |||||
cur_class = classes[i]; | |||||
setCurrentClass(cur_class); | |||||
if (AntSubTask.isAntTask(cur_class)) { | |||||
generate(template); | |||||
} | |||||
} | |||||
} | |||||
/** | /** | ||||
* Iterates over all Ant attributes. | * Iterates over all Ant attributes. | ||||
* | * | ||||
@@ -120,21 +139,22 @@ public class AntTagsHandler extends XDocletTagSupport { | |||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Provides the element name for the current method | * Provides the element name for the current method | ||||
*/ | */ | ||||
public String elementName() throws XDocletException { | public String elementName() throws XDocletException { | ||||
String methodName = getCurrentMethod().name(); | String methodName = getCurrentMethod().name(); | ||||
System.out.println(">>>> " + methodName); | |||||
String elementName = "<not a valid element>"; | String elementName = "<not a valid element>"; | ||||
if (methodName.startsWith("addConfigured")) { | if (methodName.startsWith("addConfigured")) { | ||||
elementName = methodName.substring(13,methodName.length()); | |||||
} else if (methodName.startsWith("add")) { | |||||
elementName = methodName.substring(3,methodName.length()); | |||||
} else if (methodName.startsWith("create")) { | |||||
elementName = methodName.substring(6,methodName.length()); | |||||
elementName = methodName.substring(13, methodName.length()); | |||||
} | |||||
else if (methodName.startsWith("add")) { | |||||
elementName = methodName.substring(3, methodName.length()); | |||||
} | |||||
else if (methodName.startsWith("create")) { | |||||
elementName = methodName.substring(6, methodName.length()); | |||||
} | } | ||||
System.out.println(" = " + elementName); | |||||
return elementName.toLowerCase(); | return elementName.toLowerCase(); | ||||
} | } | ||||
@@ -1,5 +1,4 @@ | |||||
<XDtTagDef:tagDef namespace="Ant" handler="org.apache.tools.ant.xdoclet.AntTagsHandler"/> | <XDtTagDef:tagDef namespace="Ant" handler="org.apache.tools.ant.xdoclet.AntTagsHandler"/> | ||||
<!-- @todo: add forAllTasks --> | |||||
<XDtClass:forAllClasses> | |||||
<XDtAnt:forAllTasks> | |||||
<XDtAnt:taskName/>=<XDtClass:fullClassName/> | <XDtAnt:taskName/>=<XDtClass:fullClassName/> | ||||
</XDtClass:forAllClasses> | |||||
</XDtAnt:forAllTasks> |