git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271848 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,3 +1,7 @@ | |||
| ***** Filter Readers is now available in Ant's main development tree ***** | |||
| Ant Filter Readers | |||
| ================== | |||
| @@ -1,97 +0,0 @@ | |||
| <html> | |||
| <head> | |||
| <title>LoadFile Task</title> | |||
| </head> | |||
| <body> | |||
| <h2><a name="loadfile">LoadFile</a></h2> | |||
| <h3>Description</h3> | |||
| <p> | |||
| Load a text file into a single property. Unless an encoding is specified, | |||
| the encoding of the current locale is used. | |||
| </p> | |||
| <h3>Parameters</h3> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">srcFile</td> | |||
| <td valign="top">source file</td> | |||
| <td valign="top" align="center">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">property</td> | |||
| <td valign="top">property to save to</td> | |||
| <td valign="top" align="center">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">encoding</td> | |||
| <td valign="top">encoding to use when loading the file</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">failonerror</td> | |||
| <td valign="top">Whether to halt the build on failure</td> | |||
| <td align="center" valign="top">No, default "true"</td> | |||
| </tr> | |||
| </table> | |||
| <p> | |||
| The LoadFile task supports nested <a href="../CoreTypes/filterchain.html"> | |||
| FilterChain</a>s. | |||
| <h3>Examples</h3> | |||
| <pre> <loadfile property="message" | |||
| srcFile="message.txt" /> | |||
| </pre> | |||
| Load file message.txt into property "message"; an <tt><echo></tt> | |||
| can print this. | |||
| <pre> <loadfile property="encoded-file" | |||
| srcFile="loadfile.xml" | |||
| encoding="ISO-8859-1" /> | |||
| </pre> | |||
| Load a file using the latin-1 encoding | |||
| <pre> <loadfile | |||
| property="optional.value" | |||
| srcFile="optional.txt" | |||
| failonerror="false" /> | |||
| </pre> | |||
| Load a file, don't fail if it is missing (a message is printed, though) | |||
| <pre> <loadfile | |||
| property="mail.recipients" | |||
| srcFile="recipientlist.txt"> | |||
| <filterchain> | |||
| <<a href="../CoreTypes/filterchain.html#striplinebreaks">striplinebreaks</a>/> | |||
| </filterchaint> | |||
| </loadfile> | |||
| </pre> | |||
| Load a property which can be used as a parameter for another task (in this case mail), | |||
| merging lines to ensure this happens. | |||
| <pre> <loadfile | |||
| property="system.configuration.xml" | |||
| srcFile="configuration.xml"> | |||
| <<a href="../CoreTypes/filterchain.html#expandproperties">expandproperties</a>/> | |||
| </loadfile> | |||
| </pre> | |||
| Load an XML file into a property, expanding all properties declared | |||
| in the file in the process. | |||
| <hr> | |||
| <p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | |||
| Reserved.</p> | |||
| </body> | |||
| </html> | |||
| @@ -1,59 +0,0 @@ | |||
| <html> | |||
| <head> | |||
| <title>LoadProperties Task</title> | |||
| </head> | |||
| <body> | |||
| <h2><a name="loadproperties">LoadProperties</a></h2> | |||
| <h3>Description</h3> | |||
| <p> | |||
| Load a file's contents as Ant properties. This is equivalent | |||
| to <property file="..."/> except that it | |||
| supports nested <filterchain> elements and it cannot be | |||
| specified outside a target. | |||
| </p> | |||
| <h3>Parameters</h3> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">srcFile</td> | |||
| <td valign="top">source file</td> | |||
| <td valign="top" align="center">Yes</td> | |||
| </tr> | |||
| </table> | |||
| <p> | |||
| The LoadProperties task supports nested <a href="../CoreTypes/filterchain.html"> | |||
| FilterChain</a>s. | |||
| <h3>Examples</h3> | |||
| <pre> <loadproperties srcFile="file.properties" /> | |||
| </pre> | |||
| Load contents of file.properties as Ant properties. | |||
| <pre> <loadproperties srcFile="file.properties"> | |||
| <filterchain> | |||
| <<a href="../CoreTypes/filterchain.html#linecontains">linecontains</a>> | |||
| <contains value="import."/> | |||
| <linecontains/> | |||
| </filterchaint> | |||
| </loadproperties> | |||
| </pre> | |||
| Read the lines that contain the string "import." | |||
| from the file "file.properties" and load them as | |||
| Ant properties. | |||
| <hr> | |||
| <p align="center">Copyright © 2002 Apache Software Foundation. All rights | |||
| Reserved.</p> | |||
| </body> | |||
| </html> | |||
| @@ -1,488 +0,0 @@ | |||
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> | |||
| <HTML> | |||
| <HEAD> | |||
| <TITLE>FilterChains and FilterReaders</TITLE> | |||
| </HEAD> | |||
| <BODY> | |||
| <H2>FilterChains and FilterReaders</H2> | |||
| Look at Unix pipes - they offer you so much flexibility - | |||
| say you wanted to copy just those lines that contained the | |||
| string blee from the first 10 lines of a file 'foo' | |||
| to a file 'bar' - you would do something like<P> | |||
| <code> | |||
| cat foo|head -n10|grep blee > bar | |||
| </code><P> | |||
| Ant was not flexible enough. There was no way for the | |||
| <copy> task to do something similar. If you wanted | |||
| the <copy> task to get the first 10 lines, you would have | |||
| had to create special attributes:<P> | |||
| <code> | |||
| <copy file="foo" tofile="bar" head="10" contains="blee"/> | |||
| </code><P> | |||
| The obvious problem thus surfaced: Ant tasks would not be able | |||
| to accomodate such data transformation attributes as they would | |||
| be endless. The task would also not know in which order these | |||
| attributes were to be interpreted. That is, must the task execute the | |||
| contains attribute first and then the head attribute or vice-versa? | |||
| What Ant tasks needed was a mechanism to allow pluggable filter (data | |||
| tranformer) chains. Ant would provide a few filters for which there | |||
| have been repeated requests. Users with special filtering needs | |||
| would be able to easily write their own and plug them in.<P> | |||
| The solution was to refactor data transformation oriented | |||
| tasks to support FilterChains. A FilterChain is a group of | |||
| ordered FilterReaders. Users can define their own FilterReaders | |||
| by just extending the java.io.FilterReader class. Such custom | |||
| FilterReaders can be easily plugged in as nested elements of | |||
| <filterchain> by using <filterreader> elements. | |||
| <P> | |||
| Example: | |||
| <BLOCKQUOTE><PRE> | |||
| <copy file="${src.file}" tofile="${dest.file}"> | |||
| <filterchain> | |||
| <filterreader classname="your.extension.of.java.io.FilterReader"> | |||
| <param name="foo" value="bar"/> | |||
| </filterreader> | |||
| <filterreader classname="another.extension.of.java.io.FilterReader"> | |||
| <classpath> | |||
| <pathelement path="${classpath}"/> | |||
| </classpath> | |||
| <param name="blah" value="blee"/> | |||
| <param type="abra" value="cadabra"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </copy> | |||
| </PRE></BLOCKQUOTE> | |||
| Ant provides some built-in filter readers. These filter readers | |||
| can also be declared using a syntax similar to the above syntax. | |||
| However, they can be declared using some simpler syntax also.<P> | |||
| Example: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.head}"> | |||
| <filterchain> | |||
| <headfilter lines="15"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| is equivalent to: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.head}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.HeadFilter"> | |||
| <param name="lines" value="15"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| The following built-in tasks support nested <filterchain> elements.<BR> | |||
| <a href="../CoreTasks/copy.html">Copy</a>,<BR> | |||
| <a href="../CoreTasks/loadfile.html">LoadFile</a>,<BR> | |||
| <a href="../CoreTasks/loadproperties.html">LoadProperties</a>,<BR> | |||
| <a href="../CoreTasks/move.html">Move</a><BR><BR> | |||
| A FilterChain is formed by defining zero or more of the following | |||
| nested elements.<BR> | |||
| <a href="#filterreader">FilterReader</a><BR> | |||
| <a href="#classconstants">ClassConstants</a><BR> | |||
| <a href="#expandproperties">ExpandProperties</a><BR> | |||
| <a href="#headfilter">HeadFilter</a><BR> | |||
| <a href="#linecontains">LineContains</a><BR> | |||
| <a href="#linecontainsregexp">LineContainsRegExp</a><BR> | |||
| <a href="#prefixlines">PrefixLines</a><BR> | |||
| <a href="#replacetokens">ReplaceTokens</a><BR> | |||
| <a href="#stripjavacomments">StripJavaComments</a><BR> | |||
| <a href="#striplinebreaks">StripLineBreaks</a><BR> | |||
| <a href="#striplinecomments">StripLineComments</a><BR> | |||
| <a href="#tabstospaces">TabsToSpaces</a><BR> | |||
| <a href="#tailfilter">TailFilter</a><BR> | |||
| <H3><a name="filterreader">FilterReader</a></H3> | |||
| The filterreader element is the generic way to | |||
| define a filter. User defined filter elements are | |||
| defined in the build file using this. Please note that | |||
| built in filter readers can also be defined using this | |||
| syntax. | |||
| A FilterReader element must be supplied with a class name as | |||
| an attribute value. The class resolved by this name must | |||
| extend java.io.FilterReader. If the custom filter reader | |||
| needs to be parameterized, it must implement | |||
| org.apache.tools.type.Parameterizable. | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Attribute</B></TD> | |||
| <TD vAlign=top><B>Description</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>classname</TD> | |||
| <TD vAlign=top>The class name of the filter reader.</TD> | |||
| <TD vAlign=top align="center">Yes</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Nested Elements:</H4> | |||
| <filterreader> supports <classpath> and <param> | |||
| as nested elements. Each <param> element may take in the following | |||
| attributes - name, type and value. | |||
| <P> | |||
| The following FilterReaders are supplied with the default | |||
| distribution. | |||
| <H3><a name="classconstants">ClassConstants</a></H3> | |||
| <P> | |||
| This filters basic constants defined in a Java Class, | |||
| and outputs them in lines composed of the format name=value | |||
| <P> | |||
| <H4>Example:</H4> | |||
| This loads the basic constants defined in a Java class as Ant properties. | |||
| <BLOCKQUOTE><PRE> | |||
| <loadproperties srcfile="foo.class"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.ClassConstants"/> | |||
| </filterchain> | |||
| </loadproperties> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadproperties srcfile="foo.class"> | |||
| <filterchain> | |||
| <classconstants/> | |||
| </filterchain> | |||
| </loadproperties> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="expandproperties">ExpandProperties</a></H3> | |||
| <P> | |||
| If the data contains data that represents Ant | |||
| properties (of the form ${...}), that is substituted | |||
| with the property's actual value. | |||
| <P> | |||
| <H4>Example:</H4> | |||
| This results in the property modifiedmessage holding the value | |||
| "All these moments will be lost in time, like teardrops in the rain" | |||
| <BLOCKQUOTE><PRE> | |||
| <echo | |||
| message="All these moments will be lost in time, like teardrops in the ${weather}" | |||
| file="loadfile1.tmp" | |||
| /> | |||
| <property name="weather" value="rain" /> | |||
| <loadfile property="modifiedmessage" srcFile="loadfile1.tmp"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.ExpandProperties"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <echo | |||
| message="All these moments will be lost in time, like teardrops in the ${weather}" | |||
| file="loadfile1.tmp" | |||
| /> | |||
| <property name="weather" value="rain" /> | |||
| <loadfile property="modifiedmessage" srcFile="loadfile1.tmp"> | |||
| <filterchain> | |||
| <expandproperties/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="headfilter">HeadFilter</a></H3> | |||
| This filter reads the first few lines from the data supplied to it. | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Parameter Name</B></TD> | |||
| <TD vAlign=top><B>Parameter Value</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>lines</TD> | |||
| <TD vAlign=top align="center">Number of lines to be read. | |||
| Defaults to "10"</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Example:</H4> | |||
| This stores the first 15 lines of the supplied data in the property ${src.file.head} | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.head}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.HeadFilter"> | |||
| <param name="lines" value="15"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.head}"> | |||
| <filterchain> | |||
| <headfilter lines="15"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="replacetokens">ReplaceTokens</a></H3> | |||
| This filter reader replaces all strings that are | |||
| sandwiched between begintoken and endtoken with | |||
| user defined values. | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Parameter Type</B></TD> | |||
| <TD vAlign=top><B>Parameter Name</B></TD> | |||
| <TD vAlign=top><B>Parameter Value</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>tokenchar</TD> | |||
| <TD vAlign=top>begintoken</TD> | |||
| <TD vAlign=top>Character marking the | |||
| beginning of a token. Defaults to @</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>tokenchar</TD> | |||
| <TD vAlign=top>endtoken</TD> | |||
| <TD vAlign=top>Character marking the | |||
| end of a token. Defaults to @</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>token</TD> | |||
| <TD vAlign=top>User defined String.</TD> | |||
| <TD vAlign=top>User defined search String</TD> | |||
| <TD vAlign=top align="center">Yes</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Example:</H4> | |||
| This replaces occurences of the string @DATE@ in the data | |||
| with today's date and stores it in the property ${src.file.replaced} | |||
| <BLOCKQUOTE><PRE> | |||
| <tstamp/> | |||
| <loadfile srcfile="${src.file}" property="${src.file.replaced}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens"> | |||
| <param type="token" name="DATE" value="${TODAY}"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <tstamp/> | |||
| <loadfile srcfile="${src.file}" property="${src.file.replaced}"> | |||
| <filterchain> | |||
| <replacetokens> | |||
| <token key="DATE" value="${TODAY}"/> | |||
| </replacetokens> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="stripjavacomments">StripJavaComments</a></H3> | |||
| This filter reader strips away comments from the data, | |||
| using Java syntax guidelines. This filter does not | |||
| take in any parameters. | |||
| <P> | |||
| <H4>Example:</H4> | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${java.src.file}" property="${java.src.file.nocomments}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.StripJavaComments"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${java.src.file}" property="${java.src.file.nocomments}"> | |||
| <filterchain> | |||
| <stripjavacomments/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="striplinebreaks">StripLineBreaks</a></H3> | |||
| This filter reader strips away specific characters | |||
| from the data supplied to it. | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Parameter Name</B></TD> | |||
| <TD vAlign=top><B>Parameter Value</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>linebreaks</TD> | |||
| <TD vAlign=top align="center">Characters that are to | |||
| be stripped out. Defaults to "\r\n"</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Examples:</H4> | |||
| This strips the '\r' and '\n' characters. | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.contents}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.StripLineBreaks"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.contents}"> | |||
| <filterchain> | |||
| <striplinebreaks/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| This treats the '(' and ')' characters as line break characters and | |||
| strips them. | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.contents}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.StripLineBreaks"> | |||
| <param name="linebreaks" value="()"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="tabstospaces">TabsToSpaces</a></H3> | |||
| This filter replaces tabs with spaces | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Parameter Name</B></TD> | |||
| <TD vAlign=top><B>Parameter Value</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>lines</TD> | |||
| <TD vAlign=top align="center">tablength | |||
| Defaults to "8"</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Examples:</H4> | |||
| This replaces tabs in ${src.file} with spaces. | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.notab}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.TabsToSpaces"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.notab}"> | |||
| <filterchain> | |||
| <tabstospaces/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <H3><a name="tailfilter">TailFilter</a></H3> | |||
| This filter reads the last few lines from the data supplied to it. | |||
| <TABLE cellSpacing=0 cellPadding=2 border=1> | |||
| <TR> | |||
| <TD vAlign=top><B>Parameter Name</B></TD> | |||
| <TD vAlign=top><B>Parameter Value</B></TD> | |||
| <TD vAlign=top align="center"><B>Required</B></TD> | |||
| </TR> | |||
| <TR> | |||
| <TD vAlign=top>lines</TD> | |||
| <TD vAlign=top align="center">Number of lines to be read. | |||
| Defaults to "10"</TD> | |||
| <TD vAlign=top align="center">No</TD> | |||
| </TR> | |||
| </TABLE> | |||
| <P> | |||
| <H4>Examples:</H4> | |||
| This stores the last 15 lines of the supplied data in the property ${src.file.tail} | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.tail}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.TailFilter"> | |||
| <param name="lines" value="15"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.tail}"> | |||
| <filterchain> | |||
| <tailfilter lines="15"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| This stores the last 5 lines of the first 15 lines of the supplied | |||
| data in the property ${src.file.mid} | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.mid}"> | |||
| <filterchain> | |||
| <filterreader classname="org.apache.tools.ant.filters.HeadFilter"> | |||
| <param name="lines" value="15"/> | |||
| </filterreader> | |||
| <filterreader classname="org.apache.tools.ant.filters.TailFilter"> | |||
| <param name="lines" value="5"/> | |||
| </filterreader> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| Convenience method: | |||
| <BLOCKQUOTE><PRE> | |||
| <loadfile srcfile="${src.file}" property="${src.file.mid}"> | |||
| <filterchain> | |||
| <HeadFilter lines="15"/> | |||
| <TailFilter lines="5"/> | |||
| </filterchain> | |||
| </loadfile> | |||
| </PRE></BLOCKQUOTE> | |||
| <HR> | |||
| <P align=center>Copyright © 2002 Apache Software Foundation. All rights | |||
| Reserved.</P></BODY></HTML> | |||
| @@ -1 +0,0 @@ | |||
| This is the @TITLE@. | |||
| @@ -1,78 +0,0 @@ | |||
| <?xml version="1.0"?> | |||
| <project name="copy-test" basedir="." default="test1"> | |||
| <target name="test1"> | |||
| <copy file="copy.xml" tofile="copytest1.tmp" /> | |||
| </target> | |||
| <target name="test2"> | |||
| <copy file="copy.xml" todir="copytest1dir" overwrite="true"/> | |||
| </target> | |||
| <target name="test3"> | |||
| <!-- create an empty file --> | |||
| <touch file="copytest3.tmp"/> | |||
| <!--wait --> | |||
| <sleep seconds="4"/> | |||
| <!-- copy a different file to two places --> | |||
| <copy file="copy.xml" tofile="copytest3a.tmp" overwrite="true"/> | |||
| <copy file="copy.xml" tofile="copytest3b.tmp" overwrite="true"/> | |||
| <!--wait --> | |||
| <sleep seconds="4"/> | |||
| <!-- copy an old file onto a newer file (should not work) --> | |||
| <copy file="copytest3.tmp" tofile="copytest3b.tmp" /> | |||
| <!-- copy an older file onto a new one, should succeed --> | |||
| <copy file="copytest3.tmp" tofile="copytest3c.tmp" | |||
| overwrite="true" | |||
| preservelastmodified="true" /> | |||
| <!-- copy a newer file onto an older one (should work) --> | |||
| <copy file="copytest3a.tmp" tofile="copytest3.tmp" | |||
| preservelastmodified="true" /> | |||
| <!-- expected state : | |||
| 3a.tmp==3.tmp==copy.xml | |||
| timeof(3a.tmp)==timeof(3.tmp)==now()-4 | |||
| sizeof(3c)==0 | |||
| timeof(3c.tmp)<timeof(3a.tmp); | |||
| 3b.tmp==copy.xml | |||
| --> | |||
| </target> | |||
| <target name="test_single_file_fileset"> | |||
| <copy tofile="copytest_single_file_fileset.tmp"> | |||
| <fileset dir="." includes="copy.xml"/> | |||
| </copy> | |||
| </target> | |||
| <target name="testFilterSet"> | |||
| <copy file="copy.filterset" tofile="copy.filterset.tmp"> | |||
| <filterset> | |||
| <filter token="TITLE" value="Apache Ant Project"/> | |||
| </filterset> | |||
| </copy> | |||
| </target> | |||
| <target name="testFilterChain"> | |||
| <copy file="copy.filterset" tofile="copy.filterchain.tmp"> | |||
| <filterchain> | |||
| <replacetokens> | |||
| <token key="TITLE" value="Apache Ant Project"/> | |||
| </replacetokens> | |||
| </filterchain> | |||
| </copy> | |||
| </target> | |||
| <target name="cleanup"> | |||
| <delete file="copytest1.tmp"/> | |||
| <delete file="copytest3.tmp"/> | |||
| <delete file="copytest3a.tmp"/> | |||
| <delete file="copytest3b.tmp"/> | |||
| <delete file="copytest3c.tmp"/> | |||
| <delete file="copytest_single_file_fileset.tmp"/> | |||
| <delete file="copy.filterset.tmp"/> | |||
| <delete file="copy.filterchain.tmp"/> | |||
| <delete dir="copytest1dir"/> | |||
| </target> | |||
| </project> | |||
| @@ -1 +0,0 @@ | |||
| This is the Apache Ant Project. | |||
| @@ -1,110 +0,0 @@ | |||
| <?xml version="1.0" encoding="ISO-8859-1"?> | |||
| <project name="loadfile-test" basedir="." default="testLoadAFile"> | |||
| <target name="init"> | |||
| </target> | |||
| <target name="testNoSourcefileDefined" depends="init"> | |||
| <loadfile property="foo" /> | |||
| </target> | |||
| <target name="testNoPropertyDefined" | |||
| depends="init"> | |||
| <loadfile srcFile="somefile" /> | |||
| </target> | |||
| <target name="testNoSourcefilefound" | |||
| depends="init"> | |||
| <loadfile property="missing" srcFile="somefile" /> | |||
| </target> | |||
| <target name="testFailOnError" | |||
| depends="init"> | |||
| <loadfile | |||
| property="testFailOnError" | |||
| srcFile="somefile" | |||
| failonerror="false"/> | |||
| </target> | |||
| <target name="testLoadAFile" | |||
| depends="init"> | |||
| <echo | |||
| message="What's it going to be then, eh?" | |||
| file="loadfile1.tmp" | |||
| /> | |||
| <loadfile property="testLoadAFile" srcFile="loadfile1.tmp" /> | |||
| <echo>${testLoadAFile}</echo> | |||
| </target> | |||
| <target name="testLoadAFileEnc" | |||
| depends="init"> | |||
| <loadfile property="testLoadAFileEnc" | |||
| srcFile="loadfile.xml" | |||
| encoding="ISO-8859-1"/> | |||
| </target> | |||
| <target name="testEvalProps" | |||
| depends="init"> | |||
| <property name="weather" value="rain" /> | |||
| <echo | |||
| message="All these moments will be lost in time, like teardrops in the ${weather}" | |||
| file="loadfile1.tmp" | |||
| /> | |||
| <loadfile property="testEvalProps" | |||
| srcFile="loadfile1.tmp"> | |||
| <filterchain> | |||
| <expandproperties/> | |||
| </filterchain> | |||
| </loadfile> | |||
| <echo>${testEvalProps}</echo> | |||
| </target> | |||
| <target name="testFilterChain" | |||
| depends="init"> | |||
| <echo file="loadfile1.tmp">#Line 1 | |||
| REM Line 2 | |||
| --Line 3 | |||
| Line 4 | |||
| Hello World!</echo> | |||
| <loadfile srcFile="loadfile1.tmp" | |||
| property="testFilterChain"> | |||
| <filterchain> | |||
| <headfilter lines="5"/> | |||
| <striplinecomments> | |||
| <comment value="--"/> | |||
| <comment value="REM "/> | |||
| <comment value="#"/> | |||
| </striplinecomments> | |||
| <filterreader classname="org.apache.tools.ant.filters.TailFilter"> | |||
| <param name="lines" value="1"/> | |||
| </filterreader> | |||
| <linecontains> | |||
| <contains value="World!"/> | |||
| </linecontains> | |||
| </filterchain> | |||
| </loadfile> | |||
| </target> | |||
| <target name="testOneLine" | |||
| depends="init"> | |||
| <echo | |||
| message="1, 2, 3, 4" | |||
| file="loadfile1.tmp" | |||
| /> | |||
| <loadfile property="testOneLine" | |||
| srcFile="loadfile1.tmp"> | |||
| <filterchain> | |||
| <striplinebreaks/> | |||
| </filterchain> | |||
| </loadfile> | |||
| <echo>${testOneLine}</echo> | |||
| </target> | |||
| <target name="cleanup"> | |||
| <delete file="loadfile1.tmp"/> | |||
| </target> | |||
| </project> | |||
| @@ -1,30 +0,0 @@ | |||
| <?xml version="1.0"?> | |||
| <project name="move-test" basedir="." default="testFilterSet"> | |||
| <target name="testFilterSet"> | |||
| <copy file="copy.filterset" tofile="move.filterset"/> | |||
| <move file="move.filterset" tofile="move.filterset.tmp"> | |||
| <filterset> | |||
| <filter token="TITLE" value="Apache Ant Project"/> | |||
| </filterset> | |||
| </move> | |||
| </target> | |||
| <target name="testFilterChain"> | |||
| <copy file="copy.filterset" tofile="move.filterchain"/> | |||
| <move file="move.filterchain" tofile="move.filterchain.tmp"> | |||
| <filterchain> | |||
| <replacetokens> | |||
| <token key="TITLE" value="Apache Ant Project"/> | |||
| </replacetokens> | |||
| </filterchain> | |||
| </move> | |||
| </target> | |||
| <target name="cleanup"> | |||
| <delete file="move.filterset.tmp"/> | |||
| <delete file="move.filterchain.tmp"/> | |||
| </target> | |||
| </project> | |||
| @@ -1,207 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.FilterReader; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.io.StringReader; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| /** | |||
| * Base class for core filter readers. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public abstract class BaseFilterReader | |||
| extends FilterReader | |||
| { | |||
| /** Have the parameters passed been interpreted? */ | |||
| private boolean initialized = false; | |||
| /** The Ant project */ | |||
| private Project project = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public BaseFilterReader() { | |||
| // Dummy constructor to be invoked by Ant's Introspector | |||
| super(new StringReader(new String())); | |||
| try { | |||
| close(); | |||
| } catch (IOException ioe) { | |||
| // Ignore | |||
| } | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public BaseFilterReader(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Read characters into a portion of an array. This method will block | |||
| * until some input is available, an I/O error occurs, or the end of the | |||
| * stream is reached. | |||
| * | |||
| * @param cbuf Destination buffer | |||
| * @param off Offset at which to start storing characters | |||
| * @param len Maximum number of characters to read | |||
| * | |||
| * @return The number of characters read, or -1 if the end of the | |||
| * stream has been reached | |||
| * | |||
| * @exception IOException If an I/O error occurs | |||
| */ | |||
| public final int read(final char cbuf[], final int off, | |||
| final int len) throws IOException { | |||
| for (int i = 0; i < len; i++) { | |||
| final int ch = read(); | |||
| if (ch == -1) { | |||
| if (i == 0) { | |||
| return -1; | |||
| } else { | |||
| return i; | |||
| } | |||
| } | |||
| cbuf[off + i] = (char) ch; | |||
| } | |||
| return len; | |||
| } | |||
| /** | |||
| * Skip characters. This method will block until some characters are | |||
| * available, an I/O error occurs, or the end of the stream is reached. | |||
| * | |||
| * @param n The number of characters to skip | |||
| * | |||
| * @return The number of characters actually skipped | |||
| * | |||
| * @exception IllegalArgumentException If <code>n</code> is negative. | |||
| * @exception IOException If an I/O error occurs | |||
| */ | |||
| public final long skip(final long n) throws IOException { | |||
| if (n < 0L) { | |||
| throw new IllegalArgumentException("skip value is negative"); | |||
| } | |||
| for (long i = 0; i < n; i++) { | |||
| if (read() == -1) { | |||
| return i; | |||
| } | |||
| } | |||
| return n; | |||
| } | |||
| /** | |||
| * Set the initialized status. | |||
| */ | |||
| protected final void setInitialized(final boolean initialized) { | |||
| this.initialized = initialized; | |||
| } | |||
| /** | |||
| * Get the initialized status. | |||
| */ | |||
| protected final boolean getInitialized() { | |||
| return initialized; | |||
| } | |||
| /** | |||
| * Set the project to work with | |||
| */ | |||
| public final void setProject(final Project project) { | |||
| this.project = project; | |||
| } | |||
| /** | |||
| * Get the project | |||
| */ | |||
| protected final Project getProject() { | |||
| return project; | |||
| } | |||
| /** | |||
| * Read till EOL | |||
| */ | |||
| protected final String readLine() throws IOException { | |||
| int ch = in.read(); | |||
| String line = (ch == -1) ? null : ""; | |||
| while (ch != -1) { | |||
| line += (char) ch; | |||
| if (ch == '\n') { | |||
| break; | |||
| } | |||
| ch = in.read(); | |||
| } | |||
| return line; | |||
| } | |||
| /** | |||
| * Read till EOF | |||
| */ | |||
| protected final String readFully() throws IOException { | |||
| return FileUtils.readFully(in, 8192); | |||
| } | |||
| } | |||
| @@ -1,106 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.FilterReader; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.io.StringReader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| import org.apache.tools.ant.types.Parameterizable; | |||
| /** | |||
| * Parameterized Base class for core filter readers. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public abstract class BaseParamFilterReader | |||
| extends BaseFilterReader | |||
| implements Parameterizable | |||
| { | |||
| /** The passed in parameter array. */ | |||
| private Parameter[] parameters; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public BaseParamFilterReader() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public BaseParamFilterReader(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Set Parameters | |||
| */ | |||
| public final void setParameters(final Parameter[] parameters) { | |||
| this.parameters = parameters; | |||
| setInitialized(false); | |||
| } | |||
| protected final Parameter[] getParameters() { | |||
| return parameters; | |||
| } | |||
| } | |||
| @@ -1,65 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.Reader; | |||
| /** | |||
| * Chains readers. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public interface ChainableReader { | |||
| public Reader chain(Reader rdr); | |||
| } | |||
| @@ -1,187 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.ByteArrayInputStream; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import org.apache.tools.ant.Project; | |||
| /** | |||
| * Assemble the constants declared in a Java class in | |||
| * key1=value1(line separator)key2=value2 | |||
| * format | |||
| * | |||
| * Notes: | |||
| * ===== | |||
| * 1. This filter uses the BCEL external toolkit. | |||
| * 2. This assembles only those constants that are not created | |||
| * using the syntax new whatever(). | |||
| * 3. This assembles constants declared using the basic datatypes | |||
| * and String only. | |||
| * 4. The access modifiers of the declared constants do not matter. | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <classconstants/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.ClassConstants"/> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class ClassConstants | |||
| extends BaseFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** Data that must be read from, if not null. */ | |||
| private String queuedData = null; | |||
| /** Helper Class to be invoked via reflection. */ | |||
| private String JAVA_CLASS_HELPER = | |||
| "org.apache.tools.ant.filters.util.JavaClassHelper"; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public ClassConstants() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public ClassConstants(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Read and assemble the constants declared in a class file. | |||
| */ | |||
| public final int read() throws IOException { | |||
| int ch = -1; | |||
| if (queuedData != null && queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| if (queuedData != null) { | |||
| ch = queuedData.charAt(0); | |||
| queuedData = queuedData.substring(1); | |||
| if (queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| } else { | |||
| final String clazz = readFully(); | |||
| if (clazz == null) { | |||
| ch = -1; | |||
| } else { | |||
| final byte[] bytes = clazz.getBytes(); | |||
| try { | |||
| final Class javaClassHelper = | |||
| Class.forName(JAVA_CLASS_HELPER); | |||
| if (javaClassHelper != null) { | |||
| final Class params[] = { | |||
| byte[].class | |||
| }; | |||
| final Method getConstants = | |||
| javaClassHelper.getMethod("getConstants", params); | |||
| final Object[] args = { | |||
| bytes | |||
| }; | |||
| // getConstants is a staic method, no need to | |||
| // pass in the object | |||
| final StringBuffer sb = (StringBuffer) | |||
| getConstants.invoke(null, args); | |||
| if (sb.length() > 0) { | |||
| queuedData = sb.toString(); | |||
| return read(); | |||
| } | |||
| } | |||
| } catch (ClassNotFoundException cnfe) { | |||
| throw new IOException(cnfe.getMessage()); | |||
| } catch (NoSuchMethodException nsme) { | |||
| throw new IOException(nsme.getMessage()); | |||
| } catch (IllegalAccessException iae) { | |||
| throw new IOException(iae.getMessage()); | |||
| } catch (IllegalArgumentException iarge) { | |||
| throw new IOException(iarge.getMessage()); | |||
| } catch (InvocationTargetException ite) { | |||
| throw new IOException(ite.getMessage()); | |||
| } | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Create a new ClassConstants using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| ClassConstants newFilter = new ClassConstants(rdr); | |||
| return newFilter; | |||
| } | |||
| } | |||
| @@ -1,140 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.Project; | |||
| /** | |||
| * Expand Ant properties, if any, in the data. | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <expandproperties/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.ExpandProperties"/> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class ExpandProperties | |||
| extends BaseFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** Data that must be read from, if not null. */ | |||
| private String queuedData = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public ExpandProperties() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public ExpandProperties(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Prefix lines with user defined prefix. | |||
| */ | |||
| public final int read() throws IOException { | |||
| int ch = -1; | |||
| if (queuedData != null && queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| if (queuedData != null) { | |||
| ch = queuedData.charAt(0); | |||
| queuedData = queuedData.substring(1); | |||
| if (queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| } else { | |||
| queuedData = readFully(); | |||
| if (queuedData == null) { | |||
| ch = -1; | |||
| } else { | |||
| Project project = getProject(); | |||
| queuedData = project.replaceProperties(queuedData); | |||
| return read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Create a new PrefixLines using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| ExpandProperties newFilter = new ExpandProperties(rdr); | |||
| newFilter.setProject(getProject()); | |||
| return newFilter; | |||
| } | |||
| } | |||
| @@ -1,171 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Read the first n lines (Default is first 10 lines) | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <headfilter lines="3"/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.HeadFilter"> | |||
| * <param name="lines" value="3"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class HeadFilter | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** Lines key to represent the number of lines to be returned. */ | |||
| private static final String LINES_KEY = "lines"; | |||
| /** Number of lines currently read in. */ | |||
| private long linesRead = 0; | |||
| /** Default number of lines returned. */ | |||
| private long lines = 10; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public HeadFilter() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public HeadFilter(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Read the first n lines. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (linesRead < lines) { | |||
| ch = in.read(); | |||
| if (ch == '\n') { | |||
| linesRead++; | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Set number of lines to be returned. | |||
| */ | |||
| public final void setLines(final long lines) { | |||
| this.lines = lines; | |||
| } | |||
| /** | |||
| * Get number of lines to be returned. | |||
| */ | |||
| private final long getLines() { | |||
| return lines; | |||
| } | |||
| /** | |||
| * Create a new HeadFilter using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| HeadFilter newFilter = new HeadFilter(rdr); | |||
| newFilter.setLines(getLines()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Scan for the lines parameter. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (LINES_KEY.equals(params[i].getName())) { | |||
| lines = new Long(params[i].getValue()).longValue(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,225 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.util.Vector; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Filter Reader to fetch only those lines that contain user specified | |||
| * strings. | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <linecontains> | |||
| * <contains value="foo"> | |||
| * <contains value="bar"> | |||
| * </linecontains> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.LineContains"> | |||
| * <param type="contains" value="foo"/> | |||
| * <param type="contains" value="bar"/> | |||
| * </filterreader> | |||
| * | |||
| * This will fetch all those lines that contain foo and bar | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class LineContains | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** contains key */ | |||
| private static final String CONTAINS_KEY = "contains"; | |||
| /** Vector that holds the strings that input lines must contain. */ | |||
| private Vector contains = new Vector(); | |||
| /** Currently read in line. */ | |||
| private String line = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public LineContains() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public LineContains(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Choose only those lines that contains | |||
| * user defined values. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (line != null) { | |||
| ch = line.charAt(0); | |||
| if (line.length() == 1) { | |||
| line = null; | |||
| } else { | |||
| line = line.substring(1); | |||
| } | |||
| } else { | |||
| line = readLine(); | |||
| if (line == null) { | |||
| ch = -1; | |||
| } else { | |||
| int containsSize = contains.size(); | |||
| for (int i = 0; i < containsSize; i++) { | |||
| String containsStr = (String) contains.elementAt(i); | |||
| if (line.indexOf(containsStr) == -1) { | |||
| line = null; | |||
| break; | |||
| } | |||
| } | |||
| return read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Add a contains element. | |||
| */ | |||
| public final void addConfiguredContains(final Contains contains) { | |||
| this.contains.addElement(contains.getValue()); | |||
| } | |||
| /** | |||
| * Set contains vector. | |||
| */ | |||
| private void setContains(final Vector contains) { | |||
| this.contains = contains; | |||
| } | |||
| /** | |||
| * Get contains vector. | |||
| */ | |||
| private final Vector getContains() { | |||
| return contains; | |||
| } | |||
| /** | |||
| * Create a new LineContains using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| LineContains newFilter = new LineContains(rdr); | |||
| newFilter.setContains(getContains()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Parse params to add user defined contains strings. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (CONTAINS_KEY.equals(params[i].getType())) { | |||
| contains.addElement(params[i].getValue()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Holds a contains element | |||
| */ | |||
| public static class Contains { | |||
| /** User defined contains string */ | |||
| private String value; | |||
| /** | |||
| * Set the contains string | |||
| */ | |||
| public final void setValue(String contains) { | |||
| value = contains; | |||
| } | |||
| /** | |||
| * Get the contains string | |||
| */ | |||
| public final String getValue() { | |||
| return value; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,208 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.util.Vector; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| import org.apache.tools.ant.types.RegularExpression; | |||
| import org.apache.tools.ant.util.regexp.Regexp; | |||
| /** | |||
| * Filter Reader to fetch only those lines that contain user specified | |||
| * regular expression matching strings. | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <linecontainsregexp> | |||
| * <regexp pattern="foo*"> | |||
| * </linecontainsregexp> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.LineContainsRegExp"> | |||
| * <param type="regexp" value="foo*"/> | |||
| * </filterreader> | |||
| * | |||
| * This will fetch all those lines that contain the pattern foo | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class LineContainsRegExp | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** contains key */ | |||
| private static final String REGEXP_KEY = "regexp"; | |||
| /** Vector that holds the strings that input lines must contain. */ | |||
| private Vector regexps = new Vector(); | |||
| /** Currently read in line. */ | |||
| private String line = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public LineContainsRegExp() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public LineContainsRegExp(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Choose only those lines that contains | |||
| * user defined values. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (line != null) { | |||
| ch = line.charAt(0); | |||
| if (line.length() == 1) { | |||
| line = null; | |||
| } else { | |||
| line = line.substring(1); | |||
| } | |||
| } else { | |||
| line = readLine(); | |||
| if (line == null) { | |||
| ch = -1; | |||
| } else { | |||
| final int regexpsSize = regexps.size(); | |||
| for (int i = 0; i < regexpsSize; i++) { | |||
| RegularExpression regexp = (RegularExpression) | |||
| regexps.elementAt(i); | |||
| Regexp re = regexp.getRegexp(getProject()); | |||
| boolean matches = re.matches(line); | |||
| if (!matches) { | |||
| line = null; | |||
| break; | |||
| } | |||
| } | |||
| return read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Add a contains element. | |||
| */ | |||
| public final void addConfiguredRegexp(final RegularExpression regExp) { | |||
| this.regexps.addElement(regExp); | |||
| } | |||
| /** | |||
| * Set regexps vector. | |||
| */ | |||
| private void setRegexps(final Vector regexps) { | |||
| this.regexps = regexps; | |||
| } | |||
| /** | |||
| * Get regexps vector. | |||
| */ | |||
| private final Vector getRegexps() { | |||
| return regexps; | |||
| } | |||
| /** | |||
| * Create a new LineContainsRegExp using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| LineContainsRegExp newFilter = new LineContainsRegExp(rdr); | |||
| newFilter.setRegexps(getRegexps()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Parse params to add user defined contains strings. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (REGEXP_KEY.equals(params[i].getType())) { | |||
| String pattern = params[i].getValue(); | |||
| RegularExpression regexp = new RegularExpression(); | |||
| regexp.setPattern(pattern); | |||
| regexps.addElement(regexp); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,183 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Attach a prefix to every line | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <prefixlines prefix="Foo"/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.PrefixLines"> | |||
| * <param name="prefix" value="Foo"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class PrefixLines | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** prefix key */ | |||
| private static final String PREFIX_KEY = "prefix"; | |||
| /** The prefix to be used. */ | |||
| private String prefix = null; | |||
| /** Data that must be read from, if not null. */ | |||
| private String queuedData = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public PrefixLines() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public PrefixLines(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Prefix lines with user defined prefix. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (queuedData != null && queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| if (queuedData != null) { | |||
| ch = queuedData.charAt(0); | |||
| queuedData = queuedData.substring(1); | |||
| if (queuedData.length() == 0) { | |||
| queuedData = null; | |||
| } | |||
| } else { | |||
| queuedData = readLine(); | |||
| if (queuedData == null) { | |||
| ch = -1; | |||
| } else { | |||
| if (prefix != null) { | |||
| queuedData = prefix + queuedData; | |||
| } | |||
| return read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Set the prefix | |||
| */ | |||
| public final void setPrefix(final String prefix) { | |||
| this.prefix = prefix; | |||
| } | |||
| /** | |||
| * Get the prefix | |||
| */ | |||
| private final String getPrefix() { | |||
| return prefix; | |||
| } | |||
| /** | |||
| * Create a new PrefixLines using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| PrefixLines newFilter = new PrefixLines(rdr); | |||
| newFilter.setPrefix(getPrefix()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Initialize prefix if available from the param element. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (PREFIX_KEY.equals(params[i].getName())) { | |||
| prefix = params[i].getValue(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,299 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.util.Hashtable; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Replace tokens with user supplied values | |||
| * | |||
| * Example Usage: | |||
| * ============= | |||
| * | |||
| * <replacetokens begintoken="#" endtoken="#"> | |||
| * <token key="DATE" value="${TODAY}"/> | |||
| * </replacetokens> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens"> | |||
| * <param type="tokenchar" name="begintoken" value="#"/> | |||
| * <param type="tokenchar" name="endtoken" value="#"/> | |||
| * <param type="token" name="DATE" value="${TODAY}"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class ReplaceTokens | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** Default begin token character. */ | |||
| private static final char DEFAULT_BEGIN_TOKEN = '@'; | |||
| /** Default end token character. */ | |||
| private static final char DEFAULT_END_TOKEN = '@'; | |||
| /** Data that must be read from, if not null. */ | |||
| private String queuedData = null; | |||
| /** Hashtable to hold the replacee-replacer pairs. */ | |||
| private Hashtable hash = new Hashtable(); | |||
| /** Begin token. */ | |||
| private char beginToken = DEFAULT_BEGIN_TOKEN; | |||
| /** End token. */ | |||
| private char endToken = DEFAULT_END_TOKEN; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public ReplaceTokens() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public ReplaceTokens(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Replace tokens with values. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| if (queuedData != null && queuedData.length() > 0) { | |||
| final int ch = queuedData.charAt(0); | |||
| if (queuedData.length() > 1) { | |||
| queuedData = queuedData.substring(1); | |||
| } else { | |||
| queuedData = null; | |||
| } | |||
| return ch; | |||
| } | |||
| int ch = in.read(); | |||
| if (ch == beginToken) { | |||
| final StringBuffer key = new StringBuffer(""); | |||
| do { | |||
| ch = in.read(); | |||
| if (ch != -1) { | |||
| key.append((char) ch); | |||
| } else { | |||
| break; | |||
| } | |||
| } while (ch != endToken); | |||
| if (ch == -1) { | |||
| queuedData = beginToken + key.toString(); | |||
| return read(); | |||
| } else { | |||
| key.setLength(key.length() - 1); | |||
| final String replaceWith = (String) hash.get(key.toString()); | |||
| if (replaceWith != null) { | |||
| queuedData = replaceWith; | |||
| return read(); | |||
| } else { | |||
| queuedData = beginToken + key.toString() + endToken; | |||
| return read(); | |||
| } | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Set begin token. | |||
| */ | |||
| public final void setBeginToken(final char beginToken) { | |||
| this.beginToken = beginToken; | |||
| } | |||
| /** | |||
| * Get begin token. | |||
| */ | |||
| private final char getBeginToken() { | |||
| return beginToken; | |||
| } | |||
| /** | |||
| * Set end token. | |||
| */ | |||
| public final void setEndToken(final char endToken) { | |||
| this.endToken = endToken; | |||
| } | |||
| /** | |||
| * Get begin token. | |||
| */ | |||
| private final char getEndToken() { | |||
| return endToken; | |||
| } | |||
| /** | |||
| * Add a token element. | |||
| */ | |||
| public final void addConfiguredToken(final Token token) { | |||
| hash.put(token.getKey(), token.getValue()); | |||
| } | |||
| /** | |||
| * Set the tokens. | |||
| */ | |||
| private void setTokens(final Hashtable hash) { | |||
| this.hash = hash; | |||
| } | |||
| /** | |||
| * Get the tokens. | |||
| */ | |||
| private final Hashtable getTokens() { | |||
| return hash; | |||
| } | |||
| /** | |||
| * Create a new ReplaceTokens using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| ReplaceTokens newFilter = new ReplaceTokens(rdr); | |||
| newFilter.setBeginToken(getBeginToken()); | |||
| newFilter.setEndToken(getEndToken()); | |||
| newFilter.setTokens(getTokens()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Initialize tokens and load the replacee-replacer hashtable. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (params[i] != null) { | |||
| final String type = params[i].getType(); | |||
| if ("tokenchar".equals(type)) { | |||
| final String name = params[i].getName(); | |||
| if ("begintoken".equals(name)) { | |||
| beginToken = params[i].getValue().charAt(0); | |||
| } else if ("endtoken".equals(name)) { | |||
| endToken = params[i].getValue().charAt(0); | |||
| } | |||
| } else if ("token".equals(type)) { | |||
| final String name = params[i].getName(); | |||
| final String value = params[i].getValue(); | |||
| hash.put(name, value); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Holds a token | |||
| */ | |||
| public static class Token { | |||
| /** token key */ | |||
| private String key; | |||
| /** token value */ | |||
| private String value; | |||
| /** | |||
| * Set the token key | |||
| */ | |||
| public final void setKey(String key) { | |||
| this.key = key; | |||
| } | |||
| /** | |||
| * Set the token value | |||
| */ | |||
| public final void setValue(String value) { | |||
| this.value = value; | |||
| } | |||
| /** | |||
| * Get the token key | |||
| */ | |||
| public final String getKey() { | |||
| return key; | |||
| } | |||
| /** | |||
| * Get the token value | |||
| */ | |||
| public final String getValue() { | |||
| return value; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,115 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.StringReader; | |||
| /** | |||
| * Wrap a String as an InputStream | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * @created 20 February 2002 | |||
| */ | |||
| public class StringInputStream | |||
| extends InputStream | |||
| { | |||
| /** Source string is stored as a StringReader */ | |||
| private StringReader in; | |||
| /** | |||
| * Compose a stream from a String | |||
| */ | |||
| public StringInputStream(String source) { | |||
| in = new StringReader(source); | |||
| } | |||
| /** | |||
| * Read from the Stringreader | |||
| */ | |||
| public int read() throws IOException { | |||
| return in.read(); | |||
| } | |||
| /** | |||
| * Close the Stringreader | |||
| */ | |||
| public void close() throws IOException { | |||
| in.close(); | |||
| } | |||
| /** | |||
| * Mark the read limit of the StringReader | |||
| */ | |||
| public synchronized void mark(final int limit) { | |||
| try { | |||
| in.mark(limit); | |||
| } catch (IOException ioe) { | |||
| throw new RuntimeException(ioe.getMessage()); | |||
| } | |||
| } | |||
| /** | |||
| * Resetthe StringReader | |||
| */ | |||
| public synchronized void reset() throws IOException { | |||
| in.reset(); | |||
| } | |||
| public boolean markSupported() { | |||
| return true; | |||
| } | |||
| } | |||
| @@ -1,150 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| /** | |||
| * This is a java comment and string stripper reader that filters | |||
| * these lexical tokens out for purposes of simple Java parsing. | |||
| * (if you have more complex Java parsing needs, use a real lexer). | |||
| * Since this class heavily relies on the single char read function, | |||
| * you are reccomended to make it work on top of a buffered reader. | |||
| */ | |||
| public final class StripJavaComments | |||
| extends BaseFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public StripJavaComments() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public StripJavaComments(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Filter out Java Style comments | |||
| */ | |||
| public final int read() throws IOException { | |||
| int ch = in.read(); | |||
| if (ch == '/') { | |||
| ch = in.read(); | |||
| if (ch == '/') { | |||
| while (ch != '\n' && ch != -1) { | |||
| ch = in.read(); | |||
| } | |||
| } else if (ch == '*') { | |||
| while (ch != -1) { | |||
| ch = in.read(); | |||
| if (ch == '*') { | |||
| ch = in.read(); | |||
| while (ch == '*' && ch != -1) { | |||
| ch = in.read(); | |||
| } | |||
| if (ch == '/') { | |||
| ch = read(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if (ch == '"') { | |||
| while (ch != -1) { | |||
| ch = in.read(); | |||
| if (ch == '\\') { | |||
| ch = in.read(); | |||
| } else if (ch == '"') { | |||
| ch = read(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| if (ch == '\'') { | |||
| ch = in.read(); | |||
| if (ch == '\\') { | |||
| ch = in.read(); | |||
| } | |||
| ch = in.read(); | |||
| ch = read(); | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Create a new StripJavaComments object using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| StripJavaComments newFilter = new StripJavaComments(rdr); | |||
| return newFilter; | |||
| } | |||
| } | |||
| @@ -1,176 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Filter to flatten the stream to a single line. | |||
| * | |||
| * <striplinebreaks/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.StripLineBreaks"/> | |||
| * | |||
| * @author Steve Loughran | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class StripLineBreaks | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** | |||
| * Linebreaks. What do to on funny IBM mainframes with odd line endings? | |||
| */ | |||
| private static final String DEFAULT_LINE_BREAKS = "\r\n"; | |||
| /** | |||
| * Linebreaks key that can be set via param element of | |||
| * AntFilterReader | |||
| */ | |||
| private static final String LINE_BREAKS_KEY = "linebreaks"; | |||
| /** Holds the characters that are recognized as line breaks. */ | |||
| private String lineBreaks = DEFAULT_LINE_BREAKS; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public StripLineBreaks() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public StripLineBreaks(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * If the character that is being read in is a | |||
| * line break character, ignore it and move on to the | |||
| * next one. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = in.read(); | |||
| while (ch != -1) { | |||
| if (lineBreaks.indexOf(ch) == -1) { | |||
| break; | |||
| } else { | |||
| ch = in.read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Set the line break characters. | |||
| */ | |||
| public final void setLineBreaks(final String lineBreaks) { | |||
| this.lineBreaks = lineBreaks; | |||
| } | |||
| /** | |||
| * Get the line breaks characters | |||
| */ | |||
| private final String getLineBreaks() { | |||
| return lineBreaks; | |||
| } | |||
| /** | |||
| * Create a new StripLineBreaks object using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| StripLineBreaks newFilter = new StripLineBreaks(rdr); | |||
| newFilter.setLineBreaks(getLineBreaks()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Line break characters set using the param element. | |||
| */ | |||
| private final void initialize() { | |||
| String userDefinedLineBreaks = null; | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (LINE_BREAKS_KEY.equals(params[i].getName())) { | |||
| userDefinedLineBreaks = params[i].getValue(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| if (userDefinedLineBreaks != null) { | |||
| lineBreaks = userDefinedLineBreaks; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,227 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import java.util.Vector; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * This is a line comment stripper reader | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <striplinecomments> | |||
| * <comment value="#"/> | |||
| * <comment value="--"/> | |||
| * <comment value="REM "/> | |||
| * <comment value="rem "/> | |||
| * <comment value="//"/> | |||
| * </striplinecomments> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.StripLineComments"> | |||
| * <param type="comment" value="#"/> | |||
| * <param type="comment" value="--"/> | |||
| * <param type="comment" value="REM "/> | |||
| * <param type="comment" value="rem "/> | |||
| * <param type="comment" value="//"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class StripLineComments | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** The type that param recognizes to set the comments. */ | |||
| private static final String COMMENTS_KEY = "comment"; | |||
| /** Vector that holds comments. */ | |||
| private Vector comments = new Vector(); | |||
| /** The line that has been read ahead. */ | |||
| private String line = null; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public StripLineComments() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public StripLineComments(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Read in line by line; Ignore line if it | |||
| * begins with a comment string. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (line != null) { | |||
| ch = line.charAt(0); | |||
| if (line.length() == 1) { | |||
| line = null; | |||
| } else { | |||
| line = line.substring(1); | |||
| } | |||
| } else { | |||
| line = readLine(); | |||
| if (line == null) { | |||
| ch = -1; | |||
| } else { | |||
| int commentsSize = comments.size(); | |||
| for (int i = 0; i < commentsSize; i++) { | |||
| String comment = (String) comments.elementAt(i); | |||
| if (line.startsWith(comment)) { | |||
| line = null; | |||
| break; | |||
| } | |||
| } | |||
| return read(); | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Add the Comment element. | |||
| */ | |||
| public final void addConfiguredComment(final Comment comment) { | |||
| comments.addElement(comment.getValue()); | |||
| } | |||
| /** | |||
| * Set the comments vector. | |||
| */ | |||
| private void setComments(final Vector comments) { | |||
| this.comments = comments; | |||
| } | |||
| /** | |||
| * Get the comments vector. | |||
| */ | |||
| private final Vector getComments() { | |||
| return comments; | |||
| } | |||
| /** | |||
| * Create a new StripLineComments object using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| StripLineComments newFilter = new StripLineComments(rdr); | |||
| newFilter.setComments(getComments()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Comments set using the param element. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (COMMENTS_KEY.equals(params[i].getType())) { | |||
| comments.addElement(params[i].getValue()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * The class that holds a comment. | |||
| */ | |||
| public static class Comment { | |||
| /** The comment*/ | |||
| private String value; | |||
| /** | |||
| * Set the comment. | |||
| */ | |||
| public final void setValue(String comment) { | |||
| value = comment; | |||
| } | |||
| /** | |||
| * Get the comment. | |||
| */ | |||
| public final String getValue() { | |||
| return value; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,178 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Converts tabs to spaces. | |||
| * | |||
| * Example Usage: | |||
| * ============= | |||
| * | |||
| * <tabtospaces tablength="8"/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.TabsToSpaces"> | |||
| * <param name="tablength" value="8"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class TabsToSpaces | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** The default tab length is 8 */ | |||
| private static final int DEFAULT_TAB_LENGTH = 8; | |||
| /** The name that param recognizes to set the tablength. */ | |||
| private static final String TAB_LENGTH_KEY = "tablength"; | |||
| /** Default tab length. */ | |||
| private int tabLength = DEFAULT_TAB_LENGTH; | |||
| /** How many more spaces must be returned to replace a tab? */ | |||
| private int spacesRemaining = 0; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public TabsToSpaces() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public TabsToSpaces(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Convert tabs with spaces | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| int ch = -1; | |||
| if (spacesRemaining > 0) { | |||
| spacesRemaining--; | |||
| ch = ' '; | |||
| } else { | |||
| ch = in.read(); | |||
| if (ch == '\t') { | |||
| spacesRemaining = tabLength - 1; | |||
| ch = ' '; | |||
| } | |||
| } | |||
| return ch; | |||
| } | |||
| /** | |||
| * Set the tab length. | |||
| */ | |||
| public final void setTablength(final int tabLength) { | |||
| this.tabLength = tabLength; | |||
| } | |||
| /** | |||
| * Get the tab length | |||
| */ | |||
| private final int getTablength() { | |||
| return tabLength; | |||
| } | |||
| /** | |||
| * Create a new TabsToSpaces object using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| TabsToSpaces newFilter = new TabsToSpaces(rdr); | |||
| newFilter.setTablength(getTablength()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Initialize tokens | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (params[i] != null) { | |||
| if (TAB_LENGTH_KEY.equals(params[i].getName())) { | |||
| tabLength = | |||
| new Integer(params[i].getValue()).intValue(); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,218 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters; | |||
| import java.io.IOException; | |||
| import java.io.Reader; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| /** | |||
| * Read the last n lines. Default is last 10 lines. | |||
| * | |||
| * Example: | |||
| * ======= | |||
| * | |||
| * <tailfilter lines="3"/> | |||
| * | |||
| * Or: | |||
| * | |||
| * <filterreader classname="org.apache.tools.ant.filters.TailFilter"> | |||
| * <param name="lines" value="3"/> | |||
| * </filterreader> | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class TailFilter | |||
| extends BaseParamFilterReader | |||
| implements ChainableReader | |||
| { | |||
| /** The name that param recognizes to set the number of lines. */ | |||
| private static final String LINES_KEY = "lines"; | |||
| /** Number of lines currently read in. */ | |||
| private long linesRead = 0; | |||
| /** Default number of lines returned. */ | |||
| private long lines = 10; | |||
| /** Buffer to hold in characters read ahead. */ | |||
| private char[] buffer = new char[4096]; | |||
| /** The character position that has been returned from the buffer. */ | |||
| private int returnedCharPos = -1; | |||
| /** Has read ahead been completed? */ | |||
| private boolean completedReadAhead = false; | |||
| /** Current index position on the buffer. */ | |||
| private int bufferPos = 0; | |||
| /** | |||
| * This constructor is a dummy constructor and is | |||
| * not meant to be used by any class other than Ant's | |||
| * introspection mechanism. This will close the filter | |||
| * that is created making it useless for further operations. | |||
| */ | |||
| public TailFilter() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Create a new filtered reader. | |||
| * | |||
| * @param in a Reader object providing the underlying stream. | |||
| */ | |||
| public TailFilter(final Reader in) { | |||
| super(in); | |||
| } | |||
| /** | |||
| * Read ahead and keep in buffer last n lines only at any given | |||
| * point. Grow buffer as needed. | |||
| */ | |||
| public final int read() throws IOException { | |||
| if (!getInitialized()) { | |||
| initialize(); | |||
| setInitialized(true); | |||
| } | |||
| if (!completedReadAhead) { | |||
| int ch = -1; | |||
| while ((ch = in.read()) != -1) { | |||
| if (buffer.length == bufferPos) { | |||
| if (returnedCharPos != -1) { | |||
| final char[] tmpBuffer = new char[buffer.length]; | |||
| System.arraycopy(buffer, returnedCharPos + 1, tmpBuffer, | |||
| 0, buffer.length - (returnedCharPos + 1)); | |||
| buffer = tmpBuffer; | |||
| bufferPos = bufferPos - (returnedCharPos + 1); | |||
| returnedCharPos = -1; | |||
| } else { | |||
| final char[] tmpBuffer = new char[buffer.length * 2]; | |||
| System.arraycopy(buffer, 0, tmpBuffer, 0, bufferPos); | |||
| buffer = tmpBuffer; | |||
| } | |||
| } | |||
| if (ch == '\n' || ch == -1) { | |||
| ++linesRead; | |||
| if (linesRead == lines) { | |||
| int i = 0; | |||
| for (i = returnedCharPos + 1; | |||
| buffer[i] != 0 && buffer[i] != '\n'; i++) { | |||
| } | |||
| returnedCharPos = i; | |||
| --linesRead; | |||
| } | |||
| } | |||
| if (ch == -1) { | |||
| break; | |||
| } | |||
| buffer[bufferPos] = (char) ch; | |||
| bufferPos++; | |||
| } | |||
| completedReadAhead = true; | |||
| } | |||
| ++returnedCharPos; | |||
| if (returnedCharPos >= bufferPos) { | |||
| return -1; | |||
| } else { | |||
| return buffer[returnedCharPos]; | |||
| } | |||
| } | |||
| /** | |||
| * Set number of lines to be returned. | |||
| */ | |||
| public final void setLines(final long lines) { | |||
| this.lines = lines; | |||
| } | |||
| /** | |||
| * Get number of lines to be returned. | |||
| */ | |||
| private final long getLines() { | |||
| return lines; | |||
| } | |||
| /** | |||
| * Create a new TailFilter using the passed in | |||
| * Reader for instantiation. | |||
| */ | |||
| public final Reader chain(final Reader rdr) { | |||
| TailFilter newFilter = new TailFilter(rdr); | |||
| newFilter.setLines(getLines()); | |||
| newFilter.setInitialized(true); | |||
| return newFilter; | |||
| } | |||
| /** | |||
| * Scan for the lines parameter. | |||
| */ | |||
| private final void initialize() { | |||
| Parameter[] params = getParameters(); | |||
| if (params != null) { | |||
| for (int i = 0; i < params.length; i++) { | |||
| if (LINES_KEY.equals(params[i].getName())) { | |||
| setLines(new Long(params[i].getValue()).longValue()); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,234 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters.util; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.filters.BaseFilterReader; | |||
| import org.apache.tools.ant.filters.ChainableReader; | |||
| import org.apache.tools.ant.types.AntFilterReader; | |||
| import org.apache.tools.ant.types.FilterChain; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.Parameter; | |||
| import org.apache.tools.ant.types.Parameterizable; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import java.io.*; | |||
| import java.lang.reflect.Constructor; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.util.Vector; | |||
| /** | |||
| * Process a FilterReader chain. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * @created 23 February 2002 | |||
| */ | |||
| public final class ChainReaderHelper { | |||
| /** | |||
| * The primary reader to which the reader chain is to be attached. | |||
| */ | |||
| public Reader primaryReader; | |||
| /** | |||
| * The size of the buffer to be used. | |||
| */ | |||
| public int bufferSize = 8192; | |||
| /** | |||
| * Chain of filters | |||
| */ | |||
| public Vector filterChains = new Vector(); | |||
| /** The Ant project */ | |||
| private Project project = null; | |||
| /** | |||
| * Sets the primary reader | |||
| */ | |||
| public final void setPrimaryReader(Reader rdr) { | |||
| primaryReader = rdr; | |||
| } | |||
| /** | |||
| * Set the project to work with | |||
| */ | |||
| public final void setProject(final Project project) { | |||
| this.project = project; | |||
| } | |||
| /** | |||
| * Get the project | |||
| */ | |||
| public final Project getProject() { | |||
| return project; | |||
| } | |||
| /** | |||
| * Sets the buffer size to be used. Defaults to 4096, | |||
| * if this method is not invoked. | |||
| */ | |||
| public final void setBufferSize(int size) { | |||
| bufferSize = size; | |||
| } | |||
| /** | |||
| * Sets the collection of filter reader sets | |||
| */ | |||
| public final void setFilterChains(Vector fchain) { | |||
| filterChains = fchain; | |||
| } | |||
| /** | |||
| * Assemble the reader | |||
| */ | |||
| public final Reader getAssembledReader() throws BuildException { | |||
| if (primaryReader == null) { | |||
| throw new BuildException("primaryReader must not be null."); | |||
| } | |||
| Reader instream = primaryReader; | |||
| final int filterReadersCount = filterChains.size(); | |||
| final Vector finalFilters = new Vector(); | |||
| for (int i = 0; i < filterReadersCount; i++) { | |||
| final FilterChain filterchain = | |||
| (FilterChain) filterChains.elementAt(i); | |||
| final Vector filterReaders = filterchain.getFilterReaders(); | |||
| final int readerCount = filterReaders.size(); | |||
| for (int j = 0; j < readerCount; j++) { | |||
| finalFilters.addElement(filterReaders.elementAt(j)); | |||
| } | |||
| } | |||
| final int filtersCount = finalFilters.size(); | |||
| if (filtersCount > 0) { | |||
| for (int i = 0; i < filtersCount; i++) { | |||
| Object o = finalFilters.elementAt(i); | |||
| if (o instanceof AntFilterReader) { | |||
| final AntFilterReader filter = (AntFilterReader) finalFilters.elementAt(i); | |||
| final String className = filter.getClassName(); | |||
| final Path classpath = filter.getClasspath(); | |||
| final Project project = filter.getProject(); | |||
| if (className != null) { | |||
| try { | |||
| Class clazz = null; | |||
| if (classpath == null) { | |||
| clazz = Class.forName(className); | |||
| } else { | |||
| AntClassLoader al = new AntClassLoader(project, | |||
| classpath); | |||
| clazz = al.loadClass(className); | |||
| AntClassLoader.initializeClass(clazz); | |||
| } | |||
| if (clazz != null) { | |||
| if (!FilterReader.class.isAssignableFrom(clazz)) { | |||
| throw new BuildException(className + | |||
| " does not extend java.io.FilterReader"); | |||
| } | |||
| final Constructor[] constructors = | |||
| clazz.getConstructors(); | |||
| int j = 0; | |||
| for (; j < constructors.length; j++) { | |||
| Class[] types = constructors[j] | |||
| .getParameterTypes(); | |||
| if (types.length == 1 && | |||
| types[0].isAssignableFrom(Reader.class)) { | |||
| break; | |||
| } | |||
| } | |||
| final Reader[] rdr = {instream}; | |||
| instream = | |||
| (Reader) constructors[j].newInstance(rdr); | |||
| if (Parameterizable.class.isAssignableFrom(clazz)) { | |||
| final Parameter[] params = filter.getParams(); | |||
| ((Parameterizable) | |||
| instream).setParameters(params); | |||
| } | |||
| } | |||
| } catch (final ClassNotFoundException cnfe) { | |||
| throw new BuildException(cnfe); | |||
| } catch (final InstantiationException ie) { | |||
| throw new BuildException(ie); | |||
| } catch (final IllegalAccessException iae) { | |||
| throw new BuildException(iae); | |||
| } catch (final InvocationTargetException ite) { | |||
| throw new BuildException(ite); | |||
| } | |||
| } | |||
| } else if (o instanceof ChainableReader && | |||
| o instanceof Reader) { | |||
| if (project != null && o instanceof BaseFilterReader) { | |||
| ((BaseFilterReader) o).setProject(project); | |||
| } | |||
| instream = ((ChainableReader) o).chain(instream); | |||
| } | |||
| } | |||
| } | |||
| return instream; | |||
| } | |||
| /** | |||
| * Read data from the reader and return the | |||
| * contents as a string. | |||
| */ | |||
| public final String readFully(Reader rdr) | |||
| throws IOException { | |||
| return FileUtils.readFully(rdr, bufferSize); | |||
| } | |||
| } | |||
| @@ -1,103 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.filters.util; | |||
| import java.io.ByteArrayInputStream; | |||
| import java.io.IOException; | |||
| import org.apache.bcel.classfile.ClassParser; | |||
| import org.apache.bcel.classfile.ConstantValue; | |||
| import org.apache.bcel.classfile.Field; | |||
| import org.apache.bcel.classfile.JavaClass; | |||
| /** | |||
| * Helper class that filters constants from a Java Class | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class JavaClassHelper { | |||
| /** System specific line separator. */ | |||
| private static final String LS = System.getProperty("line.separator"); | |||
| /** | |||
| * Get the constants declared in a file as name=value | |||
| */ | |||
| public static final StringBuffer getConstants(byte[] bytes) | |||
| throws IOException { | |||
| final StringBuffer sb = new StringBuffer(); | |||
| final ByteArrayInputStream bis = new ByteArrayInputStream(bytes); | |||
| final ClassParser parser = new ClassParser(bis, ""); | |||
| final JavaClass javaClass = parser.parse(); | |||
| final Field[] fields = javaClass.getFields(); | |||
| for (int i = 0; i < fields.length; i++) { | |||
| final Field field = fields[i]; | |||
| if (field != null) { | |||
| final ConstantValue cv = field.getConstantValue(); | |||
| if (cv != null) { | |||
| String cvs = cv.toString(); | |||
| //Remove start and end quotes if field is a String | |||
| if (cvs.startsWith("\"") && cvs.endsWith("\"")) { | |||
| cvs = cvs.substring(1, cvs.length() - 1); | |||
| } | |||
| sb.append(field.getName()); | |||
| sb.append('='); | |||
| sb.append(cvs); | |||
| sb.append(LS); | |||
| } | |||
| } | |||
| } | |||
| return sb; | |||
| } | |||
| } | |||
| @@ -1,514 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 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.taskdefs; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.Mapper; | |||
| import org.apache.tools.ant.types.FilterChain; | |||
| 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.FileNameMapper; | |||
| import org.apache.tools.ant.util.FlatFileNameMapper; | |||
| import org.apache.tools.ant.util.IdentityMapper; | |||
| import org.apache.tools.ant.util.SourceFileScanner; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.Vector; | |||
| import java.util.Hashtable; | |||
| import java.util.Enumeration; | |||
| /** | |||
| * A consolidated copy task. Copies a file or directory to a new file | |||
| * or directory. Files are only copied if the source file is newer | |||
| * than the destination file, or when the destination file does not | |||
| * exist. It is possible to explicitly overwrite existing files.</p> | |||
| * | |||
| * <p>This implementation is based on Arnout Kuiper's initial design | |||
| * document, the following mailing list discussions, and the | |||
| * copyfile/copydir tasks.</p> | |||
| * | |||
| * @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <A href="gholam@xtra.co.nz">Michael McCallum</A> | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * | |||
| * @version $Revision$ | |||
| * | |||
| * @ant:task category="filesystem" | |||
| */ | |||
| public class Copy extends Task { | |||
| protected File file = null; // the source file | |||
| protected File destFile = null; // the destination file | |||
| protected File destDir = null; // the destination directory | |||
| protected Vector filesets = new Vector(); | |||
| protected boolean filtering = false; | |||
| protected boolean preserveLastModified = false; | |||
| protected boolean forceOverwrite = false; | |||
| protected boolean flatten = false; | |||
| protected int verbosity = Project.MSG_VERBOSE; | |||
| protected boolean includeEmpty = true; | |||
| protected Hashtable fileCopyMap = new Hashtable(); | |||
| protected Hashtable dirCopyMap = new Hashtable(); | |||
| protected Hashtable completeDirMap = new Hashtable(); | |||
| protected Mapper mapperElement = null; | |||
| private Vector filterChains = new Vector(); | |||
| private Vector filterSets = new Vector(); | |||
| private FileUtils fileUtils; | |||
| private String encoding = null; | |||
| public Copy() { | |||
| fileUtils = FileUtils.newFileUtils(); | |||
| } | |||
| protected FileUtils getFileUtils() {return fileUtils;} | |||
| /** | |||
| * Sets a single source file to copy. | |||
| */ | |||
| public void setFile(File file) { | |||
| this.file = file; | |||
| } | |||
| /** | |||
| * Sets the destination file. | |||
| */ | |||
| public void setTofile(File destFile) { | |||
| this.destFile = destFile; | |||
| } | |||
| /** | |||
| * Sets the destination directory. | |||
| */ | |||
| public void setTodir(File destDir) { | |||
| this.destDir = destDir; | |||
| } | |||
| /** | |||
| * Create a nested filterchain | |||
| */ | |||
| public FilterChain createFilterChain() { | |||
| FilterChain filterChain = new FilterChain(); | |||
| filterChains.addElement(filterChain); | |||
| return filterChain; | |||
| } | |||
| /** | |||
| * Create a nested filterset | |||
| */ | |||
| public FilterSet createFilterSet() { | |||
| FilterSet filterSet = new FilterSet(); | |||
| filterSets.addElement(filterSet); | |||
| return filterSet; | |||
| } | |||
| /** | |||
| * Give the copied files the same last modified time as the original files. | |||
| * @deprecated setPreserveLastModified(String) has been deprecated and | |||
| * replaced with setPreserveLastModified(boolean) to | |||
| * consistently let the Introspection mechanism work. | |||
| */ | |||
| public void setPreserveLastModified(String preserve) { | |||
| setPreserveLastModified(Project.toBoolean(preserve)); | |||
| } | |||
| /** | |||
| * Give the copied files the same last modified time as the original files. | |||
| */ | |||
| public void setPreserveLastModified(boolean preserve) { | |||
| preserveLastModified = preserve; | |||
| } | |||
| /** | |||
| * Whether to give the copied files the same last modified time as | |||
| * the original files. | |||
| * | |||
| * @since 1.32, Ant 1.5 | |||
| */ | |||
| public boolean getPreserveLastModified() { | |||
| return preserveLastModified; | |||
| } | |||
| /** | |||
| * Get the filtersets being applied to this operation. | |||
| * | |||
| * @return a vector of FilterSet objects | |||
| */ | |||
| protected Vector getFilterSets() { | |||
| return filterSets; | |||
| } | |||
| /** | |||
| * Get the filterchains being applied to this operation. | |||
| * | |||
| * @return a vector of FilterChain objects | |||
| */ | |||
| protected Vector getFilterChains() { | |||
| return filterChains; | |||
| } | |||
| /** | |||
| * Sets filtering. | |||
| */ | |||
| public void setFiltering(boolean filtering) { | |||
| this.filtering = filtering; | |||
| } | |||
| /** | |||
| * Overwrite any existing destination file(s). | |||
| */ | |||
| public void setOverwrite(boolean overwrite) { | |||
| this.forceOverwrite = overwrite; | |||
| } | |||
| /** | |||
| * When copying directory trees, the files can be "flattened" | |||
| * into a single directory. If there are multiple files with | |||
| * the same name in the source directory tree, only the first | |||
| * file will be copied into the "flattened" directory, unless | |||
| * the forceoverwrite attribute is true. | |||
| */ | |||
| public void setFlatten(boolean flatten) { | |||
| this.flatten = flatten; | |||
| } | |||
| /** | |||
| * Used to force listing of all names of copied files. | |||
| */ | |||
| public void setVerbose(boolean verbose) { | |||
| if (verbose) { | |||
| this.verbosity = Project.MSG_INFO; | |||
| } else { | |||
| this.verbosity = Project.MSG_VERBOSE; | |||
| } | |||
| } | |||
| /** | |||
| * Used to copy empty directories. | |||
| */ | |||
| public void setIncludeEmptyDirs(boolean includeEmpty) { | |||
| this.includeEmpty = includeEmpty; | |||
| } | |||
| /** | |||
| * Adds a set of files (nested fileset attribute). | |||
| */ | |||
| public void addFileset(FileSet set) { | |||
| filesets.addElement(set); | |||
| } | |||
| /** | |||
| * Defines the FileNameMapper to use (nested mapper element). | |||
| */ | |||
| public Mapper createMapper() throws BuildException { | |||
| if (mapperElement != null) { | |||
| throw new BuildException("Cannot define more than one mapper", | |||
| location); | |||
| } | |||
| mapperElement = new Mapper(project); | |||
| return mapperElement; | |||
| } | |||
| /** | |||
| * Sets the character encoding | |||
| * | |||
| * @since 1.32, Ant 1.5 | |||
| */ | |||
| public void setEncoding (String encoding) { | |||
| this.encoding = encoding; | |||
| } | |||
| /** | |||
| * @return the character encoding, <code>null</code> if not set. | |||
| * | |||
| * @since 1.32, Ant 1.5 | |||
| */ | |||
| public String getEncoding() { | |||
| return encoding; | |||
| } | |||
| /** | |||
| * Performs the copy operation. | |||
| */ | |||
| public void execute() throws BuildException { | |||
| // make sure we don't have an illegal set of options | |||
| validateAttributes(); | |||
| // deal with the single file | |||
| if (file != null) { | |||
| if (file.exists()) { | |||
| if (destFile == null) { | |||
| destFile = new File(destDir, file.getName()); | |||
| } | |||
| if (forceOverwrite || | |||
| (file.lastModified() > destFile.lastModified())) { | |||
| fileCopyMap.put(file.getAbsolutePath(), destFile.getAbsolutePath()); | |||
| } else { | |||
| log(file + " omitted as " + destFile + " is up to date.", | |||
| Project.MSG_VERBOSE); | |||
| } | |||
| } else { | |||
| String message = "Could not find file " | |||
| + file.getAbsolutePath() + " to copy."; | |||
| log(message); | |||
| throw new BuildException(message); | |||
| } | |||
| } | |||
| // deal with the filesets | |||
| for (int i=0; i<filesets.size(); i++) { | |||
| FileSet fs = (FileSet) filesets.elementAt(i); | |||
| DirectoryScanner ds = fs.getDirectoryScanner(project); | |||
| File fromDir = fs.getDir(project); | |||
| String[] srcFiles = ds.getIncludedFiles(); | |||
| String[] srcDirs = ds.getIncludedDirectories(); | |||
| boolean isEverythingIncluded = ds.isEverythingIncluded(); | |||
| if (isEverythingIncluded | |||
| && !flatten && mapperElement == null) { | |||
| completeDirMap.put(fromDir, destDir); | |||
| } | |||
| scan(fromDir, destDir, srcFiles, srcDirs); | |||
| } | |||
| // do all the copy operations now... | |||
| doFileOperations(); | |||
| // clean up destDir again - so this instance can be used a second | |||
| // time without throwing an exception | |||
| if (destFile != null) { | |||
| destDir = null; | |||
| } | |||
| fileCopyMap.clear(); | |||
| dirCopyMap.clear(); | |||
| completeDirMap.clear(); | |||
| } | |||
| //************************************************************************ | |||
| // protected and private methods | |||
| //************************************************************************ | |||
| /** | |||
| * Ensure we have a consistent and legal set of attributes, and set | |||
| * any internal flags necessary based on different combinations | |||
| * of attributes. | |||
| */ | |||
| protected void validateAttributes() throws BuildException { | |||
| if (file == null && filesets.size() == 0) { | |||
| throw new BuildException("Specify at least one source - a file or a fileset."); | |||
| } | |||
| if (destFile != null && destDir != null) { | |||
| throw new BuildException("Only one of tofile and todir may be set."); | |||
| } | |||
| if (destFile == null && destDir == null) { | |||
| throw new BuildException("One of tofile or todir must be set."); | |||
| } | |||
| if (file != null && file.exists() && file.isDirectory()) { | |||
| throw new BuildException("Use a fileset to copy directories."); | |||
| } | |||
| if (destFile != null && filesets.size() > 0) { | |||
| if (filesets.size() > 1) { | |||
| throw new BuildException( | |||
| "Cannot concatenate multiple files into a single file."); | |||
| } else { | |||
| FileSet fs = (FileSet) filesets.elementAt(0); | |||
| DirectoryScanner ds = fs.getDirectoryScanner(project); | |||
| String[] srcFiles = ds.getIncludedFiles(); | |||
| if (srcFiles.length > 0) { | |||
| if (file == null) { | |||
| file = new File(ds.getBasedir(), srcFiles[0]); | |||
| filesets.removeElementAt(0); | |||
| } else { | |||
| throw new BuildException( | |||
| "Cannot concatenate multiple files into a single file."); | |||
| } | |||
| } else { | |||
| throw new BuildException( | |||
| "Cannot perform operation from directory to file."); | |||
| } | |||
| } | |||
| } | |||
| if (destFile != null) { | |||
| destDir = new File(destFile.getParent()); // be 1.1 friendly | |||
| } | |||
| } | |||
| /** | |||
| * Compares source files to destination files to see if they should be | |||
| * copied. | |||
| */ | |||
| protected void scan(File fromDir, File toDir, String[] files, String[] dirs) { | |||
| FileNameMapper mapper = null; | |||
| if (mapperElement != null) { | |||
| mapper = mapperElement.getImplementation(); | |||
| } else if (flatten) { | |||
| mapper = new FlatFileNameMapper(); | |||
| } else { | |||
| mapper = new IdentityMapper(); | |||
| } | |||
| buildMap(fromDir, toDir, files, mapper, fileCopyMap); | |||
| if (includeEmpty) { | |||
| buildMap(fromDir, toDir, dirs, mapper, dirCopyMap); | |||
| } | |||
| } | |||
| protected void buildMap(File fromDir, File toDir, String[] names, | |||
| FileNameMapper mapper, Hashtable map) { | |||
| String[] toCopy = null; | |||
| if (forceOverwrite) { | |||
| Vector v = new Vector(); | |||
| for (int i=0; i<names.length; i++) { | |||
| if (mapper.mapFileName(names[i]) != null) { | |||
| v.addElement(names[i]); | |||
| } | |||
| } | |||
| toCopy = new String[v.size()]; | |||
| v.copyInto(toCopy); | |||
| } else { | |||
| SourceFileScanner ds = new SourceFileScanner(this); | |||
| toCopy = ds.restrict(names, fromDir, toDir, mapper); | |||
| } | |||
| for (int i = 0; i < toCopy.length; i++) { | |||
| File src = new File(fromDir, toCopy[i]); | |||
| File dest = new File(toDir, mapper.mapFileName(toCopy[i])[0]); | |||
| map.put( src.getAbsolutePath(), dest.getAbsolutePath() ); | |||
| } | |||
| } | |||
| /** | |||
| * Actually does the file (and possibly empty directory) copies. | |||
| * This is a good method for subclasses to override. | |||
| */ | |||
| protected void doFileOperations() { | |||
| if (fileCopyMap.size() > 0) { | |||
| log("Copying " + fileCopyMap.size() + | |||
| " file" + (fileCopyMap.size() == 1 ? "" : "s") + | |||
| " to " + destDir.getAbsolutePath() ); | |||
| Enumeration e = fileCopyMap.keys(); | |||
| while (e.hasMoreElements()) { | |||
| String fromFile = (String) e.nextElement(); | |||
| String toFile = (String) fileCopyMap.get(fromFile); | |||
| if( fromFile.equals( toFile ) ) { | |||
| log("Skipping self-copy of " + fromFile, verbosity); | |||
| continue; | |||
| } | |||
| try { | |||
| log("Copying " + fromFile + " to " + toFile, verbosity); | |||
| FilterSetCollection executionFilters = new FilterSetCollection(); | |||
| if (filtering) { | |||
| executionFilters.addFilterSet(project.getGlobalFilterSet()); | |||
| } | |||
| for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) { | |||
| executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); | |||
| } | |||
| fileUtils.copyFile(fromFile, toFile, executionFilters, filterChains, | |||
| forceOverwrite, preserveLastModified, | |||
| encoding, project); | |||
| } catch (IOException ioe) { | |||
| String msg = "Failed to copy " + fromFile + " to " + toFile | |||
| + " due to " + ioe.getMessage(); | |||
| throw new BuildException(msg, ioe, location); | |||
| } | |||
| } | |||
| } | |||
| if (includeEmpty) { | |||
| Enumeration e = dirCopyMap.elements(); | |||
| int count = 0; | |||
| while (e.hasMoreElements()) { | |||
| File d = new File((String)e.nextElement()); | |||
| if (!d.exists()) { | |||
| if (!d.mkdirs()) { | |||
| log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR); | |||
| } else { | |||
| count++; | |||
| } | |||
| } | |||
| } | |||
| if (count > 0) { | |||
| log("Copied " + count + | |||
| " empty director" + | |||
| (count==1?"y":"ies") + | |||
| " to " + destDir.getAbsolutePath()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,228 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001-2002 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.taskdefs; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.types.FilterChain; | |||
| import org.apache.tools.ant.filters.util.ChainReaderHelper; | |||
| import java.io.*; | |||
| import java.util.Vector; | |||
| /** | |||
| * Load a file into a property | |||
| * | |||
| * @author Steve Loughran | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * @created 10 December 2001 | |||
| */ | |||
| public final class LoadFile extends Task { | |||
| /** | |||
| * source file, usually null | |||
| */ | |||
| private File srcFile = null; | |||
| /** | |||
| * what to do when it goes pear-shaped | |||
| */ | |||
| private boolean failOnError = true; | |||
| /** | |||
| * Encoding to use for filenames, defaults to the platform's default | |||
| * encoding. | |||
| */ | |||
| private String encoding = null; | |||
| /** | |||
| * name of property | |||
| */ | |||
| private String property = null; | |||
| /** | |||
| * Holds FilterChains | |||
| */ | |||
| private final Vector filterChains = new Vector(); | |||
| /** | |||
| * Encoding to use for filenames, defaults to the platform's default | |||
| * encoding. <p> | |||
| * | |||
| * For a list of possible values see <a href="http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html"> | |||
| * http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html | |||
| * </a>.</p> | |||
| * | |||
| * @param encoding The new Encoding value | |||
| */ | |||
| public final void setEncoding(final String encoding) { | |||
| this.encoding = encoding; | |||
| } | |||
| /** | |||
| * Sets the Property attribute of the LoadFile object | |||
| * | |||
| * @param property The new Property value | |||
| */ | |||
| public final void setProperty(final String property) { | |||
| this.property = property; | |||
| } | |||
| /** | |||
| * Sets the srcfile attribute. | |||
| * | |||
| * @param srcFile The new SrcFile value | |||
| */ | |||
| public final void setSrcFile(final File srcFile) { | |||
| this.srcFile = srcFile; | |||
| } | |||
| /** | |||
| * Sets the Failonerror attribute of the LoadFile object | |||
| * | |||
| * @param fail The new Failonerror value | |||
| */ | |||
| public final void setFailonerror(final boolean fail) { | |||
| failOnError = fail; | |||
| } | |||
| /** | |||
| * read in a source file to a property | |||
| * | |||
| * @exception BuildException if something goes wrong with the build | |||
| */ | |||
| public final void execute() | |||
| throws BuildException { | |||
| //validation | |||
| if (srcFile == null) { | |||
| throw new BuildException("source file not defined"); | |||
| } | |||
| if (property == null) { | |||
| throw new BuildException("output property not defined"); | |||
| } | |||
| FileInputStream fis = null; | |||
| BufferedInputStream bis = null; | |||
| Reader instream = null; | |||
| log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE); | |||
| try { | |||
| final long len = srcFile.length(); | |||
| log("file size = "+len,Project.MSG_DEBUG); | |||
| //discard most of really big files | |||
| final int size=(int) len; | |||
| //open up the file | |||
| fis = new FileInputStream(srcFile); | |||
| bis = new BufferedInputStream(fis); | |||
| if (encoding == null) { | |||
| instream = new InputStreamReader(bis); | |||
| } | |||
| else { | |||
| instream = new InputStreamReader(bis, encoding); | |||
| } | |||
| ChainReaderHelper crh = new ChainReaderHelper(); | |||
| crh.setBufferSize(size); | |||
| crh.setPrimaryReader(instream); | |||
| crh.setFilterChains(filterChains); | |||
| crh.setProject(project); | |||
| instream = crh.getAssembledReader(); | |||
| String text = crh.readFully(instream); | |||
| if (text != null) { | |||
| project.setNewProperty(property, text); | |||
| log("loaded " + text.length() + " characters",Project.MSG_VERBOSE); | |||
| log(property+" := "+text,Project.MSG_DEBUG); | |||
| } | |||
| } catch (final IOException ioe) { | |||
| final String message = "Unable to load file: " + ioe.toString(); | |||
| if (failOnError) { | |||
| throw new BuildException(message, ioe, location); | |||
| } | |||
| else { | |||
| log(message, Project.MSG_ERR); | |||
| } | |||
| } catch (final BuildException be) { | |||
| if (failOnError) { | |||
| throw be; | |||
| } | |||
| else { | |||
| log(be.getMessage(), Project.MSG_ERR); | |||
| } | |||
| } finally { | |||
| try { | |||
| if (fis != null) { | |||
| fis.close(); | |||
| } | |||
| } catch (IOException ioex) { | |||
| //ignore | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Add the FilterChain element. | |||
| */ | |||
| public final void addFilterChain(FilterChain filter) { | |||
| filterChains.addElement(filter); | |||
| } | |||
| //end class | |||
| } | |||
| @@ -1,180 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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.taskdefs; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.types.FilterChain; | |||
| import org.apache.tools.ant.filters.StringInputStream; | |||
| import org.apache.tools.ant.filters.util.ChainReaderHelper; | |||
| import java.io.*; | |||
| import java.util.Enumeration; | |||
| import java.util.Properties; | |||
| import java.util.Vector; | |||
| /** | |||
| * Load a file's contents as Ant Properties. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * @created 20 February 2002 | |||
| */ | |||
| public final class LoadProperties extends Task { | |||
| /** | |||
| * Source file | |||
| */ | |||
| private File srcFile = null; | |||
| /** | |||
| * Holds filterchains | |||
| */ | |||
| private final Vector filterChains = new Vector(); | |||
| /** | |||
| * Sets the srcfile attribute. | |||
| * | |||
| * @param srcFile The new SrcFile value | |||
| */ | |||
| public final void setSrcFile(final File srcFile) { | |||
| this.srcFile = srcFile; | |||
| } | |||
| /** | |||
| * read in a source file's contents and load them up as Ant properties | |||
| * | |||
| * @exception BuildException if something goes wrong with the build | |||
| */ | |||
| public final void execute() throws BuildException { | |||
| //validation | |||
| if (srcFile == null) { | |||
| throw new BuildException("Source file not defined."); | |||
| } | |||
| if (!srcFile.exists()) { | |||
| throw new BuildException("Source file does not exist."); | |||
| } | |||
| if (!srcFile.isFile()) { | |||
| throw new BuildException("Source file is not a file."); | |||
| } | |||
| FileInputStream fis = null; | |||
| BufferedInputStream bis = null; | |||
| Reader instream = null; | |||
| try { | |||
| final long len = srcFile.length(); | |||
| final int size=(int) len; | |||
| //open up the file | |||
| fis = new FileInputStream(srcFile); | |||
| bis = new BufferedInputStream(fis); | |||
| instream = new InputStreamReader(bis); | |||
| ChainReaderHelper crh = new ChainReaderHelper(); | |||
| crh.setBufferSize(size); | |||
| crh.setPrimaryReader(instream); | |||
| crh.setFilterChains(filterChains); | |||
| crh.setProject(project); | |||
| instream = crh.getAssembledReader(); | |||
| String text = crh.readFully(instream); | |||
| if (text != null) { | |||
| if (!text.endsWith("\n")) { | |||
| text = text + "\n"; | |||
| } | |||
| final StringInputStream sis = new StringInputStream(text); | |||
| final Properties props = new Properties(); | |||
| props.load(sis); | |||
| final Enumeration e = props.keys(); | |||
| while (e.hasMoreElements()) { | |||
| final String key = (String) e.nextElement(); | |||
| final String value = props.getProperty(key); | |||
| if (key != null && value != null | |||
| && value.trim().length() > 0) { | |||
| project.setNewProperty(key, value); | |||
| } | |||
| } | |||
| sis.close(); | |||
| } | |||
| } catch (final IOException ioe) { | |||
| final String message = "Unable to load file: " + ioe.toString(); | |||
| throw new BuildException(message, ioe, location); | |||
| } catch (final BuildException be) { | |||
| throw be; | |||
| } finally { | |||
| try { | |||
| if (fis != null) { | |||
| fis.close(); | |||
| } | |||
| } catch (IOException ioex) { | |||
| //ignore | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Add the FilterChain element. | |||
| */ | |||
| public final void addFilterChain(FilterChain filter) { | |||
| filterChains.addElement(filter); | |||
| } | |||
| //end class | |||
| } | |||
| @@ -1,312 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 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.taskdefs; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.types.FilterSetCollection; | |||
| import org.apache.tools.ant.types.FilterSet; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.Enumeration; | |||
| import java.util.Vector; | |||
| /** | |||
| * Moves a file or directory to a new file or directory. By default, | |||
| * the destination is overwriten when existing. When overwrite is | |||
| * turned off, then files are only moved if the source file is | |||
| * newer than the destination file, or when the destination file does | |||
| * not exist.</p> | |||
| * | |||
| * <p>Source files and directories are only deleted when the file or | |||
| * directory has been copied to the destination successfully. Filtering | |||
| * also works.</p> | |||
| * | |||
| * <p>This implementation is based on Arnout Kuiper's initial design | |||
| * document, the following mailing list discussions, and the | |||
| * copyfile/copydir tasks.</p> | |||
| * | |||
| * @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com</a> | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @version $Revision$ | |||
| * | |||
| * @ant:task category="filesystem" | |||
| */ | |||
| public class Move extends Copy { | |||
| private Vector filterSets = null; | |||
| private Vector filterChains = null; | |||
| public Move() { | |||
| super(); | |||
| forceOverwrite = true; | |||
| } | |||
| //************************************************************************ | |||
| // protected and private methods | |||
| //************************************************************************ | |||
| protected void doFileOperations() { | |||
| filterSets = getFilterSets(); | |||
| filterChains = getFilterChains(); | |||
| //Attempt complete directory renames, if any, first. | |||
| if (completeDirMap.size() > 0) { | |||
| Enumeration e = completeDirMap.keys(); | |||
| while (e.hasMoreElements()) { | |||
| File fromDir = (File) e.nextElement(); | |||
| File toDir = (File) completeDirMap.get(fromDir); | |||
| try { | |||
| log("Attempting to rename dir: " + fromDir + | |||
| " to " + toDir, verbosity); | |||
| renameFile(fromDir, toDir, filtering, forceOverwrite); | |||
| } catch (IOException ioe) { | |||
| String msg = "Failed to rename dir " + fromDir | |||
| + " to " + toDir | |||
| + " due to " + ioe.getMessage(); | |||
| throw new BuildException(msg, ioe, location); | |||
| } | |||
| } | |||
| } | |||
| if (fileCopyMap.size() > 0) { // files to move | |||
| log("Moving " + fileCopyMap.size() + " files to " + | |||
| destDir.getAbsolutePath() ); | |||
| Enumeration e = fileCopyMap.keys(); | |||
| while (e.hasMoreElements()) { | |||
| String fromFile = (String) e.nextElement(); | |||
| String toFile = (String) fileCopyMap.get(fromFile); | |||
| if( fromFile.equals( toFile ) ) { | |||
| log("Skipping self-move of " + fromFile, verbosity); | |||
| continue; | |||
| } | |||
| boolean moved = false; | |||
| File f = new File(fromFile); | |||
| if (f.exists()) { //Is this file still available to be moved? | |||
| File d = new File(toFile); | |||
| try { | |||
| log("Attempting to rename: " + fromFile + | |||
| " to " + toFile, verbosity); | |||
| moved = renameFile(f, d, filtering, forceOverwrite); | |||
| } catch (IOException ioe) { | |||
| String msg = "Failed to rename " + fromFile | |||
| + " to " + toFile | |||
| + " due to " + ioe.getMessage(); | |||
| throw new BuildException(msg, ioe, location); | |||
| } | |||
| if (!moved) { | |||
| try { | |||
| log("Moving " + fromFile + " to " + toFile, verbosity); | |||
| FilterSetCollection executionFilters = new FilterSetCollection(); | |||
| if (filtering) { | |||
| executionFilters.addFilterSet(project.getGlobalFilterSet()); | |||
| } | |||
| for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) { | |||
| executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); | |||
| } | |||
| getFileUtils().copyFile(f, d, executionFilters, filterChains, | |||
| forceOverwrite, | |||
| getPreserveLastModified(), | |||
| getEncoding(), project); | |||
| f = new File(fromFile); | |||
| if (!f.delete()) { | |||
| throw new BuildException("Unable to delete file " | |||
| + f.getAbsolutePath()); | |||
| } | |||
| } catch (IOException ioe) { | |||
| String msg = "Failed to copy " + fromFile + " to " | |||
| + toFile | |||
| + " due to " + ioe.getMessage(); | |||
| throw new BuildException(msg, ioe, location); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if (includeEmpty) { | |||
| Enumeration e = dirCopyMap.elements(); | |||
| int count = 0; | |||
| while (e.hasMoreElements()) { | |||
| File d = new File((String)e.nextElement()); | |||
| if (!d.exists()) { | |||
| if (!d.mkdirs()) { | |||
| log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR); | |||
| } else { | |||
| count++; | |||
| } | |||
| } | |||
| } | |||
| if (count > 0) { | |||
| log("Moved " + count + " empty directories to " + destDir.getAbsolutePath()); | |||
| } | |||
| } | |||
| if (filesets.size() > 0) { | |||
| Enumeration e = filesets.elements(); | |||
| while (e.hasMoreElements()) { | |||
| FileSet fs = (FileSet)e.nextElement(); | |||
| File dir = fs.getDir(project); | |||
| if (okToDelete(dir)) { | |||
| deleteDir(dir); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Its only ok to delete a directory tree if there are | |||
| * no files in it. | |||
| */ | |||
| protected boolean okToDelete(File d) { | |||
| String[] list = d.list(); | |||
| if (list == null) { | |||
| return false; | |||
| } // maybe io error? | |||
| for (int i = 0; i < list.length; i++) { | |||
| String s = list[i]; | |||
| File f = new File(d, s); | |||
| if (f.isDirectory()) { | |||
| if (!okToDelete(f)) { | |||
| return false; | |||
| } | |||
| } else { | |||
| return false; // found a file | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| /** | |||
| * Go and delete the directory tree. | |||
| */ | |||
| protected void deleteDir(File d) { | |||
| String[] list = d.list(); | |||
| if (list == null) { | |||
| return; | |||
| } // on an io error list() can return null | |||
| for (int i = 0; i < list.length; i++) { | |||
| String s = list[i]; | |||
| File f = new File(d, s); | |||
| if (f.isDirectory()) { | |||
| deleteDir(f); | |||
| } else { | |||
| throw new BuildException("UNEXPECTED ERROR - The file " + f.getAbsolutePath() + " should not exist!"); | |||
| } | |||
| } | |||
| log("Deleting directory " + d.getAbsolutePath(), verbosity); | |||
| if (!d.delete()) { | |||
| throw new BuildException("Unable to delete directory " + d.getAbsolutePath()); | |||
| } | |||
| } | |||
| /** | |||
| * Attempts to rename a file from a source to a destination. | |||
| * If overwrite is set to true, this method overwrites existing file | |||
| * even if the destination file is newer. Otherwise, the source file is | |||
| * renamed only if the destination file is older than it. | |||
| * Method then checks if token filtering is used. If it is, this method | |||
| * returns false assuming it is the responsibility to the copyFile method. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| protected boolean renameFile(File sourceFile, File destFile, | |||
| boolean filtering, boolean overwrite) | |||
| throws IOException, BuildException { | |||
| boolean renamed = true; | |||
| if ((filterSets != null && filterSets.size() > 0) || | |||
| (filterChains != null && filterChains.size() > 0)) { | |||
| renamed = false; | |||
| } else { | |||
| if (!filtering) { | |||
| // ensure that parent dir of dest file exists! | |||
| // not using getParentFile method to stay 1.1 compat | |||
| String parentPath = destFile.getParent(); | |||
| if (parentPath != null) { | |||
| File parent = new File(parentPath); | |||
| if (!parent.exists()) { | |||
| parent.mkdirs(); | |||
| } | |||
| } | |||
| if (destFile.exists()) { | |||
| if (!destFile.delete()) { | |||
| throw new BuildException("Unable to remove existing file " | |||
| + destFile); | |||
| } | |||
| } | |||
| renamed = sourceFile.renameTo(destFile); | |||
| } else { | |||
| renamed = false; | |||
| } | |||
| } | |||
| return renamed; | |||
| } | |||
| } | |||
| @@ -1,141 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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 java.io.FilterReader; | |||
| import java.util.Hashtable; | |||
| import java.util.Vector; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| /** | |||
| * An AntFileReader is a wrapper class that encloses the classname | |||
| * and configuration of a Configurable FilterReader. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class AntFilterReader | |||
| extends DataType | |||
| implements Cloneable { | |||
| private String className; | |||
| private final Vector parameters = new Vector(); | |||
| private Path classpath; | |||
| public final void setClassName(final String className) { | |||
| this.className = className; | |||
| } | |||
| public final String getClassName() { | |||
| return className; | |||
| } | |||
| public final void addParam(final Parameter param) { | |||
| parameters.addElement(param); | |||
| } | |||
| /** | |||
| * Set the classpath to load the FilterReader through (attribute). | |||
| */ | |||
| public final void setClasspath(Path classpath) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| if (this.classpath == null) { | |||
| this.classpath = classpath; | |||
| } else { | |||
| this.classpath.append(classpath); | |||
| } | |||
| } | |||
| /** | |||
| * Set the classpath to load the FilterReader through (nested element). | |||
| */ | |||
| public final Path createClasspath() { | |||
| if (isReference()) { | |||
| throw noChildrenAllowed(); | |||
| } | |||
| if (this.classpath == null) { | |||
| this.classpath = new Path(getProject()); | |||
| } | |||
| return this.classpath.createPath(); | |||
| } | |||
| /** | |||
| * Get the classpath | |||
| */ | |||
| public final Path getClasspath() { | |||
| return classpath; | |||
| } | |||
| /** | |||
| * Set the classpath to load the FilterReader through via | |||
| * reference (attribute). | |||
| */ | |||
| public void setClasspathRef(Reference r) { | |||
| if (isReference()) { | |||
| throw tooManyAttributes(); | |||
| } | |||
| createClasspath().setRefid(r); | |||
| } | |||
| public final Parameter[] getParams() { | |||
| Parameter[] params = new Parameter[parameters.size()]; | |||
| parameters.copyInto(params); | |||
| return params; | |||
| } | |||
| } | |||
| @@ -1,139 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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 java.util.Vector; | |||
| import org.apache.tools.ant.filters.ClassConstants; | |||
| import org.apache.tools.ant.filters.ExpandProperties; | |||
| import org.apache.tools.ant.filters.HeadFilter; | |||
| import org.apache.tools.ant.filters.LineContains; | |||
| import org.apache.tools.ant.filters.LineContainsRegExp; | |||
| import org.apache.tools.ant.filters.PrefixLines; | |||
| import org.apache.tools.ant.filters.ReplaceTokens; | |||
| import org.apache.tools.ant.filters.StripJavaComments; | |||
| import org.apache.tools.ant.filters.StripLineBreaks; | |||
| import org.apache.tools.ant.filters.StripLineComments; | |||
| import org.apache.tools.ant.filters.TabsToSpaces; | |||
| import org.apache.tools.ant.filters.TailFilter; | |||
| /** | |||
| * FilterChain may contain a chained set of filter readers. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class FilterChain { | |||
| private final Vector filterReaders = new Vector(); | |||
| public final void addFilterReader(final AntFilterReader filterReader) { | |||
| filterReaders.addElement(filterReader); | |||
| } | |||
| public final Vector getFilterReaders() { | |||
| return filterReaders; | |||
| } | |||
| public final void addClassConstants(final ClassConstants classConstants) { | |||
| filterReaders.addElement(classConstants); | |||
| } | |||
| public final void addExpandProperties(final ExpandProperties expandProperties) { | |||
| filterReaders.addElement(expandProperties); | |||
| } | |||
| public final void addHeadFilter(final HeadFilter headFilter) { | |||
| filterReaders.addElement(headFilter); | |||
| } | |||
| public final void addLineContains(final LineContains lineContains) { | |||
| filterReaders.addElement(lineContains); | |||
| } | |||
| public final void addLineContainsRegExp(final LineContainsRegExp | |||
| lineContainsRegExp) { | |||
| filterReaders.addElement(lineContainsRegExp); | |||
| } | |||
| public final void addPrefixLines(final PrefixLines prefixLines) { | |||
| filterReaders.addElement(prefixLines); | |||
| } | |||
| public final void addReplaceTokens(final ReplaceTokens replaceTokens) { | |||
| filterReaders.addElement(replaceTokens); | |||
| } | |||
| public final void addStripJavaComments(final StripJavaComments | |||
| stripJavaComments) { | |||
| filterReaders.addElement(stripJavaComments); | |||
| } | |||
| public final void addStripLineBreaks(final StripLineBreaks | |||
| stripLineBreaks) { | |||
| filterReaders.addElement(stripLineBreaks); | |||
| } | |||
| public final void addStripLineComments(final StripLineComments | |||
| stripLineComments) { | |||
| filterReaders.addElement(stripLineComments); | |||
| } | |||
| public final void addTabsToSpaces(final TabsToSpaces tabsToSpaces) { | |||
| filterReaders.addElement(tabsToSpaces); | |||
| } | |||
| public final void addTailFilter(final TailFilter tailFilter) { | |||
| filterReaders.addElement(tailFilter); | |||
| } | |||
| } | |||
| @@ -1,89 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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; | |||
| /** | |||
| * A parameter is composed of a name, type and value. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public final class Parameter { | |||
| private String name = null; | |||
| private String type = null; | |||
| private String value = null; | |||
| public final void setName(final String name) { | |||
| this.name = name; | |||
| } | |||
| public final void setType(final String type) { | |||
| this.type = type; | |||
| } | |||
| public final void setValue(final String value) { | |||
| this.value = value; | |||
| } | |||
| public final String getName() { | |||
| return name; | |||
| } | |||
| public final String getType() { | |||
| return type; | |||
| } | |||
| public final String getValue() { | |||
| return value; | |||
| } | |||
| } | |||
| @@ -1,65 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2002 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 java.util.Vector; | |||
| /** | |||
| * Parameterizable objects take genric key value pairs. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public interface Parameterizable { | |||
| void setParameters(Parameter[] parameters); | |||
| } | |||
| @@ -1,744 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001-2002 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.util; | |||
| import java.io.BufferedInputStream; | |||
| import java.io.BufferedReader; | |||
| import java.io.BufferedWriter; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.FileReader; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.InputStreamReader; | |||
| import java.io.OutputStreamWriter; | |||
| import java.io.Reader; | |||
| import java.lang.reflect.Method; | |||
| import java.text.DecimalFormat; | |||
| import java.util.Random; | |||
| import java.util.Stack; | |||
| import java.util.StringTokenizer; | |||
| import java.util.Vector; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.filters.util.ChainReaderHelper; | |||
| import org.apache.tools.ant.types.FilterSetCollection; | |||
| /** | |||
| * This class also encapsulates methods which allow Files to be | |||
| * refered to using abstract path names which are translated to native | |||
| * system file paths at runtime as well as copying files or setting | |||
| * there last modification time. | |||
| * | |||
| * @author duncan@x180.com | |||
| * @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * | |||
| * @version $Revision$ | |||
| */ | |||
| public class FileUtils { | |||
| private static Random rand = new Random(System.currentTimeMillis()); | |||
| private static Object lockReflection = new Object(); | |||
| private static java.lang.reflect.Method setLastModified = null; | |||
| /** | |||
| * Factory method. | |||
| */ | |||
| public static FileUtils newFileUtils() { | |||
| return new FileUtils(); | |||
| } | |||
| /** | |||
| * Empty constructor. | |||
| */ | |||
| protected FileUtils() {} | |||
| /** | |||
| * Convienence method to copy a file from a source to a destination. | |||
| * No filtering is performed. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile) throws IOException { | |||
| copyFile(new File(sourceFile), new File(destFile), null, false, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a destination | |||
| * specifying if token filtering must be used. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters) | |||
| throws IOException | |||
| { | |||
| copyFile(new File(sourceFile), new File(destFile), filters, false, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used and if | |||
| * source files may overwrite newer destination files. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, | |||
| boolean overwrite) throws IOException { | |||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||
| overwrite, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * source files may overwrite newer destination files and the | |||
| * last modified time of <code>destFile</code> file should be made equal | |||
| * to the last modified time of <code>sourceFile</code>. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, | |||
| boolean overwrite, boolean preserveLastModified) | |||
| throws IOException { | |||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||
| overwrite, preserveLastModified); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * source files may overwrite newer destination files and the | |||
| * last modified time of <code>destFile</code> file should be made equal | |||
| * to the last modified time of <code>sourceFile</code>. | |||
| * | |||
| * @throws IOException | |||
| * | |||
| * @since 1.14, Ant 1.5 | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile, | |||
| FilterSetCollection filters, boolean overwrite, | |||
| boolean preserveLastModified, String encoding) | |||
| throws IOException { | |||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||
| overwrite, preserveLastModified, encoding); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * filter chains must be used, if source files may overwrite | |||
| * newer destination files and the last modified time of | |||
| * <code>destFile</code> file should be made equal | |||
| * to the last modified time of <code>sourceFile</code>. | |||
| * | |||
| * @throws IOException | |||
| * | |||
| * @since 1.15, Ant 1.5 | |||
| */ | |||
| public void copyFile(String sourceFile, String destFile, | |||
| FilterSetCollection filters, Vector filterChains, | |||
| boolean overwrite, boolean preserveLastModified, | |||
| String encoding, Project project) | |||
| throws IOException { | |||
| copyFile(new File(sourceFile), new File(destFile), filters, | |||
| filterChains, overwrite, preserveLastModified, | |||
| encoding, project); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a destination. | |||
| * No filtering is performed. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile) throws IOException { | |||
| copyFile(sourceFile, destFile, null, false, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a destination | |||
| * specifying if token filtering must be used. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters) | |||
| throws IOException { | |||
| copyFile(sourceFile, destFile, filters, false, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used and if | |||
| * source files may overwrite newer destination files. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, | |||
| boolean overwrite) throws IOException { | |||
| copyFile(sourceFile, destFile, filters, overwrite, false); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * source files may overwrite newer destination files and the | |||
| * last modified time of <code>destFile</code> file should be made equal | |||
| * to the last modified time of <code>sourceFile</code>. | |||
| * | |||
| * @throws IOException | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, | |||
| boolean overwrite, boolean preserveLastModified) | |||
| throws IOException { | |||
| copyFile(sourceFile, destFile, filters, overwrite, | |||
| preserveLastModified, null); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * source files may overwrite newer destination files, the last | |||
| * modified time of <code>destFile</code> file should be made | |||
| * equal to the last modified time of <code>sourceFile</code> and | |||
| * which character encoding to assume. | |||
| * | |||
| * @throws IOException | |||
| * | |||
| * @since 1.14, Ant 1.5 | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile, | |||
| FilterSetCollection filters, boolean overwrite, | |||
| boolean preserveLastModified, String encoding) | |||
| throws IOException { | |||
| copyFile(sourceFile, destFile, filters, null, overwrite, | |||
| preserveLastModified, encoding, null); | |||
| } | |||
| /** | |||
| * Convienence method to copy a file from a source to a | |||
| * destination specifying if token filtering must be used, if | |||
| * filter chains must be used, if source files may overwrite | |||
| * newer destination files and the last modified time of | |||
| * <code>destFile</code> file should be made equal | |||
| * to the last modified time of <code>sourceFile</code>. | |||
| * | |||
| * @throws IOException | |||
| * | |||
| * @since 1.15, Ant 1.5 | |||
| */ | |||
| public void copyFile(File sourceFile, File destFile, | |||
| FilterSetCollection filters, Vector filterChains, | |||
| boolean overwrite, boolean preserveLastModified, | |||
| String encoding, Project project) | |||
| throws IOException { | |||
| if (overwrite || !destFile.exists() || | |||
| destFile.lastModified() < sourceFile.lastModified()) { | |||
| if (destFile.exists() && destFile.isFile()) { | |||
| destFile.delete(); | |||
| } | |||
| // ensure that parent dir of dest file exists! | |||
| // not using getParentFile method to stay 1.1 compat | |||
| File parent = getParentFile(destFile); | |||
| if (!parent.exists()) { | |||
| parent.mkdirs(); | |||
| } | |||
| final boolean filterSetsAvailable = (filters != null | |||
| && filters.hasFilters()); | |||
| final boolean filterChainsAvailable = (filterChains != null | |||
| && filterChains.size() > 0); | |||
| if (filterSetsAvailable || filterChainsAvailable) { | |||
| BufferedReader in = null; | |||
| BufferedWriter out = null; | |||
| if (encoding == null) { | |||
| in = new BufferedReader(new FileReader(sourceFile)); | |||
| out = new BufferedWriter(new FileWriter(destFile)); | |||
| } else { | |||
| in = new BufferedReader(new InputStreamReader( | |||
| new FileInputStream(sourceFile), encoding)); | |||
| out = new BufferedWriter(new OutputStreamWriter( | |||
| new FileOutputStream(destFile), encoding)); | |||
| } | |||
| if (filterChainsAvailable) { | |||
| ChainReaderHelper crh = new ChainReaderHelper(); | |||
| crh.setBufferSize(8192); | |||
| crh.setPrimaryReader(in); | |||
| crh.setFilterChains(filterChains); | |||
| crh.setProject(project); | |||
| Reader rdr = crh.getAssembledReader(); | |||
| in = new BufferedReader(rdr); | |||
| } | |||
| int length; | |||
| String newline = null; | |||
| String line = in.readLine(); | |||
| while (line != null) { | |||
| if (line.length() == 0) { | |||
| out.newLine(); | |||
| } else { | |||
| if (filterSetsAvailable) { | |||
| newline = filters.replaceTokens(line); | |||
| } else { | |||
| newline = line; | |||
| } | |||
| out.write(newline); | |||
| out.newLine(); | |||
| } | |||
| line = in.readLine(); | |||
| } | |||
| out.close(); | |||
| in.close(); | |||
| } else { | |||
| FileInputStream in = new FileInputStream(sourceFile); | |||
| FileOutputStream out = new FileOutputStream(destFile); | |||
| byte[] buffer = new byte[8 * 1024]; | |||
| int count = 0; | |||
| do { | |||
| out.write(buffer, 0, count); | |||
| count = in.read(buffer, 0, buffer.length); | |||
| } while (count != -1); | |||
| in.close(); | |||
| out.close(); | |||
| } | |||
| if (preserveLastModified) { | |||
| setFileLastModified(destFile, sourceFile.lastModified()); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * see whether we have a setLastModified method in File and return it. | |||
| */ | |||
| protected final Method getSetLastModified() { | |||
| if (Project.getJavaVersion() == Project.JAVA_1_1) { | |||
| return null; | |||
| } | |||
| if (setLastModified == null) { | |||
| synchronized (lockReflection) { | |||
| if (setLastModified == null) { | |||
| try { | |||
| setLastModified = | |||
| java.io.File.class.getMethod("setLastModified", | |||
| new Class[] {Long.TYPE}); | |||
| } catch (NoSuchMethodException nse) { | |||
| throw new BuildException("File.setlastModified not in JDK > 1.1?", | |||
| nse); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return setLastModified; | |||
| } | |||
| /** | |||
| * Calls File.setLastModified(long time) in a Java 1.1 compatible way. | |||
| */ | |||
| public void setFileLastModified(File file, long time) throws BuildException { | |||
| if (Project.getJavaVersion() == Project.JAVA_1_1) { | |||
| return; | |||
| } | |||
| Long[] times = new Long[1]; | |||
| if (time < 0) { | |||
| times[0] = new Long(System.currentTimeMillis()); | |||
| } else { | |||
| times[0] = new Long(time); | |||
| } | |||
| try { | |||
| getSetLastModified().invoke(file, times); | |||
| } catch (java.lang.reflect.InvocationTargetException ite) { | |||
| Throwable nested = ite.getTargetException(); | |||
| throw new BuildException("Exception setting the modification time " | |||
| + "of " + file, nested); | |||
| } catch (Throwable other) { | |||
| throw new BuildException("Exception setting the modification time " | |||
| + "of " + file, other); | |||
| } | |||
| } | |||
| /** | |||
| * Interpret the filename as a file relative to the given file - | |||
| * unless the filename already represents an absolute filename. | |||
| * | |||
| * @param file the "reference" file for relative paths. This | |||
| * instance must be an absolute file and must not contain | |||
| * "./" or "../" sequences (same for \ instead | |||
| * of /). If it is null, this call is equivalent to | |||
| * <code>new java.io.File(filename)</code>. | |||
| * | |||
| * @param filename a file name | |||
| * | |||
| * @return an absolute file that doesn't contain "./" or | |||
| * "../" sequences and uses the correct separator for | |||
| * the current platform. | |||
| */ | |||
| public File resolveFile(File file, String filename) { | |||
| filename = filename.replace('/', File.separatorChar) | |||
| .replace('\\', File.separatorChar); | |||
| // deal with absolute files | |||
| if (filename.startsWith(File.separator) || | |||
| (filename.length() >= 2 && | |||
| Character.isLetter(filename.charAt(0)) && | |||
| filename.charAt(1) == ':') | |||
| ) { | |||
| return normalize(filename); | |||
| } | |||
| if (file == null) { | |||
| return new File(filename); | |||
| } | |||
| File helpFile = new File(file.getAbsolutePath()); | |||
| StringTokenizer tok = new StringTokenizer(filename, File.separator); | |||
| while (tok.hasMoreTokens()) { | |||
| String part = tok.nextToken(); | |||
| if (part.equals("..")) { | |||
| helpFile = getParentFile(helpFile); | |||
| if (helpFile == null) { | |||
| String msg = "The file or path you specified (" | |||
| + filename + ") is invalid relative to " | |||
| + file.getPath(); | |||
| throw new BuildException(msg); | |||
| } | |||
| } else if (part.equals(".")) { | |||
| // Do nothing here | |||
| } else { | |||
| helpFile = new File(helpFile, part); | |||
| } | |||
| } | |||
| return new File(helpFile.getAbsolutePath()); | |||
| } | |||
| /** | |||
| * "normalize" the given absolute path. | |||
| * | |||
| * <p>This includes: | |||
| * <ul> | |||
| * <li>Uppercase the drive letter if there is one.</li> | |||
| * <li>Remove redundant slashes after the drive spec.</li> | |||
| * <li>resolve all ./, .\, ../ and ..\ sequences.</li> | |||
| * <li>DOS style paths that start with a drive letter will have | |||
| * \ as the separator.</li> | |||
| * </ul> | |||
| * | |||
| * @throws java.lang.NullPointerException if the file path is | |||
| * equal to null. | |||
| */ | |||
| public File normalize(String path) { | |||
| String orig = path; | |||
| path = path.replace('/', File.separatorChar) | |||
| .replace('\\', File.separatorChar); | |||
| // make sure we are dealing with an absolute path | |||
| if (!path.startsWith(File.separator) && | |||
| ! (path.length() >= 2 && | |||
| Character.isLetter(path.charAt(0)) && | |||
| path.charAt(1) == ':') | |||
| ) { | |||
| String msg = path + " is not an absolute path"; | |||
| throw new BuildException(msg); | |||
| } | |||
| boolean dosWithDrive = false; | |||
| String root = null; | |||
| // Eliminate consecutive slashes after the drive spec | |||
| if (path.length() >= 2 && | |||
| Character.isLetter(path.charAt(0)) && | |||
| path.charAt(1) == ':') { | |||
| dosWithDrive = true; | |||
| char[] ca = path.replace('/', '\\').toCharArray(); | |||
| StringBuffer sb = new StringBuffer(); | |||
| sb.append(Character.toUpperCase(ca[0])).append(':'); | |||
| for (int i = 2; i < ca.length; i++) { | |||
| if ((ca[i] != '\\') || | |||
| (ca[i] == '\\' && ca[i - 1] != '\\') | |||
| ) { | |||
| sb.append(ca[i]); | |||
| } | |||
| } | |||
| path = sb.toString().replace('\\', File.separatorChar); | |||
| if (path.length() == 2) { | |||
| root = path; | |||
| path = ""; | |||
| } else { | |||
| root = path.substring(0, 3); | |||
| path = path.substring(3); | |||
| } | |||
| } else { | |||
| if (path.length() == 1) { | |||
| root = File.separator; | |||
| path = ""; | |||
| } else if (path.charAt(1) == File.separatorChar) { | |||
| // UNC drive | |||
| root = File.separator+File.separator; | |||
| path = path.substring(2); | |||
| } else { | |||
| root = File.separator; | |||
| path = path.substring(1); | |||
| } | |||
| } | |||
| Stack s = new Stack(); | |||
| s.push(root); | |||
| StringTokenizer tok = new StringTokenizer(path, File.separator); | |||
| while (tok.hasMoreTokens()) { | |||
| String thisToken = tok.nextToken(); | |||
| if (".".equals(thisToken)) { | |||
| continue; | |||
| } else if ("..".equals(thisToken)) { | |||
| if (s.size() < 2) { | |||
| throw new BuildException("Cannot resolve path "+orig); | |||
| } else { | |||
| s.pop(); | |||
| } | |||
| } else { // plain component | |||
| s.push(thisToken); | |||
| } | |||
| } | |||
| StringBuffer sb = new StringBuffer(); | |||
| for (int i=0; i<s.size(); i++) { | |||
| if (i > 1) { | |||
| // not before the filesystem root and not after it, since root | |||
| // already contains one | |||
| sb.append(File.separatorChar); | |||
| } | |||
| sb.append(s.elementAt(i)); | |||
| } | |||
| path = sb.toString(); | |||
| if (dosWithDrive) { | |||
| path = path.replace('/', '\\'); | |||
| } | |||
| return new File(path); | |||
| } | |||
| /** | |||
| * Create a temporary file in a given directory. | |||
| * | |||
| * <p>The file denoted by the returned abstract pathname did not | |||
| * exist before this method was invoked, any subsequent invocation | |||
| * of this method will yield a different file name.</p> | |||
| * | |||
| * <p>This method is different to File.createTempFile of JDK 1.2 | |||
| * as it doesn't create the file itself and doesn't use platform | |||
| * specific temporary directory when the parentDir attribute is | |||
| * null.</p> | |||
| * | |||
| * @param parentDir Directory to create the temporary file in - | |||
| * current working directory will be assumed if this parameter is | |||
| * null. | |||
| * | |||
| * @since 1.8 | |||
| */ | |||
| public File createTempFile(String prefix, String suffix, File parentDir) { | |||
| File result = null; | |||
| String parent = null; | |||
| if (parentDir != null) { | |||
| parent = parentDir.getPath(); | |||
| } | |||
| DecimalFormat fmt = new DecimalFormat("#####"); | |||
| synchronized (rand) { | |||
| do { | |||
| result = new File(parent, | |||
| prefix + fmt.format(rand.nextInt()) | |||
| + suffix); | |||
| } while (result.exists()); | |||
| } | |||
| return result; | |||
| } | |||
| /** | |||
| * Compares the contents of two files. | |||
| * | |||
| * <p>simple but sub-optimal comparision algorithm. written for | |||
| * working rather than fast. Better would be a block read into | |||
| * buffers followed by long comparisions apart from the final 1-7 | |||
| * bytes.</p> | |||
| * | |||
| * @since 1.9 | |||
| */ | |||
| public boolean contentEquals(File f1, File f2) throws IOException { | |||
| if (f1.exists() != f2.exists()) { | |||
| return false; | |||
| } | |||
| if (!f1.exists()) { | |||
| // two not existing files are equal | |||
| return true; | |||
| } | |||
| if (f1.isDirectory() || f2.isDirectory()) { | |||
| // don't want to compare directory contents for now | |||
| return false; | |||
| } | |||
| if (f1.equals(f2)) { | |||
| // same filename => true | |||
| return true; | |||
| } | |||
| if (f1.length() != f2.length()) { | |||
| // different size =>false | |||
| return false; | |||
| } | |||
| InputStream in1 = null; | |||
| InputStream in2 = null; | |||
| try { | |||
| in1 = new BufferedInputStream(new FileInputStream(f1)); | |||
| in2 = new BufferedInputStream(new FileInputStream(f2)); | |||
| int expectedByte = in1.read(); | |||
| while (expectedByte != -1) { | |||
| if (expectedByte != in2.read()) { | |||
| return false; | |||
| } | |||
| expectedByte = in1.read(); | |||
| } | |||
| if (in2.read() != -1) { | |||
| return false; | |||
| } | |||
| return true; | |||
| } finally { | |||
| if (in1 != null) { | |||
| try { | |||
| in1.close(); | |||
| } catch (IOException e) {} | |||
| } | |||
| if (in2 != null) { | |||
| try { | |||
| in2.close(); | |||
| } catch (IOException e) {} | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Emulation of File.getParentFile for JDK 1.1 | |||
| * | |||
| * @since 1.10 | |||
| */ | |||
| public File getParentFile(File f) { | |||
| if (f != null) { | |||
| String p = f.getParent(); | |||
| if (p != null) { | |||
| return new File(p); | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * Read from reader till EOF | |||
| */ | |||
| public static final String readFully(Reader rdr) throws IOException { | |||
| return readFully(rdr, 8192); | |||
| } | |||
| /** | |||
| * Read from reader till EOF | |||
| */ | |||
| public static final String readFully(Reader rdr, int bufferSize) throws IOException { | |||
| final char[] buffer = new char[bufferSize]; | |||
| int bufferLength = 0; | |||
| String text = null; | |||
| StringBuffer textBuffer = null; | |||
| while (bufferLength != -1) { | |||
| bufferLength = rdr.read(buffer); | |||
| if (bufferLength != -1) { | |||
| if (textBuffer == null) { | |||
| textBuffer = new StringBuffer( | |||
| new String(buffer, 0, bufferLength)); | |||
| } else { | |||
| textBuffer.append(new String(buffer, 0, bufferLength)); | |||
| } | |||
| } | |||
| } | |||
| if (textBuffer != null) { | |||
| text = textBuffer.toString(); | |||
| } | |||
| return text; | |||
| } | |||
| } | |||
| @@ -1,152 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 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.taskdefs; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| /** | |||
| * Tests FileSet using the Copy task. | |||
| * | |||
| * @author David Rees <dave@ubiqsoft.com> | |||
| */ | |||
| public class CopyTest extends BuildFileTest { | |||
| public CopyTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/copy.xml"); | |||
| } | |||
| public void test1() { | |||
| executeTarget("test1"); | |||
| File f = new File(getProjectDir(), "copytest1.tmp"); | |||
| if ( !f.exists()) { | |||
| fail("Copy failed"); | |||
| } | |||
| } | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||
| public void test2() { | |||
| executeTarget("test2"); | |||
| File f = new File(getProjectDir(), "copytest1dir/copy.xml"); | |||
| if ( !f.exists()) { | |||
| fail("Copy failed"); | |||
| } | |||
| } | |||
| public void test3() { | |||
| executeTarget("test3"); | |||
| File file3 = new File(getProjectDir(), "copytest3.tmp"); | |||
| assertTrue(file3.exists()); | |||
| File file3a = new File(getProjectDir(), "copytest3a.tmp"); | |||
| assertTrue(file3a.exists()); | |||
| File file3b = new File(getProjectDir(), "copytest3b.tmp"); | |||
| assertTrue(file3b.exists()); | |||
| File file3c = new File(getProjectDir(), "copytest3c.tmp"); | |||
| assertTrue(file3c.exists()); | |||
| //file length checks rely on touch generating a zero byte file | |||
| if(file3.length()==0) { | |||
| fail("could not overwrite an existing, older file"); | |||
| } | |||
| if(file3c.length()!=0) { | |||
| fail("could not force overwrite an existing, newer file"); | |||
| } | |||
| if(file3b.length()==0) { | |||
| fail("unexpectedly overwrote an existing, newer file"); | |||
| } | |||
| //file time checks for java1.2+ | |||
| if (Project.getJavaVersion() != Project.JAVA_1_1) { | |||
| assertTrue(file3a.lastModified()==file3.lastModified()); | |||
| assertTrue(file3c.lastModified()<file3a.lastModified()); | |||
| } | |||
| } | |||
| public void testFilterSet() throws IOException { | |||
| executeTarget("testFilterSet"); | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| File tmp = new File(getProjectDir(), "copy.filterset.tmp"); | |||
| File check = new File(getProjectDir(), "expected/copy.filterset.filtered"); | |||
| assertTrue(tmp.exists()); | |||
| assertTrue(fileUtils.contentEquals(tmp, check)); | |||
| } | |||
| public void testFilterChain() throws IOException { | |||
| executeTarget("testFilterChain"); | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| File tmp = new File(getProjectDir(), "copy.filterchain.tmp"); | |||
| File check = new File(getProjectDir(), "expected/copy.filterset.filtered"); | |||
| assertTrue(tmp.exists()); | |||
| assertTrue(fileUtils.contentEquals(tmp, check)); | |||
| } | |||
| public void testSingleFileFileset() { | |||
| executeTarget("test_single_file_fileset"); | |||
| File file = new File(getProjectDir(), | |||
| "copytest_single_file_fileset.tmp"); | |||
| assertTrue(file.exists()); | |||
| } | |||
| } | |||
| @@ -1,185 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001-2002 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.taskdefs; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.BuildException; | |||
| import java.io.File; | |||
| /** | |||
| * Test the load file task | |||
| * | |||
| * @author Steve Loughran | |||
| * @created 10 December 2001 | |||
| */ | |||
| public class LoadFileTest extends BuildFileTest { | |||
| /** | |||
| * Constructor for the LoadFileTest object | |||
| * | |||
| * @param name Description of Parameter | |||
| */ | |||
| public LoadFileTest(String name) { | |||
| super(name); | |||
| } | |||
| /** | |||
| * The JUnit setup method | |||
| */ | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/loadfile.xml"); | |||
| } | |||
| /** | |||
| * The teardown method for JUnit | |||
| */ | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testNoSourcefileDefined() { | |||
| expectBuildException("testNoSourcefileDefined", | |||
| "source file not defined"); | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testNoPropertyDefined() { | |||
| expectBuildException("testNoPropertyDefined", | |||
| "output property not defined"); | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testNoSourcefilefound() { | |||
| expectBuildExceptionContaining("testNoSourcefilefound", | |||
| "File not found", | |||
| "Unable to load file"); | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testFailOnError() | |||
| throws BuildException { | |||
| expectPropertyUnset("testFailOnError","testFailOnError"); | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testLoadAFile() | |||
| throws BuildException { | |||
| executeTarget("testLoadAFile"); | |||
| if(project.getProperty("testLoadAFile").indexOf("eh?")<0) { | |||
| fail("property is not all in the file"); | |||
| } | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testLoadAFileEnc() | |||
| throws BuildException { | |||
| executeTarget("testLoadAFileEnc"); | |||
| if(project.getProperty("testLoadAFileEnc")==null) { | |||
| fail("file load failed"); | |||
| } | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testEvalProps() | |||
| throws BuildException { | |||
| executeTarget("testEvalProps"); | |||
| if(project.getProperty("testEvalProps").indexOf("rain")<0) { | |||
| fail("property eval broken"); | |||
| } | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testFilterChain() | |||
| throws BuildException { | |||
| executeTarget("testFilterChain"); | |||
| if(project.getProperty("testFilterChain").indexOf("World!")<0) { | |||
| fail("Filter Chain broken"); | |||
| } | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testOneLine() | |||
| throws BuildException { | |||
| expectPropertySet("testOneLine","testOneLine","1,2,3,4"); | |||
| } | |||
| } | |||
| @@ -1,106 +0,0 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 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.taskdefs; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| /** | |||
| * Tests the Move task. | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public class MoveTest extends BuildFileTest { | |||
| public MoveTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/move.xml"); | |||
| } | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||
| public void testFilterSet() throws IOException { | |||
| executeTarget("testFilterSet"); | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| File tmp = new File(getProjectDir(), "move.filterset.tmp"); | |||
| File check = new File(getProjectDir(), "expected/copy.filterset.filtered"); | |||
| assertTrue(tmp.exists()); | |||
| assertTrue(fileUtils.contentEquals(tmp, check)); | |||
| } | |||
| public void testSingleFileFileset() { | |||
| executeTarget("test_single_file_fileset"); | |||
| File file = new File(getProjectDir(), | |||
| "copytest_single_file_fileset.tmp"); | |||
| assertTrue(file.exists()); | |||
| } | |||
| public void testFilterChain() throws IOException { | |||
| executeTarget("testFilterChain"); | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| File tmp = new File(getProjectDir(), "move.filterchain.tmp"); | |||
| File check = new File(getProjectDir(), "expected/copy.filterset.filtered"); | |||
| assertTrue(tmp.exists()); | |||
| assertTrue(fileUtils.contentEquals(tmp, check)); | |||
| } | |||
| } | |||