ant-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From alec <...@emirates.net.ae>
Subject *USEFUL* Stylesheet to generate a task-dependency graph for ant.
Date Sat, 11 Oct 2003 15:10:24 GMT
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  &amp;  "/>
    </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 ----

==============================================================



Mime
View raw message