PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269587 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -6,7 +6,7 @@ | |||||
| <!-- ====================================================================== | <!-- ====================================================================== | ||||
| Stylesheet to transform an XML file generated by the Ant MAudit task into | |||||
| Stylesheet to transform an XML file generated by the Ant JUnit task into | |||||
| a set of JavaDoc-like HTML page to make pages more convenient to be browsed. | a set of JavaDoc-like HTML page to make pages more convenient to be browsed. | ||||
| It use the Xalan redirect extension to write to multiple output files. | It use the Xalan redirect extension to write to multiple output files. | ||||
| @@ -14,8 +14,8 @@ | |||||
| Note: HTML output can be made much more clean by removing non css attributes | Note: HTML output can be made much more clean by removing non css attributes | ||||
| ====================================================================== --> | ====================================================================== --> | ||||
| <xsl:output method="html" indent="yes"/> | |||||
| <xsl:decimal-format decimal-separator="." grouping-separator="," /> | |||||
| <xsl:output method="html" indent="yes"/> | |||||
| <xsl:decimal-format decimal-separator="." grouping-separator=","/> | |||||
| <!-- | <!-- | ||||
| Xalan redirect extension writes relative file based on the parent directory | Xalan redirect extension writes relative file based on the parent directory | ||||
| @@ -27,7 +27,7 @@ | |||||
| This has to be invoked as follows from the command line: | This has to be invoked as follows from the command line: | ||||
| java -classpath bsf.jar;xalan.jar;xerces.jar org.apache.xalan.xslt.Process -IN testsuites.xml -XSL maudit.xsl -PARAM output.dir './report' | |||||
| java -classpath bsf.jar;xalan.jar;xerces.jar org.apache.xalan.xslt.Process -IN testsuites.xml -XSL junit-frames.xsl -PARAM output.dir './report' | |||||
| --> | --> | ||||
| <xsl:param name="output.dir" select="'.'"/> | <xsl:param name="output.dir" select="'.'"/> | ||||
| @@ -98,61 +98,72 @@ | |||||
| </xsl:template> | </xsl:template> | ||||
| <xsl:template name="index.html"> | <xsl:template name="index.html"> | ||||
| <HTML> | |||||
| <HEAD><TITLE>Unit Test Results.</TITLE></HEAD> | |||||
| <FRAMESET cols="20%,80%"> | |||||
| <FRAMESET rows="30%,70%"> | |||||
| <FRAME src="overview-frame.html" name="packageListFrame"/> | |||||
| <FRAME src="allclasses-frame.html" name="classListFrame"/> | |||||
| </FRAMESET> | |||||
| <FRAME src="overview-summary.html" name="classFrame"/> | |||||
| </FRAMESET> | |||||
| <html> | |||||
| <head> | |||||
| <title>Unit Test Results.</title> | |||||
| </head> | |||||
| <frameset cols="20%,80%"> | |||||
| <frameset rows="30%,70%"> | |||||
| <frame src="overview-frame.html" name="packageListFrame"/> | |||||
| <frame src="allclasses-frame.html" name="classListFrame"/> | |||||
| </frameset> | |||||
| <frame src="overview-summary.html" name="classFrame"/> | |||||
| </frameset> | |||||
| <noframes> | <noframes> | ||||
| <H2>Frame Alert</H2> | |||||
| <P> | |||||
| <h2>Frame Alert</h2> | |||||
| <p> | |||||
| This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. | This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. | ||||
| </P> | |||||
| </p> | |||||
| </noframes> | </noframes> | ||||
| </HTML> | |||||
| </html> | |||||
| </xsl:template> | </xsl:template> | ||||
| <!-- this is the stylesheet css to use for nearly everything --> | <!-- this is the stylesheet css to use for nearly everything --> | ||||
| <xsl:template name="stylesheet.css"> | <xsl:template name="stylesheet.css"> | ||||
| BODY { | |||||
| body { | |||||
| font:normal 68% verdana,arial,helvetica; | font:normal 68% verdana,arial,helvetica; | ||||
| color:#000000; | color:#000000; | ||||
| } | } | ||||
| TD { | |||||
| FONT-SIZE: 68% | |||||
| td { | |||||
| font-size: 68% | |||||
| } | } | ||||
| P { | |||||
| p { | |||||
| line-height:1.5em; | line-height:1.5em; | ||||
| margin-top:0.5em; margin-bottom:1.0em; | margin-top:0.5em; margin-bottom:1.0em; | ||||
| } | } | ||||
| H1 { | |||||
| MARGIN: 0px 0px 5px; FONT: 165% verdana,arial,helvetica | |||||
| h1 { | |||||
| margin: 0px 0px 5px; | |||||
| font: 165% verdana,arial,helvetica | |||||
| } | } | ||||
| H2 { | |||||
| MARGIN-TOP: 1em; MARGIN-BOTTOM: 0.5em; FONT: bold 125% verdana,arial,helvetica | |||||
| h2 { | |||||
| margin-top: 1em; | |||||
| margin-bottom: 0.5em; | |||||
| font: bold 125% verdana,arial,helvetica | |||||
| } | } | ||||
| H3 { | |||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 115% verdana,arial,helvetica | |||||
| h3 { | |||||
| margin-bottom: 0.5em; | |||||
| font: bold 115% verdana,arial,helvetica | |||||
| } | } | ||||
| H4 { | |||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | |||||
| h4 { | |||||
| margin-bottom: 0.5em; | |||||
| font: bold 100% verdana,arial,helvetica | |||||
| } | } | ||||
| H5 { | |||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | |||||
| h5 { | |||||
| margin-bottom: 0.5em; | |||||
| font: bold 100% verdana,arial,helvetica | |||||
| } | } | ||||
| H6 { | |||||
| MARGIN-BOTTOM: 0.5em; FONT: bold 100% verdana,arial,helvetica | |||||
| h6 { | |||||
| margin-bottom: 0.5em; | |||||
| font: bold 100% verdana,arial,helvetica | |||||
| } | } | ||||
| .Error { | .Error { | ||||
| font-weight:bold; color:red; | |||||
| font-weight:bold; | |||||
| color:red; | |||||
| } | } | ||||
| .Failure { | .Failure { | ||||
| font-weight:bold; color:purple; | |||||
| font-weight:bold; | |||||
| color:purple; | |||||
| } | } | ||||
| </xsl:template> | </xsl:template> | ||||
| @@ -165,15 +176,15 @@ H6 { | |||||
| ====================================================================== --> | ====================================================================== --> | ||||
| <xsl:template match="testsuite" mode="class.details"> | <xsl:template match="testsuite" mode="class.details"> | ||||
| <xsl:variable name="package.name" select="@package"/> | <xsl:variable name="package.name" select="@package"/> | ||||
| <HTML> | |||||
| <HEAD> | |||||
| <html> | |||||
| <head> | |||||
| <xsl:call-template name="create.stylesheet.link"> | <xsl:call-template name="create.stylesheet.link"> | ||||
| <xsl:with-param name="package.name" select="$package.name"/> | <xsl:with-param name="package.name" select="$package.name"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| </HEAD> | |||||
| <BODY> | |||||
| </head> | |||||
| <body> | |||||
| <xsl:call-template name="pageHeader"/> | <xsl:call-template name="pageHeader"/> | ||||
| <H3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3> | |||||
| <h3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></h3> | |||||
| <table border="0" cellpadding="5" cellspacing="2" width="95%"> | <table border="0" cellpadding="5" cellspacing="2" width="95%"> | ||||
| @@ -181,7 +192,7 @@ H6 { | |||||
| <xsl:apply-templates select="." mode="print.test"/> | <xsl:apply-templates select="." mode="print.test"/> | ||||
| </table> | </table> | ||||
| <H2>Tests</H2> | |||||
| <h2>Tests</h2> | |||||
| <p> | <p> | ||||
| <table border="0" cellpadding="5" cellspacing="2" width="95%"> | <table border="0" cellpadding="5" cellspacing="2" width="95%"> | ||||
| <xsl:call-template name="testcase.test.header"/> | <xsl:call-template name="testcase.test.header"/> | ||||
| @@ -189,8 +200,8 @@ H6 { | |||||
| </table> | </table> | ||||
| </p> | </p> | ||||
| </BODY> | |||||
| </HTML> | |||||
| </body> | |||||
| </html> | |||||
| </xsl:template> | </xsl:template> | ||||
| @@ -202,24 +213,24 @@ H6 { | |||||
| <!-- list of classes in a package --> | <!-- list of classes in a package --> | ||||
| <xsl:template name="classes.list"> | <xsl:template name="classes.list"> | ||||
| <xsl:param name="name"/> | <xsl:param name="name"/> | ||||
| <HTML> | |||||
| <HEAD> | |||||
| <html> | |||||
| <head> | |||||
| <xsl:call-template name="create.stylesheet.link"> | <xsl:call-template name="create.stylesheet.link"> | ||||
| <xsl:with-param name="package.name" select="$name"/> | <xsl:with-param name="package.name" select="$name"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| </HEAD> | |||||
| <BODY> | |||||
| </head> | |||||
| <body> | |||||
| <table width="100%"> | <table width="100%"> | ||||
| <tr> | <tr> | ||||
| <td nowrap="nowrap"> | <td nowrap="nowrap"> | ||||
| <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></H2> | |||||
| <h2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></h2> | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| </table> | </table> | ||||
| <H2>Classes</H2> | |||||
| <h2>Classes</h2> | |||||
| <p> | <p> | ||||
| <TABLE WIDTH="100%"> | |||||
| <table width="100%"> | |||||
| <xsl:for-each select="/testsuites/testsuite[./@package = $name]"> | <xsl:for-each select="/testsuites/testsuite[./@package = $name]"> | ||||
| <xsl:sort select="@name"/> | <xsl:sort select="@name"/> | ||||
| <tr> | <tr> | ||||
| @@ -228,10 +239,10 @@ H6 { | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| </xsl:for-each> | </xsl:for-each> | ||||
| </TABLE> | |||||
| </table> | |||||
| </p> | </p> | ||||
| </BODY> | |||||
| </HTML> | |||||
| </body> | |||||
| </html> | |||||
| </xsl:template> | </xsl:template> | ||||
| @@ -260,8 +271,8 @@ H6 { | |||||
| </xsl:template> | </xsl:template> | ||||
| <xsl:template match="testsuite" mode="all.classes"> | <xsl:template match="testsuite" mode="all.classes"> | ||||
| <!-- (ancestor::package)[last()] is buggy in MSXML3, fixed in SP1 ? --> | |||||
| <xsl:variable name="package.name" select="@package"/> | |||||
| <!-- (ancestor::package)[last()] is buggy in MSXML3, fixed in SP1? --> | |||||
| <xsl:variable name="package.name" select="@package"/> | |||||
| <tr> | <tr> | ||||
| <td nowrap="nowrap"> | <td nowrap="nowrap"> | ||||
| <a target="classFrame"> | <a target="classFrame"> | ||||
| @@ -295,7 +306,7 @@ H6 { | |||||
| <p> | <p> | ||||
| <table width="100%"> | <table width="100%"> | ||||
| <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages"> | <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages"> | ||||
| <xsl:sort select="@name"/> | |||||
| <xsl:sort select="@package"/> | |||||
| </xsl:apply-templates> | </xsl:apply-templates> | ||||
| </table> | </table> | ||||
| </p> | </p> | ||||
| @@ -321,7 +332,7 @@ H6 { | |||||
| <xsl:with-param name="package.name"/> | <xsl:with-param name="package.name"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| </head> | </head> | ||||
| <body onload="open('allclasses-frame.html','classListFrame')"> | |||||
| <body> | |||||
| <xsl:call-template name="pageHeader"/> | <xsl:call-template name="pageHeader"/> | ||||
| <h2>Summary</h2> | <h2>Summary</h2> | ||||
| <xsl:variable name="testCount" select="sum(testsuite/@tests)"/> | <xsl:variable name="testCount" select="sum(testsuite/@tests)"/> | ||||
| @@ -331,20 +342,20 @@ H6 { | |||||
| <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> | <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> | ||||
| <table border="0" cellpadding="5" cellspacing="2" width="95%"> | <table border="0" cellpadding="5" cellspacing="2" width="95%"> | ||||
| <tr bgcolor="#A6CAF0" valign="top"> | <tr bgcolor="#A6CAF0" valign="top"> | ||||
| <td><b>Tests</b></td> | |||||
| <td><b>Failures</b></td> | |||||
| <td><b>Errors</b></td> | |||||
| <td><b>Success rate</b></td> | |||||
| <td><b>Time</b></td> | |||||
| <td><strong>Tests</strong></td> | |||||
| <td><strong>Failures</strong></td> | |||||
| <td><strong>Errors</strong></td> | |||||
| <td><strong>Success rate</strong></td> | |||||
| <td><strong>Time</strong></td> | |||||
| </tr> | </tr> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | <tr bgcolor="#EEEEE" valign="top"> | ||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:when test="$errorCount > 0">Error</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="$errorCount > 0">Error</xsl:when> | |||||
| <xsl:when test="$failureCount > 0">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <td><xsl:value-of select="$testCount"/></td> | <td><xsl:value-of select="$testCount"/></td> | ||||
| <td><xsl:value-of select="$failureCount"/></td> | <td><xsl:value-of select="$failureCount"/></td> | ||||
| <td><xsl:value-of select="$errorCount"/></td> | <td><xsl:value-of select="$errorCount"/></td> | ||||
| @@ -364,7 +375,7 @@ H6 { | |||||
| <table border="0" width="95%"> | <table border="0" width="95%"> | ||||
| <tr> | <tr> | ||||
| <td style="text-align: justify;"> | <td style="text-align: justify;"> | ||||
| Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated. | |||||
| Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated. | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| </table> | </table> | ||||
| @@ -377,13 +388,14 @@ H6 { | |||||
| <!-- get the node set containing all testsuites that have the same package --> | <!-- get the node set containing all testsuites that have the same package --> | ||||
| <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/> | <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | <tr bgcolor="#EEEEE" valign="top"> | ||||
| <!-- display a failure if there is any failure/error in the package --> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="sum($insamepackage/@errors) + sum($insamepackage/@failures) > 0">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <!-- display a failure if there is any failure/error in the package --> | |||||
| <xsl:attribute name="class"> | |||||
| <xsl:choose> | |||||
| <xsl:when test="sum($insamepackage/@errors) > 0">Error</xsl:when> | |||||
| <xsl:when test="sum($insamepackage/@failures) > 0">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | |||||
| </xsl:choose> | |||||
| </xsl:attribute> | |||||
| <td><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td> | <td><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td> | ||||
| <td><xsl:value-of select="sum($insamepackage/@tests)"/></td> | <td><xsl:value-of select="sum($insamepackage/@tests)"/></td> | ||||
| <td><xsl:value-of select="sum($insamepackage/@errors)"/></td> | <td><xsl:value-of select="sum($insamepackage/@errors)"/></td> | ||||
| @@ -403,13 +415,13 @@ H6 { | |||||
| <xsl:template name="package.summary"> | <xsl:template name="package.summary"> | ||||
| <xsl:param name="name"/> | <xsl:param name="name"/> | ||||
| <HTML> | |||||
| <HEAD> | |||||
| <html> | |||||
| <head> | |||||
| <xsl:call-template name="create.stylesheet.link"> | <xsl:call-template name="create.stylesheet.link"> | ||||
| <xsl:with-param name="package.name" select="$name"/> | <xsl:with-param name="package.name" select="$name"/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| </HEAD> | |||||
| <BODY> | |||||
| </head> | |||||
| <body> | |||||
| <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute> | <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute> | ||||
| <xsl:call-template name="pageHeader"/> | <xsl:call-template name="pageHeader"/> | ||||
| <h3>Package <xsl:value-of select="$name"/></h3> | <h3>Package <xsl:value-of select="$name"/></h3> | ||||
| @@ -421,7 +433,7 @@ H6 { | |||||
| <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/> | <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/> | ||||
| <xsl:if test="count($insamepackage) > 0"> | <xsl:if test="count($insamepackage) > 0"> | ||||
| <H2>Classes</H2> | |||||
| <h2>Classes</h2> | |||||
| <p> | <p> | ||||
| <table border="0" cellpadding="5" cellspacing="2" width="95%"> | <table border="0" cellpadding="5" cellspacing="2" width="95%"> | ||||
| <xsl:call-template name="testsuite.test.header"/> | <xsl:call-template name="testsuite.test.header"/> | ||||
| @@ -431,8 +443,8 @@ H6 { | |||||
| </table> | </table> | ||||
| </p> | </p> | ||||
| </xsl:if> | </xsl:if> | ||||
| </BODY> | |||||
| </HTML> | |||||
| </body> | |||||
| </html> | |||||
| </xsl:template> | </xsl:template> | ||||
| @@ -457,7 +469,7 @@ H6 { | |||||
| <!-- create the link to the stylesheet based on the package name --> | <!-- create the link to the stylesheet based on the package name --> | ||||
| <xsl:template name="create.stylesheet.link"> | <xsl:template name="create.stylesheet.link"> | ||||
| <xsl:param name="package.name"/> | <xsl:param name="package.name"/> | ||||
| <LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK> | |||||
| <link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link> | |||||
| </xsl:template> | </xsl:template> | ||||
| @@ -476,32 +488,32 @@ H6 { | |||||
| <!-- class header --> | <!-- class header --> | ||||
| <xsl:template name="testsuite.test.header"> | <xsl:template name="testsuite.test.header"> | ||||
| <tr bgcolor="#A6CAF0" valign="top"> | <tr bgcolor="#A6CAF0" valign="top"> | ||||
| <td width="80%"><b>Name</b></td> | |||||
| <td><b>Tests</b></td> | |||||
| <td><b>Errors</b></td> | |||||
| <td><b>Failures</b></td> | |||||
| <td nowrap="nowrap"><b>Time(s)</b></td> | |||||
| <td width="80%"><strong>Name</strong></td> | |||||
| <td><strong>Tests</strong></td> | |||||
| <td><strong>Errors</strong></td> | |||||
| <td><strong>Failures</strong></td> | |||||
| <td nowrap="nowrap"><strong>Time(s)</strong></td> | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| <!-- method header --> | <!-- method header --> | ||||
| <xsl:template name="testcase.test.header"> | <xsl:template name="testcase.test.header"> | ||||
| <tr bgcolor="#A6CAF0" valign="top"> | <tr bgcolor="#A6CAF0" valign="top"> | ||||
| <td><b>Name</b></td> | |||||
| <td><b>Status</b></td> | |||||
| <td width="80%"><b>Type</b></td> | |||||
| <td nowrap="nowrap"><b>Time(s)</b></td> | |||||
| <td><strong>Name</strong></td> | |||||
| <td><strong>Status</strong></td> | |||||
| <td width="80%"><strong>Type</strong></td> | |||||
| <td nowrap="nowrap"><strong>Time(s)</strong></td> | |||||
| </tr> | </tr> | ||||
| </xsl:template> | </xsl:template> | ||||
| <!-- class information --> | <!-- class information --> | ||||
| <xsl:template match="testsuite" mode="print.test"> | <xsl:template match="testsuite" mode="print.test"> | ||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <tr bgcolor="#EEEEE" valign="top"> | |||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:when test="@errors[.> 0]">Error</xsl:when> | <xsl:when test="@errors[.> 0]">Error</xsl:when> | ||||
| <xsl:when test="@failures[.> 0]">Failure</xsl:when> | |||||
| <xsl:otherwise>Pass</xsl:otherwise> | <xsl:otherwise>Pass</xsl:otherwise> | ||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| @@ -520,7 +532,8 @@ H6 { | |||||
| <tr bgcolor="#EEEEE" valign="top"> | <tr bgcolor="#EEEEE" valign="top"> | ||||
| <xsl:attribute name="class"> | <xsl:attribute name="class"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="failure | error">Error</xsl:when> | |||||
| <xsl:when test="error">Error</xsl:when> | |||||
| <xsl:when test="failure">Failure</xsl:when> | |||||
| <xsl:otherwise>TableRowColor</xsl:otherwise> | <xsl:otherwise>TableRowColor</xsl:otherwise> | ||||
| </xsl:choose> | </xsl:choose> | ||||
| </xsl:attribute> | </xsl:attribute> | ||||
| @@ -558,7 +571,7 @@ H6 { | |||||
| <xsl:call-template name="display-failures"/> | <xsl:call-template name="display-failures"/> | ||||
| </xsl:template> | </xsl:template> | ||||
| <!-- Style for the error and failure in the tescase template --> | |||||
| <!-- Style for the error and failure in the testcase template --> | |||||
| <xsl:template name="display-failures"> | <xsl:template name="display-failures"> | ||||
| <xsl:choose> | <xsl:choose> | ||||
| <xsl:when test="not(@message)">N/A</xsl:when> | <xsl:when test="not(@message)">N/A</xsl:when> | ||||
| @@ -573,7 +586,7 @@ H6 { | |||||
| <xsl:with-param name="word" select="."/> | <xsl:with-param name="word" select="."/> | ||||
| </xsl:call-template> | </xsl:call-template> | ||||
| </code> | </code> | ||||
| <!-- the later is better but might be problematic for non-21" monitors... --> | |||||
| <!-- the latter is better but might be problematic for non-21" monitors... --> | |||||
| <!--pre><xsl:value-of select="."/></pre--> | <!--pre><xsl:value-of select="."/></pre--> | ||||
| </xsl:template> | </xsl:template> | ||||
| @@ -606,6 +619,5 @@ H6 { | |||||
| <xsl:param name="value"/> | <xsl:param name="value"/> | ||||
| <xsl:value-of select="format-number($value,'0.00%')"/> | <xsl:value-of select="format-number($value,'0.00%')"/> | ||||
| </xsl:template> | </xsl:template> | ||||
| </xsl:stylesheet> | </xsl:stylesheet> | ||||
| @@ -0,0 +1,20 @@ | |||||
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" | |||||
| xmlns:lxslt="http://xml.apache.org/xslt" | |||||
| xmlns:redirect="org.apache.xalan.xslt.extensions.Redirect" | |||||
| extension-element-prefixes="redirect"> | |||||
| <!-- | |||||
| This is a test to ensure that systemid is set correctly | |||||
| for a xsl...the behavior might be dependent on Xalan1 | |||||
| and Xalan2...this will be a problem to erase the files :( | |||||
| Can take as a systemid the base for the xsl document or | |||||
| the base or the JVM working dir just like: new File("xalan-redirect-out.tmp") | |||||
| --> | |||||
| <xsl:param name="xalan-version" select="'x'"/> | |||||
| <xsl:template match="/"> | |||||
| <redirect:write file="./xalan{$xalan-version}-redirect-out.tmp"> | |||||
| <test>This should be written to the file</test> | |||||
| </redirect:write> | |||||
| </xsl:template> | |||||
| </xsl:stylesheet> | |||||
| @@ -0,0 +1,4 @@ | |||||
| <?xml version="1.0" encoding="ISO-8859-1"?> | |||||
| <root> | |||||
| <message>éàèïù</message> | |||||
| </root> | |||||
| @@ -0,0 +1,10 @@ | |||||
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | |||||
| <xsl:template match="/"> | |||||
| <root> | |||||
| <xsl:for-each select="/root/message"> | |||||
| <message><xsl:value-of select="."/></message> | |||||
| </xsl:for-each> | |||||
| </root> | |||||
| </xsl:template> | |||||
| </xsl:stylesheet> | |||||
| @@ -0,0 +1,7 @@ | |||||
| <?xml version="1.0"?> | |||||
| <!DOCTYPE project [ | |||||
| <!ENTITY include SYSTEM "xsltliaison-include.xml"> | |||||
| ]> | |||||
| <project> | |||||
| &include; | |||||
| </project> | |||||
| @@ -0,0 +1,3 @@ | |||||
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | |||||
| <xsl:include href="xsltliaison-include.xsl"/> | |||||
| </xsl:stylesheet> | |||||
| @@ -0,0 +1,2 @@ | |||||
| <!-- to be included by xsltliaison-include.xsl --> | |||||
| <task/> | |||||
| @@ -0,0 +1,3 @@ | |||||
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | |||||
| <!-- to be included by xsltliaison-in.xsl --> | |||||
| </xsl:stylesheet> | |||||
| @@ -0,0 +1,37 @@ | |||||
| <project name="test" default="new" basedir="."> | |||||
| <filterset id="testset.one"> | |||||
| <filter token="aaaa" value="1111"/> | |||||
| <filter token="bbbb" value="2222"/> | |||||
| </filterset> | |||||
| <filterset id="testset.two" beginToken="%" endToken="^"> | |||||
| <filter token="cccc" value="3333"/> | |||||
| <filter token="dddd" value="4444"/> | |||||
| </filterset> | |||||
| <target name="test1"> | |||||
| <delete file="dest1.txt"/> | |||||
| <copy file="filterseta.txt" tofile="dest1.txt"> | |||||
| <filterset refid="testset.one"/> | |||||
| </copy> | |||||
| <fixcrlf eol="lf" srcdir="." includes="dest1.txt"/> | |||||
| </target> | |||||
| <target name="test2"> | |||||
| <delete file="dest2.txt"/> | |||||
| <copy file="filtersetb.txt" tofile="dest2.txt"> | |||||
| <filterset refid="testset.two"/> | |||||
| </copy> | |||||
| <fixcrlf eol="lf" srcdir="." includes="dest2.txt"/> | |||||
| </target> | |||||
| <target name="test3"> | |||||
| <delete file="dest3.txt"/> | |||||
| <copy file="filtersetc.txt" tofile="dest3.txt"> | |||||
| <filterset refid="testset.one"/> | |||||
| <filterset refid="testset.two"/> | |||||
| </copy> | |||||
| <fixcrlf eol="lf" srcdir="." includes="dest3.txt"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -0,0 +1,2 @@ | |||||
| This is a test file for filters @aaaa@ | |||||
| It has two lines @bbbb@ | |||||
| @@ -0,0 +1,5 @@ | |||||
| This is a test file for filters with non default markers | |||||
| @cccc@ - should not change | |||||
| %cccc^ - should change | |||||
| ^dddd% - should not change | |||||
| %dddd^ - should change | |||||
| @@ -0,0 +1,7 @@ | |||||
| Combined filter test | |||||
| @aaaa@ - should change | |||||
| @bbbb@ - should change | |||||
| @cccc@ - should not change | |||||
| %cccc^ - should change | |||||
| ^dddd% - should not change | |||||
| %dddd^ - should change | |||||
| @@ -0,0 +1,2 @@ | |||||
| This is a test file for filters 1111 | |||||
| It has two lines 2222 | |||||
| @@ -0,0 +1,5 @@ | |||||
| This is a test file for filters with non default markers | |||||
| @cccc@ - should not change | |||||
| 3333 - should change | |||||
| ^dddd% - should not change | |||||
| 4444 - should change | |||||
| @@ -0,0 +1,7 @@ | |||||
| Combined filter test | |||||
| 1111 - should change | |||||
| 2222 - should change | |||||
| @cccc@ - should not change | |||||
| 3333 - should change | |||||
| ^dddd% - should not change | |||||
| 4444 - should change | |||||
| @@ -69,7 +69,6 @@ import java.util.*; | |||||
| * | * | ||||
| * @author duncan@x180.com | * @author duncan@x180.com | ||||
| */ | */ | ||||
| public class Main { | public class Main { | ||||
| /** The default build file name */ | /** The default build file name */ | ||||
| @@ -132,7 +131,7 @@ public class Main { | |||||
| * Entry point allowing for more options from other front ends | * Entry point allowing for more options from other front ends | ||||
| */ | */ | ||||
| public static void start(String[] args, Properties additionalUserProperties, | public static void start(String[] args, Properties additionalUserProperties, | ||||
| ClassLoader systemLoader) { | |||||
| ClassLoader coreLoader) { | |||||
| Main m = null; | Main m = null; | ||||
| try { | try { | ||||
| @@ -151,7 +150,7 @@ public class Main { | |||||
| } | } | ||||
| try { | try { | ||||
| m.runBuild(systemLoader); | |||||
| m.runBuild(coreLoader); | |||||
| System.exit(0); | System.exit(0); | ||||
| } catch (BuildException be) { | } catch (BuildException be) { | ||||
| if (m.err != System.err) { | if (m.err != System.err) { | ||||
| @@ -390,7 +389,7 @@ public class Main { | |||||
| /** | /** | ||||
| * Executes the build. | * Executes the build. | ||||
| */ | */ | ||||
| private void runBuild(ClassLoader systemLoader) throws BuildException { | |||||
| private void runBuild(ClassLoader coreLoader) throws BuildException { | |||||
| if (!readyToRun) { | if (!readyToRun) { | ||||
| return; | return; | ||||
| @@ -403,7 +402,7 @@ public class Main { | |||||
| } | } | ||||
| final Project project = new Project(); | final Project project = new Project(); | ||||
| project.setSystemLoader(systemLoader); | |||||
| project.setCoreLoader(coreLoader); | |||||
| Throwable error = null; | Throwable error = null; | ||||
| @@ -433,15 +432,17 @@ public class Main { | |||||
| // first use the ProjectHelper to create the project object | // first use the ProjectHelper to create the project object | ||||
| // from the given build file. | // from the given build file. | ||||
| String noParserMessage = | |||||
| "No JAXP compliant XML parser found. Please visit http://xml.apache.org for a suitable parser"; | |||||
| try { | try { | ||||
| Class.forName("javax.xml.parsers.SAXParserFactory"); | Class.forName("javax.xml.parsers.SAXParserFactory"); | ||||
| ProjectHelper.configureProject(project, buildFile); | ProjectHelper.configureProject(project, buildFile); | ||||
| } catch (NoClassDefFoundError ncdfe) { | } catch (NoClassDefFoundError ncdfe) { | ||||
| throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", ncdfe); | |||||
| throw new BuildException(noParserMessage, ncdfe); | |||||
| } catch (ClassNotFoundException cnfe) { | } catch (ClassNotFoundException cnfe) { | ||||
| throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", cnfe); | |||||
| throw new BuildException(noParserMessage, cnfe); | |||||
| } catch (NullPointerException npe) { | } catch (NullPointerException npe) { | ||||
| throw new BuildException("No JAXP compliant XML parser found. See http://java.sun.com/xml for the\nreference implementation.", npe); | |||||
| throw new BuildException(noParserMessage, npe); | |||||
| } | } | ||||
| // make sure that we have a target to execute | // make sure that we have a target to execute | ||||
| @@ -59,6 +59,7 @@ import java.util.*; | |||||
| import java.text.*; | import java.text.*; | ||||
| import org.apache.tools.ant.types.FilterSet; | import org.apache.tools.ant.types.FilterSet; | ||||
| import org.apache.tools.ant.types.FilterSetCollection; | |||||
| import org.apache.tools.ant.util.FileUtils; | import org.apache.tools.ant.util.FileUtils; | ||||
| /** | /** | ||||
| @@ -108,12 +109,13 @@ public class Project { | |||||
| private Hashtable taskClassDefinitions = new Hashtable(); | private Hashtable taskClassDefinitions = new Hashtable(); | ||||
| private Hashtable targets = new Hashtable(); | private Hashtable targets = new Hashtable(); | ||||
| private FilterSet globalFilterSet = new FilterSet(); | private FilterSet globalFilterSet = new FilterSet(); | ||||
| private FilterSetCollection globalFilters = new FilterSetCollection(globalFilterSet); | |||||
| private File baseDir; | private File baseDir; | ||||
| private Vector listeners = new Vector(); | private Vector listeners = new Vector(); | ||||
| /** The system classloader - may be null */ | |||||
| private ClassLoader systemLoader = null; | |||||
| /** The Ant core classloader - may be null if using system loader */ | |||||
| private ClassLoader coreLoader = null; | |||||
| /** Records the latest task on a thread */ | /** Records the latest task on a thread */ | ||||
| private Hashtable threadTasks = new Hashtable(); | private Hashtable threadTasks = new Hashtable(); | ||||
| @@ -216,12 +218,12 @@ public class Project { | |||||
| setSystemProperties(); | setSystemProperties(); | ||||
| } | } | ||||
| public void setSystemLoader(ClassLoader systemLoader) { | |||||
| this.systemLoader = systemLoader; | |||||
| public void setCoreLoader(ClassLoader coreLoader) { | |||||
| this.coreLoader = coreLoader; | |||||
| } | } | ||||
| public ClassLoader getSystemLoader() { | |||||
| return systemLoader; | |||||
| public ClassLoader getCoreLoader() { | |||||
| return coreLoader; | |||||
| } | } | ||||
| public void addBuildListener(BuildListener listener) { | public void addBuildListener(BuildListener listener) { | ||||
| @@ -671,7 +673,7 @@ public class Project { | |||||
| */ | */ | ||||
| public void copyFile(String sourceFile, String destFile, boolean filtering) | public void copyFile(String sourceFile, String destFile, boolean filtering) | ||||
| throws IOException { | throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null); | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -685,7 +687,7 @@ public class Project { | |||||
| */ | */ | ||||
| public void copyFile(String sourceFile, String destFile, boolean filtering, | public void copyFile(String sourceFile, String destFile, boolean filtering, | ||||
| boolean overwrite) throws IOException { | boolean overwrite) throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, overwrite); | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -702,7 +704,7 @@ public class Project { | |||||
| public void copyFile(String sourceFile, String destFile, boolean filtering, | public void copyFile(String sourceFile, String destFile, boolean filtering, | ||||
| boolean overwrite, boolean preserveLastModified) | boolean overwrite, boolean preserveLastModified) | ||||
| throws IOException { | throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, | |||||
| overwrite, preserveLastModified); | overwrite, preserveLastModified); | ||||
| } | } | ||||
| @@ -728,7 +730,7 @@ public class Project { | |||||
| */ | */ | ||||
| public void copyFile(File sourceFile, File destFile, boolean filtering) | public void copyFile(File sourceFile, File destFile, boolean filtering) | ||||
| throws IOException { | throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null); | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -742,7 +744,7 @@ public class Project { | |||||
| */ | */ | ||||
| public void copyFile(File sourceFile, File destFile, boolean filtering, | public void copyFile(File sourceFile, File destFile, boolean filtering, | ||||
| boolean overwrite) throws IOException { | boolean overwrite) throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, overwrite); | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -759,7 +761,7 @@ public class Project { | |||||
| public void copyFile(File sourceFile, File destFile, boolean filtering, | public void copyFile(File sourceFile, File destFile, boolean filtering, | ||||
| boolean overwrite, boolean preserveLastModified) | boolean overwrite, boolean preserveLastModified) | ||||
| throws IOException { | throws IOException { | ||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilterSet : null, | |||||
| fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, | |||||
| overwrite, preserveLastModified); | overwrite, preserveLastModified); | ||||
| } | } | ||||
| @@ -73,7 +73,8 @@ public class Log4jListener implements BuildListener { | |||||
| public Log4jListener() { | public Log4jListener() { | ||||
| initialized = false; | initialized = false; | ||||
| Category cat = Category.getInstance("org.apache.tools.ant"); | Category cat = Category.getInstance("org.apache.tools.ant"); | ||||
| if (!(cat.getAllAppenders() instanceof NullEnumeration)) { | |||||
| Category rootCat = Category.getRoot(); | |||||
| if (!(rootCat.getAllAppenders() instanceof NullEnumeration)) { | |||||
| initialized = true; | initialized = true; | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -90,7 +91,7 @@ public class Log4jListener implements BuildListener { | |||||
| public void buildFinished(BuildEvent event) { | public void buildFinished(BuildEvent event) { | ||||
| if (initialized) { | if (initialized) { | ||||
| Category cat = Category.getInstance(Target.class.getName()); | |||||
| Category cat = Category.getInstance(Project.class.getName()); | |||||
| if (event.getException() == null) { | if (event.getException() == null) { | ||||
| cat.info("Build finished."); | cat.info("Build finished."); | ||||
| } | } | ||||
| @@ -365,14 +365,14 @@ public class Copy extends Task { | |||||
| try { | try { | ||||
| log("Copying " + fromFile + " to " + toFile, verbosity); | log("Copying " + fromFile + " to " + toFile, verbosity); | ||||
| FilterSet executionFilterSet = new FilterSet(); | |||||
| FilterSetCollection executionFilters = new FilterSetCollection(); | |||||
| if (filtering) { | if (filtering) { | ||||
| executionFilterSet.addFilterSet(project.getGlobalFilterSet()); | |||||
| executionFilters.addFilterSet(project.getGlobalFilterSet()); | |||||
| } | } | ||||
| for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) { | for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) { | ||||
| executionFilterSet.addFilterSet((FilterSet)filterEnum.nextElement()); | |||||
| executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); | |||||
| } | } | ||||
| fileUtils.copyFile(fromFile, toFile, executionFilterSet, | |||||
| fileUtils.copyFile(fromFile, toFile, executionFilters, | |||||
| forceOverwrite, preserveLastModified); | forceOverwrite, preserveLastModified); | ||||
| } catch (IOException ioe) { | } catch (IOException ioe) { | ||||
| String msg = "Failed to copy " + fromFile + " to " + toFile | String msg = "Failed to copy " + fromFile + " to " + toFile | ||||
| @@ -187,7 +187,7 @@ public class DependSet extends MatchingTask { | |||||
| for (int i = 0; i < targetFiles.length; i++) { | for (int i = 0; i < targetFiles.length; i++) { | ||||
| File dest = new File(targetFS.getDir(project), targetFiles[i]); | File dest = new File(targetFS.getDir(project), targetFiles[i]); | ||||
| allTargets.add(dest); | |||||
| allTargets.addElement(dest); | |||||
| if (dest.lastModified() > now) { | if (dest.lastModified() > now) { | ||||
| log("Warning: "+targetFiles[i]+" modified in the future.", | log("Warning: "+targetFiles[i]+" modified in the future.", | ||||
| @@ -215,7 +215,7 @@ public class DependSet extends MatchingTask { | |||||
| continue; | continue; | ||||
| } | } | ||||
| else { | else { | ||||
| allTargets.add(dest); | |||||
| allTargets.addElement(dest); | |||||
| } | } | ||||
| if (dest.lastModified() > now) { | if (dest.lastModified() > now) { | ||||
| log("Warning: "+targetFiles[i]+" modified in the future.", | log("Warning: "+targetFiles[i]+" modified in the future.", | ||||
| @@ -114,7 +114,7 @@ public class ExecuteJava { | |||||
| if (classpath == null) { | if (classpath == null) { | ||||
| target = Class.forName(classname); | target = Class.forName(classname); | ||||
| } else { | } else { | ||||
| loader = new AntClassLoader(project.getSystemLoader(), project, classpath, false); | |||||
| loader = new AntClassLoader(project.getCoreLoader(), project, classpath, false); | |||||
| loader.setIsolated(true); | loader.setIsolated(true); | ||||
| loader.setThreadContextLoader(); | loader.setThreadContextLoader(); | ||||
| target = loader.forceLoadClass(classname); | target = loader.forceLoadClass(classname); | ||||
| @@ -70,7 +70,9 @@ public class Jar extends Zip { | |||||
| private File manifestFile; | private File manifestFile; | ||||
| private Manifest manifest; | private Manifest manifest; | ||||
| private Manifest execManifest; | |||||
| private Manifest execManifest; | |||||
| /** true if a manifest has been specified in the task */ | |||||
| private boolean buildFileManifest = false; | private boolean buildFileManifest = false; | ||||
| public Jar() { | public Jar() { | ||||
| @@ -279,15 +281,22 @@ public class Jar extends Zip { | |||||
| theZipFile = new java.util.zip.ZipFile(zipFile); | theZipFile = new java.util.zip.ZipFile(zipFile); | ||||
| java.util.zip.ZipEntry entry = theZipFile.getEntry("META-INF/MANIFEST.MF"); | java.util.zip.ZipEntry entry = theZipFile.getEntry("META-INF/MANIFEST.MF"); | ||||
| if (entry == null) { | if (entry == null) { | ||||
| log("Updating jar since the current jar has no manifest", Project.MSG_VERBOSE); | |||||
| return false; | return false; | ||||
| } | } | ||||
| Manifest currentManifest = new Manifest(theZipFile.getInputStream(entry)); | Manifest currentManifest = new Manifest(theZipFile.getInputStream(entry)); | ||||
| if (manifest == null) { | |||||
| manifest = getDefaultManifest(); | |||||
| } | |||||
| if (!currentManifest.equals(manifest)) { | if (!currentManifest.equals(manifest)) { | ||||
| log("Updating jar since jar manifest has changed", Project.MSG_VERBOSE); | |||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| catch (Exception e) { | catch (Exception e) { | ||||
| // any problems and we will rebuild | // any problems and we will rebuild | ||||
| log("Updating jar since cannot read current jar manifest: " + e.getClass().getName() + e.getMessage(), | |||||
| Project.MSG_VERBOSE); | |||||
| return false; | return false; | ||||
| } | } | ||||
| finally { | finally { | ||||
| @@ -115,6 +115,7 @@ public class Javac extends MatchingTask { | |||||
| private boolean includeAntRuntime = true; | private boolean includeAntRuntime = true; | ||||
| private boolean includeJavaRuntime = false; | private boolean includeJavaRuntime = false; | ||||
| private boolean fork = false; | private boolean fork = false; | ||||
| private boolean nowarn = false; | |||||
| protected boolean failOnError = true; | protected boolean failOnError = true; | ||||
| protected File[] compileList = new File[0]; | protected File[] compileList = new File[0]; | ||||
| @@ -410,6 +411,20 @@ public class Javac extends MatchingTask { | |||||
| } | } | ||||
| /** | |||||
| * Sets whether the -nowarn option should be used. | |||||
| */ | |||||
| public void setNowarn(boolean flag) { | |||||
| this.nowarn = flag; | |||||
| } | |||||
| /** | |||||
| * Should the -nowarn option be used. | |||||
| */ | |||||
| public boolean getNowarn() { | |||||
| return nowarn; | |||||
| } | |||||
| /** | /** | ||||
| * Executes the task. | * Executes the task. | ||||
| */ | */ | ||||
| @@ -681,9 +681,10 @@ public class Javadoc extends Task { | |||||
| public String getPackages() { | public String getPackages() { | ||||
| StringBuffer p = new StringBuffer( "\"" ); | StringBuffer p = new StringBuffer( "\"" ); | ||||
| for (int i = 0; i < packages.size(); i++) { | for (int i = 0; i < packages.size(); i++) { | ||||
| p.append( packages.elementAt( i ).toString() ); | |||||
| if ( i > 0 ) | |||||
| if ( i > 0 ) { | |||||
| p.append( ":" ); | p.append( ":" ); | ||||
| } | |||||
| p.append( packages.elementAt(i).toString() ); | |||||
| } | } | ||||
| p.append( "\"" ); | p.append( "\"" ); | ||||
| return p.toString(); | return p.toString(); | ||||
| @@ -123,14 +123,14 @@ public class Move extends Copy { | |||||
| try { | try { | ||||
| log("Moving " + fromFile + " to " + toFile, verbosity); | log("Moving " + fromFile + " to " + toFile, verbosity); | ||||
| FilterSet executionFilterSet = new FilterSet(); | |||||
| FilterSetCollection executionFilters = new FilterSetCollection(); | |||||
| if (filtering) { | if (filtering) { | ||||
| executionFilterSet.addFilterSet(project.getGlobalFilterSet()); | |||||
| executionFilters.addFilterSet(project.getGlobalFilterSet()); | |||||
| } | } | ||||
| for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) { | for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) { | ||||
| executionFilterSet.addFilterSet((FilterSet)filterEnum.nextElement()); | |||||
| executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); | |||||
| } | } | ||||
| getFileUtils().copyFile(f, d, executionFilterSet, | |||||
| getFileUtils().copyFile(f, d, executionFilters, | |||||
| forceOverwrite); | forceOverwrite); | ||||
| f = new File(fromFile); | f = new File(fromFile); | ||||
| @@ -54,19 +54,51 @@ | |||||
| package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
| import org.apache.tools.ant.*; | |||||
| import java.io.File; | |||||
| /** | /** | ||||
| * Proxy interface for XSLT processors. | |||||
| * | * | ||||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | ||||
| * @version $Revision$ $Date$ | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| * @see #XSLTProcess | |||||
| */ | */ | ||||
| public interface XSLTLiaison { | public interface XSLTLiaison { | ||||
| public void setStylesheet(String fileName) throws Exception; | |||||
| /** | |||||
| * the file protocol prefix for systemid. | |||||
| * This file protocol must be appended to an absolute path. | |||||
| * Typically: <tt>FILE_PROTOCOL_PREFIX + file.getAbsolutePath()</tt> | |||||
| * This is not correct in specification terms since an absolute | |||||
| * url in Unix is file:// + file.getAbsolutePath() while it is | |||||
| * file:/// + file.getAbsolutePath() under Windows. | |||||
| * Whatever, it should not be a problem to put file:/// in every | |||||
| * case since most parsers for now incorrectly makes no difference | |||||
| * between it.. and users also have problem with that :) | |||||
| */ | |||||
| public final static String FILE_PROTOCOL_PREFIX = "file:///"; | |||||
| /** | |||||
| * set the stylesheet to use for the transformation. | |||||
| * @param stylesheet the stylesheet to be used for transformation. | |||||
| */ | |||||
| public void setStylesheet(File stylesheet) throws Exception; | |||||
| /** | |||||
| * Add a parameter to be set during the XSL transformation. | |||||
| * @param name the parameter name. | |||||
| * @param expression the parameter value as an expression string. | |||||
| * @throws Exception thrown if any problems happens. | |||||
| */ | |||||
| public void addParam(String name, String expression) throws Exception; | public void addParam(String name, String expression) throws Exception; | ||||
| public void transform(String infile, String outfile) throws Exception; | |||||
| /** | |||||
| * Perform the transformation of a file into another. | |||||
| * @param infile the input file, probably an XML one. :-) | |||||
| * @param outfile the output file resulting from the transformation | |||||
| * @throws Exception thrown if any problems happens. | |||||
| * @see #setStylesheet(File) | |||||
| */ | |||||
| public void transform(File infile, File outfile) throws Exception; | |||||
| } //-- XSLTLiaison | } //-- XSLTLiaison | ||||
| @@ -100,9 +100,9 @@ public class XSLTProcess extends MatchingTask { | |||||
| private String targetExtension = ".html"; | private String targetExtension = ".html"; | ||||
| private Vector params = new Vector(); | private Vector params = new Vector(); | ||||
| private File inFile = null; | private File inFile = null; | ||||
| private File outFile = null; | private File outFile = null; | ||||
| private String processor; | private String processor; | ||||
| @@ -137,7 +137,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| if (baseDir == null) { | if (baseDir == null) { | ||||
| baseDir = project.resolveFile("."); | baseDir = project.resolveFile("."); | ||||
| } | } | ||||
| liaison = getLiaison(); | liaison = getLiaison(); | ||||
| log("Using "+liaison.getClass().toString(), Project.MSG_VERBOSE); | log("Using "+liaison.getClass().toString(), Project.MSG_VERBOSE); | ||||
| @@ -178,7 +178,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| for (int i = 0;i < list.length; ++i) { | for (int i = 0;i < list.length; ++i) { | ||||
| process( baseDir, list[i], destDir, stylesheet ); | process( baseDir, list[i], destDir, stylesheet ); | ||||
| } | } | ||||
| // Process all the directoried marked for styling | // Process all the directoried marked for styling | ||||
| dirs = scanner.getIncludedDirectories(); | dirs = scanner.getIncludedDirectories(); | ||||
| for (int j = 0;j < dirs.length;++j){ | for (int j = 0;j < dirs.length;++j){ | ||||
| @@ -264,15 +264,15 @@ public class XSLTProcess extends MatchingTask { | |||||
| */ | */ | ||||
| private void resolveProcessor(String proc) throws Exception { | private void resolveProcessor(String proc) throws Exception { | ||||
| if (proc.equals("trax")) { | if (proc.equals("trax")) { | ||||
| final Class clazz = | |||||
| final Class clazz = | |||||
| loadClass("org.apache.tools.ant.taskdefs.optional.TraXLiaison"); | loadClass("org.apache.tools.ant.taskdefs.optional.TraXLiaison"); | ||||
| liaison = (XSLTLiaison)clazz.newInstance(); | liaison = (XSLTLiaison)clazz.newInstance(); | ||||
| } else if (proc.equals("xslp")) { | } else if (proc.equals("xslp")) { | ||||
| final Class clazz = | |||||
| final Class clazz = | |||||
| loadClass("org.apache.tools.ant.taskdefs.optional.XslpLiaison"); | loadClass("org.apache.tools.ant.taskdefs.optional.XslpLiaison"); | ||||
| liaison = (XSLTLiaison) clazz.newInstance(); | liaison = (XSLTLiaison) clazz.newInstance(); | ||||
| } else if (proc.equals("xalan")) { | } else if (proc.equals("xalan")) { | ||||
| final Class clazz = | |||||
| final Class clazz = | |||||
| loadClass("org.apache.tools.ant.taskdefs.optional.XalanLiaison"); | loadClass("org.apache.tools.ant.taskdefs.optional.XalanLiaison"); | ||||
| liaison = (XSLTLiaison)clazz.newInstance(); | liaison = (XSLTLiaison)clazz.newInstance(); | ||||
| } else { | } else { | ||||
| @@ -313,14 +313,14 @@ public class XSLTProcess extends MatchingTask { | |||||
| * Processes the given input XML file and stores the result | * Processes the given input XML file and stores the result | ||||
| * in the given resultFile. | * in the given resultFile. | ||||
| **/ | **/ | ||||
| private void process(File baseDir, String xmlFile, File destDir, | |||||
| private void process(File baseDir, String xmlFile, File destDir, | |||||
| File stylesheet) | File stylesheet) | ||||
| throws BuildException { | throws BuildException { | ||||
| String fileExt=targetExtension; | String fileExt=targetExtension; | ||||
| File outFile=null; | File outFile=null; | ||||
| File inFile=null; | File inFile=null; | ||||
| try { | try { | ||||
| long styleSheetLastModified = stylesheet.lastModified(); | long styleSheetLastModified = stylesheet.lastModified(); | ||||
| inFile = new File(baseDir,xmlFile); | inFile = new File(baseDir,xmlFile); | ||||
| @@ -337,7 +337,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| log("Transforming into "+destDir); | log("Transforming into "+destDir); | ||||
| configureLiaison(stylesheet); | configureLiaison(stylesheet); | ||||
| liaison.transform(inFile.toString(), outFile.toString()); | |||||
| liaison.transform(inFile, outFile); | |||||
| } | } | ||||
| } | } | ||||
| catch (Exception ex) { | catch (Exception ex) { | ||||
| @@ -347,7 +347,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| if (outFile != null) { | if (outFile != null) { | ||||
| outFile.delete(); | outFile.delete(); | ||||
| } | } | ||||
| throw new BuildException(ex); | throw new BuildException(ex); | ||||
| } | } | ||||
| @@ -365,7 +365,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| ensureDirectoryFor( outFile ); | ensureDirectoryFor( outFile ); | ||||
| log("Processing " + inFile + " to " + outFile, Project.MSG_INFO); | log("Processing " + inFile + " to " + outFile, Project.MSG_INFO); | ||||
| configureLiaison(stylesheet); | configureLiaison(stylesheet); | ||||
| liaison.transform(inFile.toString(), outFile.toString()); | |||||
| liaison.transform(inFile, outFile); | |||||
| } | } | ||||
| }catch (Exception ex) { | }catch (Exception ex) { | ||||
| log("Failed to process " + inFile, Project.MSG_INFO); | log("Failed to process " + inFile, Project.MSG_INFO); | ||||
| @@ -378,12 +378,12 @@ public class XSLTProcess extends MatchingTask { | |||||
| File directory = new File( targetFile.getParent() ); | File directory = new File( targetFile.getParent() ); | ||||
| if (!directory.exists()) { | if (!directory.exists()) { | ||||
| if (!directory.mkdirs()) { | if (!directory.mkdirs()) { | ||||
| throw new BuildException("Unable to create directory: " | |||||
| throw new BuildException("Unable to create directory: " | |||||
| + directory.getAbsolutePath() ); | + directory.getAbsolutePath() ); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| protected XSLTLiaison getLiaison() { | protected XSLTLiaison getLiaison() { | ||||
| // if processor wasn't specified, see if TraX is available. If not, | // if processor wasn't specified, see if TraX is available. If not, | ||||
| // default it to xslp or xalan, depending on which is in the classpath | // default it to xslp or xalan, depending on which is in the classpath | ||||
| @@ -424,20 +424,20 @@ public class XSLTProcess extends MatchingTask { | |||||
| public class Param { | public class Param { | ||||
| private String name=null; | private String name=null; | ||||
| private String expression=null; | private String expression=null; | ||||
| public void setName(String name){ | public void setName(String name){ | ||||
| this.name = name; | this.name = name; | ||||
| } | } | ||||
| public void setExpression(String expression){ | public void setExpression(String expression){ | ||||
| this.expression = expression; | this.expression = expression; | ||||
| } | } | ||||
| public String getName() throws BuildException{ | public String getName() throws BuildException{ | ||||
| if(name==null)throw new BuildException("Name attribute is missing."); | if(name==null)throw new BuildException("Name attribute is missing."); | ||||
| return name; | return name; | ||||
| } | } | ||||
| public String getExpression() throws BuildException{ | public String getExpression() throws BuildException{ | ||||
| if(expression==null)throw new BuildException("Expression attribute is missing."); | if(expression==null)throw new BuildException("Expression attribute is missing."); | ||||
| return expression; | return expression; | ||||
| @@ -455,7 +455,7 @@ public class XSLTProcess extends MatchingTask { | |||||
| try { | try { | ||||
| log( "Loading stylesheet " + stylesheet, Project.MSG_INFO); | log( "Loading stylesheet " + stylesheet, Project.MSG_INFO); | ||||
| liaison.setStylesheet( stylesheet.toString() ); | |||||
| liaison.setStylesheet( stylesheet ); | |||||
| for(Enumeration e = params.elements();e.hasMoreElements();) { | for(Enumeration e = params.elements();e.hasMoreElements();) { | ||||
| Param p = (Param)e.nextElement(); | Param p = (Param)e.nextElement(); | ||||
| liaison.addParam( p.getName(), p.getExpression() ); | liaison.addParam( p.getName(), p.getExpression() ); | ||||
| @@ -206,6 +206,10 @@ public abstract class DefaultCompilerAdapter implements CompilerAdapter { | |||||
| protected Commandline setupJavacCommandlineSwitches(Commandline cmd) { | protected Commandline setupJavacCommandlineSwitches(Commandline cmd) { | ||||
| Path classpath = getCompileClasspath(); | Path classpath = getCompileClasspath(); | ||||
| if (attributes.getNowarn()) { | |||||
| cmd.createArgument().setValue("-nowarn"); | |||||
| } | |||||
| if (deprecation == true) { | if (deprecation == true) { | ||||
| cmd.createArgument().setValue("-deprecation"); | cmd.createArgument().setValue("-deprecation"); | ||||
| } | } | ||||
| @@ -173,7 +173,21 @@ public class Jikes extends DefaultCompilerAdapter { | |||||
| * warning can be pretty annoying. | * warning can be pretty annoying. | ||||
| */ | */ | ||||
| String warningsProperty = project.getProperty("build.compiler.warnings"); | String warningsProperty = project.getProperty("build.compiler.warnings"); | ||||
| if (warningsProperty != null && !Project.toBoolean(warningsProperty)) { | |||||
| if (warningsProperty != null) { | |||||
| attributes.log("!! the build.compiler.warnings property is deprecated. !!", | |||||
| Project.MSG_WARN); | |||||
| attributes.log("!! Use the nowarn attribute instead. !!", | |||||
| Project.MSG_WARN); | |||||
| if (!Project.toBoolean(warningsProperty)) { | |||||
| cmd.createArgument().setValue("-nowarn"); | |||||
| } | |||||
| } if (attributes.getNowarn()) { | |||||
| /* | |||||
| * FIXME later | |||||
| * | |||||
| * let the magic property win over the attribute for backwards | |||||
| * compatibility | |||||
| */ | |||||
| cmd.createArgument().setValue("-nowarn"); | cmd.createArgument().setValue("-nowarn"); | ||||
| } | } | ||||
| @@ -113,8 +113,8 @@ vsscheckout=org.apache.tools.ant.taskdefs.optional.vss.MSVSSCHECKOUT | |||||
| iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask | iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask | ||||
| jdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask | jdepend=org.apache.tools.ant.taskdefs.optional.jdepend.JDependTask | ||||
| mimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMail | mimemail=org.apache.tools.ant.taskdefs.optional.net.MimeMail | ||||
| cccheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin | |||||
| cccheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout | |||||
| ccmcheckin=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckin | |||||
| ccmcheckout=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckout | |||||
| ccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault | ccmcheckintask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCheckinDefault | ||||
| ccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure | ccmreconfigure=org.apache.tools.ant.taskdefs.optional.ccm.CCMReconfigure | ||||
| ccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask | ccmcreatetask=org.apache.tools.ant.taskdefs.optional.ccm.CCMCreateTask | ||||
| @@ -54,61 +54,109 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | package org.apache.tools.ant.taskdefs.optional; | ||||
| import java.io.File; | |||||
| import java.io.FileInputStream; | |||||
| import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
| import java.io.IOException; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | import org.apache.tools.ant.taskdefs.XSLTLiaison; | ||||
| import javax.xml.transform.TransformerFactory; | import javax.xml.transform.TransformerFactory; | ||||
| import javax.xml.transform.Transformer; | import javax.xml.transform.Transformer; | ||||
| import javax.xml.transform.Templates; | import javax.xml.transform.Templates; | ||||
| import javax.xml.transform.Source; | |||||
| import javax.xml.transform.stream.StreamResult; | import javax.xml.transform.stream.StreamResult; | ||||
| import javax.xml.transform.stream.StreamSource; | import javax.xml.transform.stream.StreamSource; | ||||
| /** | /** | ||||
| * Concrete liaison for XSLT processor implementing TraX. (ie JAXP 1.1) | |||||
| * | * | ||||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | ||||
| * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a> | * @author <a href="mailto:dims@yahoo.com">Davanum Srinivas</a> | ||||
| * @version $Revision$ $Date$ | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | */ | ||||
| public class TraXLiaison implements XSLTLiaison { | public class TraXLiaison implements XSLTLiaison { | ||||
| protected final static String FILEURL = "file:"; | |||||
| /** The trax TransformerFactory */ | /** The trax TransformerFactory */ | ||||
| private TransformerFactory tfactory = null; | private TransformerFactory tfactory = null; | ||||
| /** stylesheet stream, close it asap */ | |||||
| private FileInputStream xslStream = null; | |||||
| /** Stylesheet template */ | /** Stylesheet template */ | ||||
| private Templates templates = null; | private Templates templates = null; | ||||
| /** The trax Transformer itself */ | |||||
| private Transformer transformer; | |||||
| /** transformer */ | |||||
| private Transformer transformer = null; | |||||
| public TraXLiaison() throws Exception { | public TraXLiaison() throws Exception { | ||||
| tfactory = TransformerFactory.newInstance(); | tfactory = TransformerFactory.newInstance(); | ||||
| } | } | ||||
| //------------------- IMPORTANT | |||||
| // 1) Don't use the StreamSource(File) ctor. It won't work with | |||||
| // xalan prior to 2.2 because of systemid bugs. | |||||
| // 2) Use a stream so that you can close it yourself quickly | |||||
| // and avoid keeping the handle until the object is garbaged. | |||||
| // (always keep control), otherwise you won't be able to delete | |||||
| // the file quickly on windows. | |||||
| // 3) Always set the systemid to the source for imports, includes... | |||||
| // in xsl and xml... | |||||
| public void setStylesheet(String fileName) throws Exception { | |||||
| templates = tfactory.newTemplates(new StreamSource(normalize(fileName))); | |||||
| public void setStylesheet(File stylesheet) throws Exception { | |||||
| xslStream = new FileInputStream(stylesheet); | |||||
| StreamSource src = new StreamSource(xslStream); | |||||
| src.setSystemId(getSystemId(stylesheet)); | |||||
| templates = tfactory.newTemplates(src); | |||||
| transformer = templates.newTransformer(); | transformer = templates.newTransformer(); | ||||
| }; | |||||
| } | |||||
| public void transform(String infile, String outfile) throws Exception { | |||||
| FileOutputStream out = new FileOutputStream(outfile); | |||||
| public void transform(File infile, File outfile) throws Exception { | |||||
| FileInputStream fis = null; | |||||
| FileOutputStream fos = null; | |||||
| try { | try { | ||||
| transformer.transform(new StreamSource(normalize(infile)), | |||||
| new StreamResult(out)); | |||||
| fis = new FileInputStream(infile); | |||||
| fos = new FileOutputStream(outfile); | |||||
| StreamSource src = new StreamSource(fis); | |||||
| src.setSystemId(getSystemId(infile)); | |||||
| StreamResult res = new StreamResult(fos); | |||||
| // not sure what could be the need of this... | |||||
| res.setSystemId(getSystemId(outfile)); | |||||
| transformer.transform(src, res); | |||||
| } finally { | } finally { | ||||
| out.close(); | |||||
| // make sure to close all handles, otherwise the garbage | |||||
| // collector will close them...whenever possible and | |||||
| // Windows may complain about not being able to delete files. | |||||
| try { | |||||
| if (xslStream != null){ | |||||
| xslStream.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| try { | |||||
| if (fis != null){ | |||||
| fis.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| try { | |||||
| if (fos != null){ | |||||
| fos.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| } | } | ||||
| } | } | ||||
| protected String normalize(String fileName) { | |||||
| if(fileName != null && !fileName.startsWith(FILEURL)) { | |||||
| return FILEURL + "///" + fileName; | |||||
| } | |||||
| return fileName; | |||||
| // make sure that the systemid is made of '/' and not '\' otherwise | |||||
| // crimson will complain that it cannot resolve relative entities | |||||
| // because it grabs the base uri via lastIndexOf('/') without | |||||
| // making sure it is really a /'ed path | |||||
| protected String getSystemId(File file){ | |||||
| String path = file.getAbsolutePath(); | |||||
| path = path.replace('\\','/'); | |||||
| return FILE_PROTOCOL_PREFIX + path; | |||||
| } | } | ||||
| public void addParam(String name, String value){ | public void addParam(String name, String value){ | ||||
| transformer.setParameter(name, value); | transformer.setParameter(name, value); | ||||
| } | } | ||||
| @@ -60,39 +60,70 @@ import org.apache.xalan.xslt.XSLTProcessorFactory; | |||||
| import org.apache.xalan.xslt.XSLTProcessor; | import org.apache.xalan.xslt.XSLTProcessor; | ||||
| import org.apache.xalan.xslt.XSLTInputSource; | import org.apache.xalan.xslt.XSLTInputSource; | ||||
| import org.apache.xalan.xslt.XSLTResultTarget; | import org.apache.xalan.xslt.XSLTResultTarget; | ||||
| import org.xml.sax.InputSource; | |||||
| import java.io.File; | |||||
| import java.io.FileInputStream; | |||||
| import java.io.FileOutputStream; | |||||
| import java.io.IOException; | |||||
| /** | /** | ||||
| * Concrete liaison for Xalan 1.x API. | |||||
| * | * | ||||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | ||||
| * @version $Revision$ $Date$ | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | */ | ||||
| public class XalanLiaison implements XSLTLiaison { | public class XalanLiaison implements XSLTLiaison { | ||||
| protected final static String FILEURL = "file:"; | |||||
| XSLTProcessor processor; | |||||
| XSLTInputSource xslSheet; | |||||
| protected XSLTProcessor processor; | |||||
| protected File stylesheet; | |||||
| public XalanLiaison() throws Exception { | public XalanLiaison() throws Exception { | ||||
| processor = XSLTProcessorFactory.getProcessor(); | processor = XSLTProcessorFactory.getProcessor(); | ||||
| } | } | ||||
| public void setStylesheet(String fileName) throws Exception { | |||||
| xslSheet = new XSLTInputSource (normalize(fileName)); | |||||
| }; | |||||
| public void transform(String infile, String outfile) throws Exception { | |||||
| processor.process(new XSLTInputSource(normalize(infile)), xslSheet, | |||||
| new XSLTResultTarget(outfile)); | |||||
| public void setStylesheet(File stylesheet) throws Exception { | |||||
| this.stylesheet = stylesheet; | |||||
| } | } | ||||
| protected String normalize(String fileName) { | |||||
| if(fileName != null && !fileName.startsWith(FILEURL)) { | |||||
| return FILEURL + fileName; | |||||
| public void transform(File infile, File outfile) throws Exception { | |||||
| FileInputStream fis = null; | |||||
| FileOutputStream fos = null; | |||||
| FileInputStream xslStream = null; | |||||
| try { | |||||
| xslStream = new FileInputStream(stylesheet); | |||||
| fis = new FileInputStream(infile); | |||||
| fos = new FileOutputStream(outfile); | |||||
| // systemid such as file:/// + getAbsolutePath() are considered | |||||
| // invalid here... | |||||
| XSLTInputSource xslSheet = new XSLTInputSource(xslStream); | |||||
| xslSheet.setSystemId(stylesheet.getAbsolutePath()); | |||||
| XSLTInputSource src = new XSLTInputSource(fis); | |||||
| src.setSystemId(infile.getAbsolutePath()); | |||||
| XSLTResultTarget res = new XSLTResultTarget(fos); | |||||
| processor.process(src, xslSheet, res); | |||||
| } finally { | |||||
| // make sure to close all handles, otherwise the garbage | |||||
| // collector will close them...whenever possible and | |||||
| // Windows may complain about not being able to delete files. | |||||
| try { | |||||
| if (xslStream != null){ | |||||
| xslStream.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| try { | |||||
| if (fis != null){ | |||||
| fis.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| try { | |||||
| if (fos != null){ | |||||
| fos.close(); | |||||
| } | |||||
| } catch (IOException ignored){} | |||||
| } | } | ||||
| return fileName; | |||||
| } | } | ||||
| public void addParam(String name, String value){ | public void addParam(String name, String value){ | ||||
| processor.setStylesheetParam(name, value); | processor.setStylesheetParam(name, value); | ||||
| } | } | ||||
| @@ -54,40 +54,45 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | package org.apache.tools.ant.taskdefs.optional; | ||||
| import java.io.FileWriter; | |||||
| import java.io.*; | |||||
| import java.net.URL; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | import org.apache.tools.ant.taskdefs.XSLTLiaison; | ||||
| import org.xml.sax.InputSource; | |||||
| import com.kvisco.xsl.XSLProcessor; | |||||
| import com.kvisco.xsl.XSLReader; | |||||
| import com.kvisco.xsl.XSLStylesheet; | |||||
| import com.kvisco.xsl.*; | |||||
| /** | /** | ||||
| * Concrete liaison for XSLP | |||||
| * | * | ||||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | ||||
| * @version $Revision$ $Date$ | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | */ | ||||
| public class XslpLiaison implements XSLTLiaison { | public class XslpLiaison implements XSLTLiaison { | ||||
| XSLProcessor processor; | |||||
| XSLStylesheet xslSheet; | |||||
| protected XSLProcessor processor; | |||||
| protected XSLStylesheet xslSheet; | |||||
| public XslpLiaison() { | public XslpLiaison() { | ||||
| processor = new XSLProcessor(); | processor = new XSLProcessor(); | ||||
| // uh ?! I'm forced to do that otherwise a setProperty crashes with NPE ! | |||||
| // I don't understand why the property map is static though... | |||||
| // how can we do multithreading w/ multiple identical parameters ? | |||||
| processor.getProperty("dummy-to-init-properties-map"); | |||||
| } | } | ||||
| public void setStylesheet(String fileName) throws Exception { | |||||
| public void setStylesheet(File fileName) throws Exception { | |||||
| XSLReader xslReader = new XSLReader(); | XSLReader xslReader = new XSLReader(); | ||||
| xslSheet = xslReader.read( fileName ); | |||||
| }; | |||||
| // a file:/// + getAbsolutePath() does not work here | |||||
| // it is really the pathname | |||||
| xslSheet = xslReader.read( fileName.getAbsolutePath() ); | |||||
| } | |||||
| public void transform(String infile, String outfile) throws Exception { | |||||
| FileWriter out = new FileWriter(outfile); | |||||
| try { | |||||
| processor.process(infile, xslSheet, out); | |||||
| } finally { | |||||
| out.close(); | |||||
| } | |||||
| public void transform(File infile, File outfile) throws Exception { | |||||
| FileOutputStream fos = new FileOutputStream(outfile); | |||||
| // XSLP does not support encoding...we're in hot water. | |||||
| OutputStreamWriter out = new OutputStreamWriter(fos,"UTF8"); | |||||
| processor.process(infile.getAbsolutePath(), xslSheet, out); | |||||
| } | } | ||||
| public void addParam(String name, String expression){ | public void addParam(String name, String expression){ | ||||
| @@ -137,6 +137,12 @@ public class Depend extends MatchingTask { | |||||
| /** The classpath to look for additional dependencies */ | /** The classpath to look for additional dependencies */ | ||||
| private Path dependClasspath; | private Path dependClasspath; | ||||
| /** | |||||
| * constants used with the cache file | |||||
| */ | |||||
| private final static String CACHE_FILE_NAME = "dependencies.txt"; | |||||
| private final static String CLASSNAME_PREPEND = "||:"; | |||||
| /** | /** | ||||
| * Set the classpath to be used for this dependency check. | * Set the classpath to be used for this dependency check. | ||||
| */ | */ | ||||
| @@ -169,46 +175,74 @@ public class Depend extends MatchingTask { | |||||
| public void setClasspathRef(Reference r) { | public void setClasspathRef(Reference r) { | ||||
| createClasspath().setRefid(r); | createClasspath().setRefid(r); | ||||
| } | } | ||||
| private void writeDependencyList(File depFile, Vector dependencyList) throws IOException { | |||||
| // new dependencies so need to write them out to the cache | |||||
| PrintWriter pw = null; | |||||
| try { | |||||
| String parent = depFile.getParent(); | |||||
| if (parent != null) { | |||||
| new File(parent).mkdirs(); | |||||
| } | |||||
| pw = new PrintWriter(new FileWriter(depFile)); | |||||
| for (Enumeration deps = dependencyList.elements(); deps.hasMoreElements();) { | |||||
| pw.println(deps.nextElement()); | |||||
| } | |||||
| } | |||||
| finally { | |||||
| if (pw != null) { | |||||
| pw.close(); | |||||
| /** | |||||
| * Read the dependencies from cache file | |||||
| */ | |||||
| private Hashtable readCachedDependencies() throws IOException{ | |||||
| Hashtable dependencyMap = new Hashtable(); | |||||
| if (cache != null) { | |||||
| File depFile = new File(cache, CACHE_FILE_NAME); | |||||
| BufferedReader in = null; | |||||
| if (depFile.exists()) { | |||||
| try { | |||||
| in = new BufferedReader(new FileReader(depFile)); | |||||
| String line = null; | |||||
| Vector dependencyList = null; | |||||
| String className = null; | |||||
| int prependLength = CLASSNAME_PREPEND.length(); | |||||
| while ((line = in.readLine()) != null) { | |||||
| if (line.startsWith(CLASSNAME_PREPEND)) { | |||||
| dependencyList = new Vector(); | |||||
| className = line.substring(prependLength); | |||||
| dependencyMap.put(className, dependencyList); | |||||
| } | |||||
| else { | |||||
| dependencyList.addElement(line); | |||||
| } | |||||
| } | |||||
| } | |||||
| finally { | |||||
| if (in != null) { | |||||
| in.close(); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| return dependencyMap; | |||||
| } | } | ||||
| private Vector readDependencyList(File depFile) throws IOException { | |||||
| Vector dependencyList = null; | |||||
| BufferedReader in = null; | |||||
| try { | |||||
| in = new BufferedReader(new FileReader(depFile)); | |||||
| String line = null; | |||||
| dependencyList = new Vector(); | |||||
| while ((line = in.readLine()) != null) { | |||||
| dependencyList.addElement(line); | |||||
| /** | |||||
| * Write the dependencies to cache file | |||||
| */ | |||||
| private void writeCachedDependencies(Hashtable dependencyMap) throws IOException{ | |||||
| if (cache != null) { | |||||
| PrintWriter pw = null; | |||||
| try { | |||||
| cache.mkdirs(); | |||||
| File depFile = new File(cache, CACHE_FILE_NAME); | |||||
| pw = new PrintWriter(new FileWriter(depFile)); | |||||
| for (Enumeration deps = dependencyMap.keys(); deps.hasMoreElements();) { | |||||
| String className = (String)deps.nextElement(); | |||||
| pw.println(CLASSNAME_PREPEND + className); | |||||
| Vector dependencyList = (Vector)dependencyMap.get(className); | |||||
| int size = dependencyList.size(); | |||||
| for (int x = 0; x < size; x++) { | |||||
| pw.println(dependencyList.elementAt(x)); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | |||||
| finally { | |||||
| if (in != null) { | |||||
| in.close(); | |||||
| finally { | |||||
| if (pw != null) { | |||||
| pw.close(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| return dependencyList; | |||||
| } | } | ||||
| @@ -221,7 +255,20 @@ public class Depend extends MatchingTask { | |||||
| private void determineDependencies() throws IOException { | private void determineDependencies() throws IOException { | ||||
| affectedClassMap = new Hashtable(); | affectedClassMap = new Hashtable(); | ||||
| classFileInfoMap = new Hashtable(); | classFileInfoMap = new Hashtable(); | ||||
| Hashtable dependencyMap = new Hashtable(); | |||||
| boolean cacheDirty = false; | |||||
| Hashtable dependencyMap = null; | |||||
| File depCacheFile = null; | |||||
| boolean depCacheFileExists = true; | |||||
| long depCacheFileLastModified = Long.MAX_VALUE; | |||||
| // read the dependency cache from the disk | |||||
| if (cache != null) { | |||||
| dependencyMap = readCachedDependencies(); | |||||
| depCacheFile = new File(cache, CACHE_FILE_NAME); | |||||
| depCacheFileExists = depCacheFile.exists(); | |||||
| depCacheFileLastModified = depCacheFile.lastModified(); | |||||
| } | |||||
| for (Enumeration e = getClassFiles(destPath).elements(); e.hasMoreElements(); ) { | for (Enumeration e = getClassFiles(destPath).elements(); e.hasMoreElements(); ) { | ||||
| ClassFileInfo info = (ClassFileInfo)e.nextElement(); | ClassFileInfo info = (ClassFileInfo)e.nextElement(); | ||||
| log("Adding class info for " + info.className, Project.MSG_DEBUG); | log("Adding class info for " + info.className, Project.MSG_DEBUG); | ||||
| @@ -230,12 +277,11 @@ public class Depend extends MatchingTask { | |||||
| Vector dependencyList = null; | Vector dependencyList = null; | ||||
| if (cache != null) { | if (cache != null) { | ||||
| // try to read the dependency info from the cache if it is not out of date | |||||
| File depFile = new File(cache, info.relativeName + ".dep"); | |||||
| if (depFile.exists() && depFile.lastModified() > info.absoluteFile.lastModified()) { | |||||
| // try to read the dependency info from the map if it is not out of date | |||||
| if (depCacheFileExists && depCacheFileLastModified > info.absoluteFile.lastModified()) { | |||||
| // depFile exists and is newer than the class file | // depFile exists and is newer than the class file | ||||
| // need to read dependency list from the file. | |||||
| dependencyList = readDependencyList(depFile); | |||||
| // need to get dependency list from the map. | |||||
| dependencyList = (Vector)dependencyMap.get(info.className); | |||||
| } | } | ||||
| } | } | ||||
| @@ -248,12 +294,11 @@ public class Depend extends MatchingTask { | |||||
| classFile.read(inFileStream); | classFile.read(inFileStream); | ||||
| dependencyList = classFile.getClassRefs(); | dependencyList = classFile.getClassRefs(); | ||||
| if (cache != null) { | |||||
| // new dependencies so need to write them out to the cache | |||||
| File depFile = new File(cache, info.relativeName + ".dep"); | |||||
| writeDependencyList(depFile, dependencyList); | |||||
| if (dependencyList != null) { | |||||
| cacheDirty = true; | |||||
| dependencyMap.put(info.className, dependencyList); | |||||
| } | } | ||||
| } | } | ||||
| finally { | finally { | ||||
| if (inFileStream != null) { | if (inFileStream != null) { | ||||
| @@ -261,8 +306,7 @@ public class Depend extends MatchingTask { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| dependencyMap.put(info.className, dependencyList); | |||||
| // This class depends on each class in the dependency list. For each | // This class depends on each class in the dependency list. For each | ||||
| // one of those, add this class into their affected classes list | // one of those, add this class into their affected classes list | ||||
| for (Enumeration depEnum = dependencyList.elements(); depEnum.hasMoreElements(); ) { | for (Enumeration depEnum = dependencyList.elements(); depEnum.hasMoreElements(); ) { | ||||
| @@ -326,6 +370,11 @@ public class Depend extends MatchingTask { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| // write the dependency cache to the disk | |||||
| if (cache != null && cacheDirty) { | |||||
| writeCachedDependencies(dependencyMap); | |||||
| } | |||||
| } | } | ||||
| private int deleteAllAffectedFiles() { | private int deleteAllAffectedFiles() { | ||||
| @@ -87,6 +87,7 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| * Bunch of constants used for storing entries in a hashtable, and for | * Bunch of constants used for storing entries in a hashtable, and for | ||||
| * constructing the filenames of various parts of the ejb jar. | * constructing the filenames of various parts of the ejb jar. | ||||
| */ | */ | ||||
| private static final String EJB_REF = "ejb-ref"; | |||||
| private static final String HOME_INTERFACE = "home"; | private static final String HOME_INTERFACE = "home"; | ||||
| private static final String REMOTE_INTERFACE = "remote"; | private static final String REMOTE_INTERFACE = "remote"; | ||||
| private static final String BEAN_CLASS = "ejb-class"; | private static final String BEAN_CLASS = "ejb-class"; | ||||
| @@ -130,6 +131,8 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| private Hashtable resourceDTDs = new Hashtable(); | private Hashtable resourceDTDs = new Hashtable(); | ||||
| private boolean inEJBRef = false; | |||||
| private Hashtable urlDTDs = new Hashtable(); | private Hashtable urlDTDs = new Hashtable(); | ||||
| /** | /** | ||||
| @@ -244,6 +247,7 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| public void startDocument() throws SAXException { | public void startDocument() throws SAXException { | ||||
| this.ejbFiles = new Hashtable(10, 1); | this.ejbFiles = new Hashtable(10, 1); | ||||
| this.currentElement = null; | this.currentElement = null; | ||||
| inEJBRef = false; | |||||
| } | } | ||||
| @@ -258,7 +262,10 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| throws SAXException { | throws SAXException { | ||||
| this.currentElement = name; | this.currentElement = name; | ||||
| currentText = ""; | currentText = ""; | ||||
| if (parseState == STATE_LOOKING_EJBJAR && name.equals(EJB_JAR)) { | |||||
| if (name.equals(EJB_REF)) { | |||||
| inEJBRef = true; | |||||
| } | |||||
| else if (parseState == STATE_LOOKING_EJBJAR && name.equals(EJB_JAR)) { | |||||
| parseState = STATE_IN_EJBJAR; | parseState = STATE_IN_EJBJAR; | ||||
| } | } | ||||
| else if (parseState == STATE_IN_EJBJAR && name.equals(ENTERPRISE_BEANS)) { | else if (parseState == STATE_IN_EJBJAR && name.equals(ENTERPRISE_BEANS)) { | ||||
| @@ -286,7 +293,10 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| processElement(); | processElement(); | ||||
| currentText = ""; | currentText = ""; | ||||
| this.currentElement = ""; | this.currentElement = ""; | ||||
| if (parseState == STATE_IN_ENTITY && name.equals(ENTITY_BEAN )) { | |||||
| if (name.equals(EJB_REF)) { | |||||
| inEJBRef = false; | |||||
| } | |||||
| else if (parseState == STATE_IN_ENTITY && name.equals(ENTITY_BEAN )) { | |||||
| parseState = STATE_IN_BEANS; | parseState = STATE_IN_BEANS; | ||||
| } | } | ||||
| else if (parseState == STATE_IN_SESSION && name.equals(SESSION_BEAN)) { | else if (parseState == STATE_IN_SESSION && name.equals(SESSION_BEAN)) { | ||||
| @@ -323,7 +333,8 @@ public class DescriptorHandler extends org.xml.sax.HandlerBase { | |||||
| protected void processElement() { | protected void processElement() { | ||||
| if (parseState != STATE_IN_ENTITY && parseState != STATE_IN_SESSION) { | |||||
| if (inEJBRef || | |||||
| (parseState != STATE_IN_ENTITY && parseState != STATE_IN_SESSION)) { | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -263,12 +263,11 @@ public class WLRun extends Task { | |||||
| File propertiesFile = null; | File propertiesFile = null; | ||||
| if (weblogicPropertiesFile == null) { | if (weblogicPropertiesFile == null) { | ||||
| propertiesFile = new File(weblogicSystemHome, DEFAULT_PROPERTIES_FILE); | |||||
| } | |||||
| else { | |||||
| propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile); | |||||
| weblogicPropertiesFile = DEFAULT_PROPERTIES_FILE; | |||||
| } | } | ||||
| propertiesFile = new File(weblogicSystemHome, weblogicPropertiesFile); | |||||
| if (!propertiesFile.exists()) { | if (!propertiesFile.exists()) { | ||||
| // OK, properties file may be absolute | // OK, properties file may be absolute | ||||
| propertiesFile = project.resolveFile(weblogicPropertiesFile); | propertiesFile = project.resolveFile(weblogicPropertiesFile); | ||||
| @@ -176,8 +176,8 @@ public class FilterSet extends DataType { | |||||
| /** The default token end string */ | /** The default token end string */ | ||||
| public static final String DEFAULT_TOKEN_END = "@"; | public static final String DEFAULT_TOKEN_END = "@"; | ||||
| private String startOftoken = DEFAULT_TOKEN_START; | |||||
| private String endOftoken = DEFAULT_TOKEN_END; | |||||
| private String startOfToken = DEFAULT_TOKEN_START; | |||||
| private String endOfToken = DEFAULT_TOKEN_END; | |||||
| /** | /** | ||||
| * List of ordered filters and filter files. | * List of ordered filters and filter files. | ||||
| @@ -245,9 +245,17 @@ public class FilterSet extends DataType { | |||||
| if (isReference()) { | if (isReference()) { | ||||
| throw tooManyAttributes(); | throw tooManyAttributes(); | ||||
| } | } | ||||
| startOftoken = startOfToken; | |||||
| this.startOfToken = startOfToken; | |||||
| } | |||||
| public String getBeginToken() { | |||||
| if (isReference()) { | |||||
| return getRef().getBeginToken(); | |||||
| } | |||||
| return startOfToken; | |||||
| } | } | ||||
| /** | /** | ||||
| * The string used to id the end of a token. | * The string used to id the end of a token. | ||||
| * | * | ||||
| @@ -257,9 +265,17 @@ public class FilterSet extends DataType { | |||||
| if (isReference()) { | if (isReference()) { | ||||
| throw tooManyAttributes(); | throw tooManyAttributes(); | ||||
| } | } | ||||
| endOftoken = endOfToken; | |||||
| this.endOfToken = endOfToken; | |||||
| } | |||||
| public String getEndToken() { | |||||
| if (isReference()) { | |||||
| return getRef().getEndToken(); | |||||
| } | |||||
| return endOfToken; | |||||
| } | } | ||||
| /** | /** | ||||
| * Read the filters from the given file. | * Read the filters from the given file. | ||||
| * | * | ||||
| @@ -268,6 +284,10 @@ public class FilterSet extends DataType { | |||||
| * file. | * file. | ||||
| */ | */ | ||||
| public void readFiltersFromFile(File filtersFile) throws BuildException { | public void readFiltersFromFile(File filtersFile) throws BuildException { | ||||
| if (isReference()) { | |||||
| throw tooManyAttributes(); | |||||
| } | |||||
| if (filtersFile.isFile()) { | if (filtersFile.isFile()) { | ||||
| log("Reading filters from " + filtersFile, Project.MSG_VERBOSE ); | log("Reading filters from " + filtersFile, Project.MSG_VERBOSE ); | ||||
| FileInputStream in = null; | FileInputStream in = null; | ||||
| @@ -310,7 +330,9 @@ public class FilterSet extends DataType { | |||||
| * @return The string with the tokens replaced. | * @return The string with the tokens replaced. | ||||
| */ | */ | ||||
| public String replaceTokens(String line) { | public String replaceTokens(String line) { | ||||
| int index = line.indexOf(startOftoken); | |||||
| String beginToken = getBeginToken(); | |||||
| String endToken = getEndToken(); | |||||
| int index = line.indexOf(beginToken); | |||||
| if (index > -1) { | if (index > -1) { | ||||
| Hashtable tokens = getFilterHash(); | Hashtable tokens = getFilterHash(); | ||||
| @@ -321,24 +343,24 @@ public class FilterSet extends DataType { | |||||
| String value = null; | String value = null; | ||||
| do { | do { | ||||
| int endIndex = line.indexOf(endOftoken, index + startOftoken.length() + 1 ); | |||||
| int endIndex = line.indexOf(endToken, index + beginToken.length() + 1 ); | |||||
| if (endIndex == -1) { | if (endIndex == -1) { | ||||
| break; | break; | ||||
| } | } | ||||
| token = line.substring(index + startOftoken.length(), endIndex ); | |||||
| token = line.substring(index + beginToken.length(), endIndex ); | |||||
| b.append(line.substring(i, index)); | b.append(line.substring(i, index)); | ||||
| if (tokens.containsKey(token)) { | if (tokens.containsKey(token)) { | ||||
| value = (String)tokens.get(token); | value = (String)tokens.get(token); | ||||
| log( "Replacing: " + startOftoken + token + endOftoken + " -> " + value, Project.MSG_VERBOSE ); | |||||
| log( "Replacing: " + beginToken + token + endToken + " -> " + value, Project.MSG_VERBOSE ); | |||||
| b.append(value); | b.append(value); | ||||
| i = index + startOftoken.length() + token.length() + endOftoken.length(); | |||||
| i = index + beginToken.length() + token.length() + endToken.length(); | |||||
| } | } | ||||
| else { | else { | ||||
| // just append startOftoken and search further | |||||
| b.append(startOftoken); | |||||
| i = index + startOftoken.length(); | |||||
| // just append beginToken and search further | |||||
| b.append(beginToken); | |||||
| i = index + beginToken.length(); | |||||
| } | } | ||||
| } while ((index = line.indexOf( startOftoken, i )) > -1 ); | |||||
| } while ((index = line.indexOf( beginToken, i )) > -1 ); | |||||
| b.append(line.substring(i)); | b.append(line.substring(i)); | ||||
| return b.toString(); | return b.toString(); | ||||
| @@ -0,0 +1,127 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.types; | |||||
| // java io classes | |||||
| import java.io.File; | |||||
| import java.io.FileInputStream; | |||||
| import java.io.IOException; | |||||
| // java util classes | |||||
| import java.util.Enumeration; | |||||
| import java.util.Hashtable; | |||||
| import java.util.Properties; | |||||
| import java.util.Vector; | |||||
| // ant classes | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| /** | |||||
| * A FilterSetCollection is a collection of filtersets each of which may have | |||||
| * a different start/end token settings. | |||||
| * | |||||
| * @author <A href="mailto:conor@apache.org">Conor MacNeill</A> | |||||
| */ | |||||
| public class FilterSetCollection { | |||||
| private Vector filterSets = new Vector(); | |||||
| public FilterSetCollection() { | |||||
| } | |||||
| public FilterSetCollection(FilterSet filterSet) { | |||||
| addFilterSet(filterSet); | |||||
| } | |||||
| public void addFilterSet(FilterSet filterSet) { | |||||
| filterSets.addElement(filterSet); | |||||
| } | |||||
| /** | |||||
| * Does replacement on the given string with token matching. | |||||
| * This uses the defined starttoken and endtoken values which default to @ for both. | |||||
| * | |||||
| * @param line The line to process the tokens in. | |||||
| * @return The string with the tokens replaced. | |||||
| */ | |||||
| public String replaceTokens(String line) { | |||||
| String replacedLine = line; | |||||
| for (Enumeration e = filterSets.elements(); e.hasMoreElements();) { | |||||
| FilterSet filterSet = (FilterSet)e.nextElement(); | |||||
| replacedLine = filterSet.replaceTokens(replacedLine); | |||||
| } | |||||
| return replacedLine; | |||||
| } | |||||
| /** | |||||
| * Test to see if this filter set it empty. | |||||
| * | |||||
| * @return Return true if there are filter in this set otherwise false. | |||||
| */ | |||||
| public boolean hasFilters() { | |||||
| for (Enumeration e = filterSets.elements(); e.hasMoreElements();) { | |||||
| FilterSet filterSet = (FilterSet)e.nextElement(); | |||||
| if (filterSet.hasFilters()) { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| } | |||||
| @@ -61,7 +61,7 @@ import java.util.Stack; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.types.FilterSet; | |||||
| import org.apache.tools.ant.types.FilterSetCollection; | |||||
| /** | /** | ||||
| * This class also encapsulates methods which allow Files to be | * This class also encapsulates methods which allow Files to be | ||||
| @@ -106,10 +106,10 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(String sourceFile, String destFile, FilterSet filterSet) | |||||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters) | |||||
| throws IOException | throws IOException | ||||
| { | { | ||||
| copyFile(new File(sourceFile), new File(destFile), filterSet, false, false); | |||||
| copyFile(new File(sourceFile), new File(destFile), filters, false, false); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -119,9 +119,9 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(String sourceFile, String destFile, FilterSet filterSet, | |||||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, | |||||
| boolean overwrite) throws IOException { | boolean overwrite) throws IOException { | ||||
| copyFile(new File(sourceFile), new File(destFile), filterSet, | |||||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||||
| overwrite, false); | overwrite, false); | ||||
| } | } | ||||
| @@ -134,10 +134,10 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(String sourceFile, String destFile, FilterSet filterSet, | |||||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, | |||||
| boolean overwrite, boolean preserveLastModified) | boolean overwrite, boolean preserveLastModified) | ||||
| throws IOException { | throws IOException { | ||||
| copyFile(new File(sourceFile), new File(destFile), filterSet, | |||||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||||
| overwrite, preserveLastModified); | overwrite, preserveLastModified); | ||||
| } | } | ||||
| @@ -157,9 +157,9 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(File sourceFile, File destFile, FilterSet filterSet) | |||||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters) | |||||
| throws IOException { | throws IOException { | ||||
| copyFile(sourceFile, destFile, filterSet, false, false); | |||||
| copyFile(sourceFile, destFile, filters, false, false); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -169,9 +169,9 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(File sourceFile, File destFile, FilterSet filterSet, | |||||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, | |||||
| boolean overwrite) throws IOException { | boolean overwrite) throws IOException { | ||||
| copyFile(sourceFile, destFile, filterSet, overwrite, false); | |||||
| copyFile(sourceFile, destFile, filters, overwrite, false); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -183,7 +183,7 @@ public class FileUtils { | |||||
| * | * | ||||
| * @throws IOException | * @throws IOException | ||||
| */ | */ | ||||
| public void copyFile(File sourceFile, File destFile, FilterSet filterSet, | |||||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, | |||||
| boolean overwrite, boolean preserveLastModified) | boolean overwrite, boolean preserveLastModified) | ||||
| throws IOException { | throws IOException { | ||||
| @@ -201,7 +201,7 @@ public class FileUtils { | |||||
| parent.mkdirs(); | parent.mkdirs(); | ||||
| } | } | ||||
| if (filterSet != null && filterSet.hasFilters()) { | |||||
| if (filters != null && filters.hasFilters()) { | |||||
| BufferedReader in = new BufferedReader(new FileReader(sourceFile)); | BufferedReader in = new BufferedReader(new FileReader(sourceFile)); | ||||
| BufferedWriter out = new BufferedWriter(new FileWriter(destFile)); | BufferedWriter out = new BufferedWriter(new FileWriter(destFile)); | ||||
| @@ -212,7 +212,7 @@ public class FileUtils { | |||||
| if (line.length() == 0) { | if (line.length() == 0) { | ||||
| out.newLine(); | out.newLine(); | ||||
| } else { | } else { | ||||
| newline = filterSet.replaceTokens(line); | |||||
| newline = filters.replaceTokens(line); | |||||
| out.write(newline); | out.write(newline); | ||||
| out.newLine(); | out.newLine(); | ||||
| } | } | ||||
| @@ -0,0 +1,128 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * | |||||
| */ | |||||
| import junit.framework.TestCase; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| import org.w3c.dom.Document; | |||||
| import javax.xml.parsers.DocumentBuilder; | |||||
| import javax.xml.parsers.DocumentBuilderFactory; | |||||
| import java.io.File; | |||||
| import java.net.URL; | |||||
| /** | |||||
| * Abtract testcase for XSLTLiaison. | |||||
| * Override createLiaison for each XSLTLiaison. | |||||
| * | |||||
| * <a href="sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public abstract class AbstractXSLTLiaisonTest extends TestCase { | |||||
| protected XSLTLiaison liaison; | |||||
| protected AbstractXSLTLiaisonTest(String name){ | |||||
| super(name); | |||||
| } | |||||
| protected void setUp() throws Exception { | |||||
| liaison = createLiaison(); | |||||
| } | |||||
| // to override | |||||
| protected abstract XSLTLiaison createLiaison() throws Exception ; | |||||
| protected File getFile(String name){ | |||||
| URL url = getClass().getResource(name); | |||||
| return new File(url.getFile()); | |||||
| } | |||||
| /** keep it simple stupid */ | |||||
| public void testTransform() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| liaison.addParam("param", "value"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xml"); | |||||
| File out = new File("xsltliaison.tmp"); | |||||
| try { | |||||
| liaison.transform(in, out); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| public void testEncoding() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xsltliaison-encoding-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-encoding-in.xml"); | |||||
| File out = new File("xsltliaison-encoding.tmp"); | |||||
| try { | |||||
| liaison.transform(in, out); | |||||
| Document doc = parseXML(out); | |||||
| assertEquals("root",doc.getDocumentElement().getNodeName()); | |||||
| assertEquals("message",doc.getDocumentElement().getFirstChild().getNodeName()); | |||||
| assertEquals("\u00E9\u00E0\u00E8\u00EF\u00F9",doc.getDocumentElement().getFirstChild().getFirstChild().getNodeValue()); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| public Document parseXML(File file) throws Exception { | |||||
| DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); | |||||
| DocumentBuilder dbuilder = dbfactory.newDocumentBuilder(); | |||||
| return dbuilder.parse(file); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,87 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| import java.io.File; | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * | |||||
| */ | |||||
| /** | |||||
| * TraX XSLTLiaison testcase | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class TraXLiaisonTest extends AbstractXSLTLiaisonTest { | |||||
| public TraXLiaisonTest(String name){ | |||||
| super(name); | |||||
| } | |||||
| public XSLTLiaison createLiaison() throws Exception { | |||||
| return new TraXLiaison(); | |||||
| } | |||||
| public void testXalan2Redirect() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| File out = new File("xalan2-redirect-out-dummy.tmp"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| try { | |||||
| liaison.addParam("xalan-version", "2"); | |||||
| liaison.transform(in, out); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,88 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * | |||||
| */ | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| import java.io.File; | |||||
| /** | |||||
| * Xalan Liaison testcase | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class XalanLiaisonTest extends AbstractXSLTLiaisonTest { | |||||
| public XalanLiaisonTest(String name){ | |||||
| super(name); | |||||
| } | |||||
| protected XSLTLiaison createLiaison() throws Exception { | |||||
| return new XalanLiaison(); | |||||
| } | |||||
| public void testXalan1Redirect() throws Exception { | |||||
| File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl"); | |||||
| liaison.setStylesheet(xsl); | |||||
| File out = new File("xalan1-redirect-out-dummy.tmp"); | |||||
| File in = getFile("/taskdefs/optional/xsltliaison-in.xsl"); | |||||
| try { | |||||
| liaison.addParam("xalan-version", "1"); | |||||
| liaison.transform(in, out); | |||||
| } finally { | |||||
| out.delete(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,72 @@ | |||||
| package org.apache.tools.ant.taskdefs.optional; | |||||
| import org.apache.tools.ant.taskdefs.XSLTLiaison; | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Jakarta-Regexp", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| * | |||||
| */ | |||||
| /** | |||||
| * XSLP Liaison testcase | |||||
| * @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a> | |||||
| */ | |||||
| public class XslpLiaisonTest extends AbstractXSLTLiaisonTest { | |||||
| public XslpLiaisonTest(String name){ | |||||
| super(name); | |||||
| } | |||||
| protected XSLTLiaison createLiaison() throws Exception { | |||||
| return new XslpLiaison(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,144 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
| * reserved. | |||||
| * | |||||
| * Redistribution and use in source and binary forms, with or without | |||||
| * modification, are permitted provided that the following conditions | |||||
| * are met: | |||||
| * | |||||
| * 1. Redistributions of source code must retain the above copyright | |||||
| * notice, this list of conditions and the following disclaimer. | |||||
| * | |||||
| * 2. Redistributions in binary form must reproduce the above copyright | |||||
| * notice, this list of conditions and the following disclaimer in | |||||
| * the documentation and/or other materials provided with the | |||||
| * distribution. | |||||
| * | |||||
| * 3. The end-user documentation included with the redistribution, if | |||||
| * any, must include the following acknowlegement: | |||||
| * "This product includes software developed by the | |||||
| * Apache Software Foundation (http://www.apache.org/)." | |||||
| * Alternately, this acknowlegement may appear in the software itself, | |||||
| * if and wherever such third-party acknowlegements normally appear. | |||||
| * | |||||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||||
| * Foundation" must not be used to endorse or promote products derived | |||||
| * from this software without prior written permission. For written | |||||
| * permission, please contact apache@apache.org. | |||||
| * | |||||
| * 5. Products derived from this software may not be called "Apache" | |||||
| * nor may "Apache" appear in their names without prior written | |||||
| * permission of the Apache Group. | |||||
| * | |||||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
| * SUCH DAMAGE. | |||||
| * ==================================================================== | |||||
| * | |||||
| * This software consists of voluntary contributions made by many | |||||
| * individuals on behalf of the Apache Software Foundation. For more | |||||
| * information on the Apache Software Foundation, please see | |||||
| * <http://www.apache.org/>. | |||||
| */ | |||||
| package org.apache.tools.ant.types; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.taskdefs.TaskdefsTest; | |||||
| import junit.framework.TestCase; | |||||
| import junit.framework.AssertionFailedError; | |||||
| import java.io.*; | |||||
| /** | |||||
| * FilterSet testing | |||||
| * | |||||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||||
| */ | |||||
| public class FilterSetTest extends TaskdefsTest { | |||||
| static private final int BUF_SIZE = 32768; | |||||
| private Project project; | |||||
| public FilterSetTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject("src/etc/testcases/types/filterset.xml"); | |||||
| } | |||||
| public void test1() { | |||||
| executeTarget("test1"); | |||||
| assertTrue("Filterset 1 failed", compareFiles("src/etc/testcases/types/gold/filterset1.txt", | |||||
| "src/etc/testcases/types/dest1.txt")); | |||||
| } | |||||
| public void test2() { | |||||
| executeTarget("test2"); | |||||
| assertTrue("Filterset 2 failed", compareFiles("src/etc/testcases/types/gold/filterset2.txt", | |||||
| "src/etc/testcases/types/dest2.txt")); | |||||
| } | |||||
| public void test3() { | |||||
| executeTarget("test3"); | |||||
| assertTrue("Filterset 3 failed", compareFiles("src/etc/testcases/types/gold/filterset3.txt", | |||||
| "src/etc/testcases/types/dest3.txt")); | |||||
| } | |||||
| private boolean compareFiles(String name1, String name2) { | |||||
| File file1 = new File(name1); | |||||
| File file2 = new File(name2); | |||||
| try { | |||||
| if (!file1.exists() || !file2.exists()) { | |||||
| System.out.println("One or both files do not exist:" + name1 + ", " + name2); | |||||
| return false; | |||||
| } | |||||
| if (file1.length() != file2.length()) { | |||||
| System.out.println("File size mismatch:" + name1 + "(" + file1.length() + "), " + | |||||
| name2 + "(" + file2.length() + ")"); | |||||
| return false; | |||||
| } | |||||
| // byte - byte compare | |||||
| byte[] buffer1 = new byte[BUF_SIZE]; | |||||
| byte[] buffer2 = new byte[BUF_SIZE]; | |||||
| FileInputStream fis1 = new FileInputStream(file1); | |||||
| FileInputStream fis2 = new FileInputStream(file2); | |||||
| int index = 0; | |||||
| int read = 0; | |||||
| while ((read = fis1.read(buffer1)) != -1) { | |||||
| fis2.read(buffer2); | |||||
| for (int i = 0; i < read; ++i, ++index) { | |||||
| if (buffer1[i] != buffer2[i]) { | |||||
| System.out.println("Bytes mismatch:" + name1 + ", " + name2 + | |||||
| " at byte " + index); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| catch (IOException e) { | |||||
| System.out.println("IOException comparing files: " + name1 + ", " + name2); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -77,7 +77,8 @@ public class FileUtilsTest extends TestCase { | |||||
| public void setUp() { | public void setUp() { | ||||
| fu = FileUtils.newFileUtils(); | fu = FileUtils.newFileUtils(); | ||||
| root = new File(File.separator).getAbsolutePath(); | |||||
| // Windows adds the drive letter in uppercase, unless you run Cygnus | |||||
| root = new File(File.separator).getAbsolutePath().toUpperCase(); | |||||
| } | } | ||||
| public void tearDown() { | public void tearDown() { | ||||