Dear Ant users,
Here's an XSLT script which will give you a graphical view of the task dependencies in your ant build file.
See the attached postscript (.ps) file for an example of the end-result.
The process is as follows: 1. Creating a a build.dot file using the supplied build.xsl script 2. Compile this file with the GraphViz 'dot' program using the '-Tps' option to produce a PostScript file which depicts all the dependencies in the build.xml file graphically.
This is very useful to get a quick overview of the buildfile structure.
It requires: * graphviz -- open source and available from AT&T (binaries available for windows, linux and many other systems). * A postscript viewer (like ghostview -- available for many o/ses including windows and linux).
Would appreciate feedback on other utilities which can do the same thing possibly using Java only (graphviz is written in C or C++).
I'm aware of a jedit plugin, called AntViz; I haven't tried it out myself, though.
Suggestions are welcome.
Thanks,
Alec Noronha
============================================================== Save the following into a file called 'build.xsl': ----- START BUILD.XSL CODE ----- <!-- This stylesheet has been tested on Apache Xalan 2.5.0 -->
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" extension-element-prefixes="str">
<xsl:output method="text"/>
<!-- Variables for formatting --> <xsl:variable name="top"> <xsl:text> digraph build_xml_dependencies{ size="12,12"; shape="box";
start [color=yellowgreen, shape=tripleoctagon, label="START"];
</xsl:text> </xsl:variable>
<xsl:variable name="bottom">
<xsl:text>
} </xsl:text>
</xsl:variable>
<xsl:variable name="start_node">
start
</xsl:variable>
<xsl:variable name="join"> <xsl:text> -> </xsl:text> </xsl:variable>
<xsl:variable name="two_spaces"> <xsl:text> </xsl:text> </xsl:variable>
<xsl:variable name="end_of_sentence"> <xsl:text> ; </xsl:text> </xsl:variable>
<!-- Templates -->
<xsl:template match="project">
<xsl:choose>
<xsl:when test="not(function-available('str:tokenize'))">
<xsl:message terminate="yes">
ERROR: EXSLT - This stylesheet requires the exslt extension strings:tokenize.
</xsl:message>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$top"/>
<xsl:apply-templates select="target"/>
<xsl:value-of select="$bottom"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="target">
<xsl:choose>
<xsl:when test="not(attribute::depends)">
<xsl:value-of select="$two_spaces"/>
<xsl:value-of select="translate( attribute::name, '()-' , '___' )"/>
<xsl:value-of select="$join"/>
<xsl:value-of select="$start_node"/>
<xsl:value-of select="$end_of_sentence"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="dependency_loop">
<xsl:with-param name="dependency_list"
select="str:tokenize( translate( @depends, '()-' , '___' ), ' ,-' )" />
<xsl:with-param name="task_node"
select="translate( attribute::name, '()-' , '___' ) "/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="dependency_loop">
<xsl:param name="dependency_list"/>
<xsl:param name="task_node"/>
<xsl:for-each select="$dependency_list">
<xsl:value-of select="$two_spaces"/>
<xsl:value-of select="$task_node"/>
<xsl:value-of select="$join"/>
<xsl:value-of select="."/>
<xsl:value-of select="$end_of_sentence"/>
</xsl:for-each>
</xsl:template>
<!--
The <xsl:value-of select="."/> element in the middle of the named template will be replaced
by the contents of the current node from which this template was called.
-->
</xsl:stylesheet>
----- END BUILD.XSL CODE -----
Incorporate the following code into your 'build.xml' file.
Of course, you need to substitute your own directory names.
Note on the code below: for some reason, I had to place xalan.jar into the ant/lib directory to get the following working.
----- START ANT BUILD.XML CODE -----
<target name="view_dependencies" depends="prepare" description="Generate and view the dependency graph">
<echo message="Generating the dependency dot file ..."/> <xslt basedir="${basedir}" destdir="${build_dev_docs_dir}" extension=".dot" style="build.xsl" classpathref="xalan_classpath" processor="trax" includes="build.xml" />
<echo message="Compiling the dependency dot file ..."/>
<exec executable="${dot_file_compiler}"
dir="${build_dev_docs_dir}"
outputproperty="dotoutput"
resultproperty="dotresult"
failifexecutionfails="true"
failonerror="true">
<arg line="-Tps ${build_dev_docs_dir}/build.dot -o ${build_dev_docs_dir}/build.ps"/>
</exec>
<echo message="Invoking the gv ps viewer on the dependency file ..."/> <exec executable="${ps_viewer}" dir="${build_dev_docs_dir}" outputproperty="psoutput" resultproperty="psresult" failifexecutionfails="true" failonerror="true"> <arg line="${build_dev_docs_dir}/build.ps & "/> </exec>
</target>
----- END BUILD.XML CODE -----
----- BEGIN SAMPLE OUTPUT ----
ATTACHED: build.ps
Sample output in graphic form generated from my seminal build file.
----- END SAMPLE OUTPUT ----
==============================================================
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]