| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
| |
| <HTML> |
| <HEAD> |
| <TITLE>FilterChains and FilterReaders</TITLE> |
| <link rel="stylesheet" type="text/css" href="../stylesheets/antmanual.css"> |
| </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/concat.html">Concat</a>,<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="#escapeunicode">EscapeUnicode</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> |
| <a href="#deletecharacters">DeleteCharacters</a><BR> |
| <a href="#concatfilter">ConcatFilter</a><BR> |
| <a href="#tokenfilter">TokenFilter</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="escapeunicode">EscapeUnicode</a></H3> |
| <P> |
| This filter converts its input by changing all non US-ASCII characters |
| into their equivalent unicode escape backslash u plus 4 digits.</p> |
| |
| <P><em>since Ant 1.6</em></p> |
| |
| <H4>Example:</H4> |
| |
| This loads the basic constants defined in a Java class as Ant properties. |
| <BLOCKQUOTE><PRE> |
| <loadproperties srcfile="non_ascii_property.properties"> |
| <filterchain> |
| <filterreader classname="org.apache.tools.ant.filters.EscapeUnicode"/> |
| </filterchain> |
| </loadproperties> |
| </PRE></BLOCKQUOTE> |
| |
| Convenience method: |
| <BLOCKQUOTE><PRE> |
| <loadproperties srcfile="non_ascii_property.properties"> |
| <filterchain> |
| <escapeunicode/> |
| </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" <BR> A negative value means that all lines are |
| passed (useful with <I>skip</I>)</TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>skip</TD> |
| <TD vAlign=top align="center">Number of lines to be skipped (from the beginning). |
| Defaults to "0"</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> |
| |
| This stores the first 15 lines, skipping the first 2 lines, of the supplied data |
| in the porperty ${src.file.head}. (Means: lines 3-17) |
| <BLOCKQUOTE><PRE> |
| <loadfile srcfile="${src.file}" property="${src.file.head}"> |
| <filterchain> |
| <headfilter lines="15" skip="2"/> |
| </filterchain> |
| </loadfile> |
| </PRE></BLOCKQUOTE> |
| |
| See the testcases for more examples (<I>src\etc\testcases\filters\head-tail.xml</I> in the |
| source distribution). |
| |
| <H3><a name="linecontains">LineContains</a></H3> |
| |
| This filter includes only those lines that contain all the user-specified |
| strings. |
| |
| <TABLE cellSpacing=0 cellPadding=2 border=1> |
| <TR> |
| <TD vAlign=top><B>Parameter Type</B></TD> |
| <TD vAlign=top><B>Parameter Value</B></TD> |
| <TD vAlign=top align="center"><B>Required</B></TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>contains</TD> |
| <TD vAlign=top align="center">Substring to be searched for.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| <P> |
| <H4>Example:</H4> |
| |
| This will include only those lines that contain <code>foo</code> and |
| <code>bar</code>. |
| <BLOCKQUOTE><PRE> |
| <filterreader classname="org.apache.tools.ant.filters.LineContains"> |
| <param type="contains" value="foo"/> |
| <param type="contains" value="bar"/> |
| </filterreader> |
| </PRE></BLOCKQUOTE> |
| |
| Convenience method: |
| <BLOCKQUOTE><PRE> |
| <linecontains> |
| <contains value="foo"> |
| <contains value="bar"> |
| </linecontains> |
| </PRE></BLOCKQUOTE> |
| |
| <H3><a name="linecontainsregexp">LineContainsRegExp</a></H3> |
| |
| Filter which includes only those lines that contain the user-specified |
| regular expression matching strings. |
| |
| <TABLE cellSpacing=0 cellPadding=2 border=1> |
| <TR> |
| <TD vAlign=top><B>Parameter Type</B></TD> |
| <TD vAlign=top><B>Parameter Value</B></TD> |
| <TD vAlign=top align="center"><B>Required</B></TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>regexp</TD> |
| <TD vAlign=top align="center">Pattern of the substring to be searched for.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| <P> |
| <H4>Example:</H4> |
| |
| This will fetch all those lines that contain the pattern <code>foo</code> |
| <BLOCKQUOTE><PRE> |
| <filterreader classname="org.apache.tools.ant.filters.LineContainsRegExp"> |
| <param type="regexp" value="foo*"/> |
| </filterreader> |
| </PRE></BLOCKQUOTE> |
| |
| Convenience method: |
| <BLOCKQUOTE><PRE> |
| <linecontainsregexp> |
| <regexp pattern="foo*"> |
| </linecontainsregexp> |
| </PRE></BLOCKQUOTE> |
| |
| <H3><a name="prefixlines">PrefixLines</a></H3> |
| |
| Attaches a prefix to every line. |
| |
| <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>prefix</TD> |
| <TD vAlign=top align="center">Prefix to be attached to lines.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| <P> |
| <H4>Example:</H4> |
| |
| This will attach the prefix <code>Foo</code> to all lines. |
| <BLOCKQUOTE><PRE> |
| <filterreader classname="org.apache.tools.ant.filters.PrefixLines"> |
| <param name="prefix" value="Foo"/> |
| </filterreader> |
| </PRE></BLOCKQUOTE> |
| |
| Convenience method: |
| <BLOCKQUOTE><PRE> |
| <prefixlines prefix="Foo"/> |
| </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="striplinecomments">StripLineComments</a></H3> |
| |
| This filter removes all those lines that begin with strings |
| that represent comments as specified by the user. |
| |
| <TABLE cellSpacing=0 cellPadding=2 border=1> |
| <TR> |
| <TD vAlign=top><B>Parameter Type</B></TD> |
| <TD vAlign=top><B>Parameter Value</B></TD> |
| <TD vAlign=top align="center"><B>Required</B></TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>comment</TD> |
| <TD vAlign=top align="center">Strings that identify a line as a comment |
| when they appear at the start of the line.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| <P> |
| <H4>Examples:</H4> |
| |
| This removes all lines that begin with #, --, REM, rem and // |
| <BLOCKQUOTE><PRE> |
| <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> |
| </PRE></BLOCKQUOTE> |
| |
| Convenience method: |
| <BLOCKQUOTE><PRE> |
| <striplinecomments> |
| <comment value="#"/> |
| <comment value="--"/> |
| <comment value="REM "/> |
| <comment value="rem "/> |
| <comment value="//"/> |
| </striplinecomments> |
| </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" <BR> A negative value means that all lines are |
| passed (useful with <I>skip</I>)</TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>skip</TD> |
| <TD vAlign=top align="center">Number of lines to be skipped (from the end). |
| Defaults to "0" </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| <P> |
| |
| <H4>Background:</H4> |
| With HeadFilter and TailFilter you can extract each part of a text file you want. |
| This graphic shows the dependencies: |
| |
| <TABLE cellSpacing=0 cellPadding=2 border=1> |
| <TR> |
| <TH> Content </TH> |
| <TH></TH> |
| <TH></TH> |
| <TH></TH> |
| <TH> Filter </TH> |
| </TR> |
| <TR> |
| <TD> Line 1 </TD> |
| <TD rowspan="2" bgcolor="#C0C0C0"> </TD> |
| <TD rowspan="9" bgcolor="#FF00FF"> </TD> |
| <TD rowspan="4"> </TD> |
| <TD rowspan="11"> |
| <TABLE> |
| <TR> |
| <TD bgcolor="#C0C0C0"> </TD> |
| <TD><PRE><filterchain> |
| <headfilter lines="2"/> |
| </filterchain></PRE></TD> |
| </TR> |
| <TR> |
| <TD bgcolor="#FF00FF"> </TD> |
| <TD><PRE><filterchain> |
| <tailfilter lines="-1" skip="2"/> |
| </filterchain></PRE></TD> |
| </TR> |
| <TR> |
| <TD bgcolor="#008000"> </TD> |
| <TD><PRE><filterchain> |
| <headfilter lines="-1" skip="2"/> |
| </filterchain></PRE></TD> |
| </TR> |
| <TR> |
| <TD bgcolor="#0000FF"> </TD> |
| <TD><PRE><filterchain> |
| <headfilter lines="-1" skip="2"/> |
| <tailfilter lines="-1" skip="2"/> |
| </filterchain></PRE></TD> |
| </TR> |
| <TR> |
| <TD bgcolor="#00FF00"> </TD> |
| <TD><PRE><filterchain> |
| <tailfilter lines="2"/> |
| </filterchain></PRE></TD> |
| </TR> |
| </TABLE> |
| </TD> |
| </TR> |
| <TR> |
| <TD> Line 2 </TD> |
| </TR> |
| <TR> |
| <TD> Line 3 </TD> |
| <TD rowspan="9" bgcolor="#008000"> </TD> |
| </TR> |
| <TR> |
| <TD> Line 4 </TD> |
| </TR> |
| <TR> |
| <TD> Line 5 </TD> |
| <TD rowspan="3" bgcolor="#0000FF"> </TD> |
| </TR> |
| <TR> |
| <TD> Lines ... </TD> |
| </TR> |
| <TR> |
| <TD> Line 95 </TD> |
| </TR> |
| <TR> |
| <TD> Line 96 </TD> |
| <TD rowspan="4"> </TD> |
| </TR> |
| <TR> |
| <TD> Line 97 </TD> |
| </TR> |
| <TR> |
| <TD> Line 98 </TD> |
| <TD rowspan="2" bgcolor="#00FF00"> </TD> |
| </TR> |
| <TR> |
| <TD> Line 99 </TD> |
| </TR> |
| </TABLE> |
| |
| |
| |
| <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> |
| |
| |
| This stores the last 10 lines, skipping the last 2 lines, of the supplied data |
| in the porperty ${src.file.head}. (Means: if supplied data contains 60 lines, |
| lines 49-58 are extracted) |
| <BLOCKQUOTE><PRE> |
| <loadfile srcfile="${src.file}" property="${src.file.head}"> |
| <filterchain> |
| <tailfilter lines="10" skip="2"/> |
| </filterchain> |
| </loadfile> |
| </PRE></BLOCKQUOTE> |
| |
| <H3><a name="deletecharacters">DeleteCharacters</a></H3> |
| |
| <p>This filter deletes specified characters.</p> |
| <p><em>since Ant 1.6</em></p> |
| <p>This filter is only available in the convenience form.</p> |
| |
| <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>chars</TD> |
| <TD vAlign=top> |
| The characters to delete. This attribute is |
| <a href="#backslash">backslash enabled</a>. |
| </TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| <P> |
| <H4>Examples:</H4> |
| |
| Delete tabs and returns from the data. |
| <BLOCKQUOTE><PRE> |
| <deletecharacters chars="\t\r"/> |
| </PRE></BLOCKQUOTE> |
| |
| <H3><a name="concatfilter">ConcatFilter</a></H3> |
| <p>This filter prepends or appends the content file to the filtered files.</p> |
| <p><em>since Ant 1.6</em></p> |
| <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>prepend</TD> |
| <TD vAlign=top> |
| The name of the file which content should be prepended to the file. |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>append</TD> |
| <TD vAlign=top> |
| The name of the file which content should be appended to the file. |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| <P> |
| |
| <H4>Examples:</H4> |
| |
| Do nothing: |
| <BLOCKQUOTE><PRE> |
| <filterchain> |
| <concatfilter/> |
| </filterchain> |
| </PRE></BLOCKQUOTE> |
| |
| Adds a license text before each java source: |
| <BLOCKQUOTE><PRE> |
| <filterchain> |
| <concatfilter prepend="apache-license-java.txt"/> |
| </filterchain> |
| </PRE></BLOCKQUOTE> |
| |
| |
| |
| <H3><a name="tokenfilter">TokenFilter</a></H3> |
| This filter tokenizes the inputstream into strings and passes these |
| strings to filters of strings. Unlike the other filterreaders, this does |
| not support params, only convenience methods are implemented. |
| The tokenizer and the string filters are defined by nested elements. |
| <P><em>since Ant 1.6</em></p> |
| <P> |
| Only one tokenizer element may be used, the LineTokenizer is the |
| default if none are specified. A tokenizer |
| splits the input into token strings and trailing delimiter strings. |
| <P> |
| There may be zero or more string filters. A string filter processes |
| a token and either returns a string or a null. |
| It the string is not null it is passed to the next filter. This |
| proceeds until all the filters are called. |
| If a string is returned after all the filters, the string is |
| outputs with its associated token delimitier |
| (if one is present). |
| The trailing delimiter may be overridden by the <i>delimOutput</i> |
| attribute. |
| <P> |
| <a name="backslash"><em>blackslash interpretation</em></a> |
| A number of attributes (including <i>delimOutput</i>) interpret |
| backslash escapes. The following are understood: \n, \r, \f, \t |
| and \\. |
| |
| |
| <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>delimOutput</TD> |
| <TD vAlign=top> |
| This overrides the tokendelimiter |
| returned by the tokenizer if it is not empty. This |
| attribute is backslash enabled. |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| <P> |
| |
| The following tokenizers are provided by the default distribution. |
| <p> |
| <a href="#linetokenizer">LineTokenizer</a><br> |
| <a href="#filetokenizer">FileTokenizer</a><br> |
| <a href="#stringtokenizer">StringTokenizer</a><br> |
| </p> |
| |
| The following string filters are provided by the default distribution. |
| <p> |
| <a href="#replacestring">ReplaceString</a><br> |
| <a href="#containsstring">ContainsString</a><br> |
| <a href="#replaceregex">ReplaceRegex</a><br> |
| <a href="#containsregex">ContainsRegex</a><br> |
| <a href="#trim">Trim</a><br> |
| <a href="#ignoreblank">IgnoreBlank</a><br> |
| <a href="#filterdeletecharacters">DeleteCharacters</a><br> |
| </p> |
| |
| The following string filters are provided by the optional distribution. |
| <p> |
| <a href="#scriptfilter">ScriptFilter</a><br> |
| </p> |
| |
| Some of the filters may be used directly within a filter chain. In this |
| case a tokenfilter is created implicitly. An extra attribute "byline" |
| is added to the filter to specify whether to use a linetokenizer |
| (byline="true") or a filetokenizer (byline="false"). The default |
| is "true". |
| <P> |
| |
| <p><b><em><a name="linetokenizer">LineTokenizer</a></em></b></p> |
| This tokenizer splits the input into lines. |
| The tokenizer delimits lines |
| by "\r", "\n" or "\r\n". |
| This is the default tokenizer. |
| <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>includeDelims</TD> |
| <TD vAlign=top> |
| Include the line endings in the token. |
| Default is false. |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| <H4>Examples:</H4> |
| |
| Convert input current line endings to unix style line endings. |
| <BLOCKQUOTE><PRE> |
| <tokenfilter delimoutput="\n"/> |
| </PRE></BLOCKQUOTE> |
| |
| |
| Remove blank lines. |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <ignoreblank/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="filetokenizer">FileTokenizer</a></em></b></p> |
| This tokenizer treats <b>all</b> the input as a token. So be |
| careful not to use this on very large input. |
| <H4>Examples:</H4> |
| |
| Replace the first occurance of package with //package. |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <filetokenizer/> |
| <replaceregex pattern="([\n\r]+[ \t]*|^[ \t]*)package" |
| flags="s" |
| replace="\1//package"/> |
| </tokenfilter> |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="stringtokenizer">StringTokenizer</a></em></b></p> |
| This tokenizer is based on java.util.StringTokenizer. |
| It splits up the input into strings separated by white space, or |
| by a specified list of delimiting characters. |
| If the stream starts with delimiter characters, the first |
| token will be the empty string (unless the <i>delimsaretokens</i> |
| attribute is used). |
| |
| <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>delims</TD> |
| <TD vAlign=top>The delimiter characters. White space |
| is used if this is not set. (White space is defined |
| in this case by java.lang.Character.isWhitespace()). |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <tr> |
| <td valign="top">delimsaretokens</td> |
| <td valign="top">If this is true, |
| each delimiter character is returned as a token. |
| Default is false. |
| </td> |
| <td valign="top" align="center">No</td> |
| </tr> |
| <tr> |
| <td valign="top">suppressdelims</td> |
| <td valign="top"> |
| If this is true, delimiters are not returned. |
| Default is false. |
| </td> |
| <td valign="top" align="center">No</td> |
| </tr> |
| <tr> |
| <td vAlign=top>includeDelims</td> |
| <td vAlign=top> |
| Include the delimiters in the token. |
| Default is false. |
| </td> |
| <td vAlign=top align="center">No</td> |
| </tr> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Surround each non space token with a "[]". |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <stringtokenizer/> |
| <replaceregex pattern="(.+)" replace="[\1]"/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="replacestring">ReplaceString</a></em></b></p> |
| This is a simple filter to replace strings. |
| This filter may be used directly within a filterchain. |
| |
| <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>from</TD> |
| <TD vAlign=top>The string that must be replaced.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| <tr> |
| <td valign="top">to</td> |
| <td valign="top">The new value for the replaced string. When omitted |
| an empty string is used. |
| </td> |
| <td valign="top" align="center">No</td> |
| </tr> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Replace "sun" with "moon". |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <replacestring from="sun" to="moon"/> |
| </tokenfilter> |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="containsstring">ContainsString</a></em></b></p> |
| This is a simple filter to filter tokens that contains |
| a specified string. |
| |
| <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>contains</TD> |
| <TD vAlign=top>The string that the token must contain.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Include only lines that contain "foo"; |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <containsstring contains="foo"/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="replaceregex">ReplaceRegex</a></em></b></p> |
| This string filter replaces regular expressions. See |
| <a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a> |
| for an explanation on regular expressions. |
| This filter may be used directly within a filterchain. |
| |
| <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>pattern</TD> |
| <TD vAlign=top>The regular expression pattern to match in |
| the token.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>replace</TD> |
| <TD vAlign=top>The substitution pattern to replace the matched |
| regular expression. When omitted an empty string is used.</TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>flags</TD> |
| <TD vAlign=top>See |
| <a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a> |
| for an explanation of regex flags.</TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Replace all occurances of "hello" with "world", ignoring case. |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <replaceregex pattern="hello" replace="world" flags="gi"/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="containsregex">ContainsRegex</a></em></b></p> |
| This filters strings that match regular expressions. |
| The filter may optionally replace the matched regular expression. |
| See |
| <a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a> |
| for an explanation on regular expressions. |
| This filter may be used directly within a filterchain. |
| |
| <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>pattern</TD> |
| <TD vAlign=top>The regular expression pattern to match in |
| the token.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>replace</TD> |
| <TD vAlign=top>The substitution pattern to replace the matched |
| regular expression. When omitted the orignal token is returned. |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>flags</TD> |
| <TD vAlign=top>See |
| <a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a> |
| for an explanation of regex flags.</TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Filter lines that contain "hello" or "world", ignoring case. |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <containsregex pattern="(hello|world)" flags="i"/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| This example replaces lines like "SUITE(TestSuite, bits);" with |
| "void register_bits();" and removes other lines. |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <containsregex |
| pattern="^ *SUITE\(.*,\s*(.*)\s*\).*" |
| replace="void register_\1();"/> |
| </tokenfilter> |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="trim">Trim</a></em></b></p> |
| This filter trims whitespace from the start and end of |
| tokens. |
| This filter may be used directly within a filterchain. |
| <p><b><em><a name="ignoreblank">IgnoreBlank</a></em></b></p> |
| This filter removes empty tokens. |
| This filter may be used directly within a filterchain. |
| <p><b><em><a name="filterdeletecharacters">DeleteCharacters</a></em></b></p> |
| This filter deletes specified characters from tokens. |
| |
| <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>chars</TD> |
| <TD vAlign=top>The characters to delete. This attribute |
| is backslash enabled.</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Delete tabs from lines, trim the lines and removes empty lines. |
| |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <deletecharacters chars="\t"/> |
| <trim/> |
| <ignoreblank/> |
| </tokenfilter> |
| |
| </PRE></BLOCKQUOTE> |
| |
| <p><b><em><a name="scriptfilter">ScriptFilter</a></em></b></p> |
| This is an optional filter that executes a script in a |
| <a href="http://jakarta.apache.org/bsf" target="_top">Apache BSF</a> |
| supported language.</p> |
| See the <a href="../OptionalTasks/script.html">Script</a> task for |
| an explanation of scripts and dependencies. |
| </p> |
| <p> |
| The script is provided with an object <i>self</i> that has |
| getToken() and setToken(String) methods. |
| The getToken() method returns the current token. The setToken(String) |
| method replaces the current token. |
| </p> |
| |
| This filter may be used directly within a filterchain.<p> |
| <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>language</TD> |
| <TD vAlign=top> The programming language the script is written in. |
| Must be a supported Apache BSF language</TD> |
| <TD vAlign=top align="center">Yes</TD> |
| </TR> |
| <TR> |
| <TD vAlign=top>src</TD> |
| <TD vAlign=top>The location of the script as a file, if not inline |
| </TD> |
| <TD vAlign=top align="center">No</TD> |
| </TR> |
| <TR> |
| </TABLE> |
| |
| <H4>Examples:</H4> |
| |
| Convert to uppercase: |
| <BLOCKQUOTE><PRE> |
| <tokenfilter> |
| <scriptfilter language="javascript"> |
| self.setToken(self.getToken().toUpperCase()); |
| </scriptfilter> |
| </tokenfilter> |
| </PRE></BLOCKQUOTE> |
| |
| Remove lines containing the string "bad" while |
| copying text files: |
| <blockquote> |
| <pre> |
| <copy todir="dist"> |
| <fileset dir="src" includes="**/*.txt"/> |
| <scriptfilter language="beanshell"> |
| if (self.getToken().indexOf("bad") != -1) { |
| self.setToken(null); |
| } |
| </scriptfilter> |
| </copy> |
| </pre> |
| </blockquote> |
| |
| <H4>Custom tokenizers and string filters</H4> |
| |
| Custom string filters and tokenizers may be plugged in by |
| extending the interfaces org.apache.tools.ant.filters.TokenFilter.Filter |
| and org.apache.tools.ant.util.Tokenizer respectly. |
| |
| They are defined the build file using <typedef/>. For |
| example a string filter that capitalizes words may be declared as: |
| <blockquote><pre> |
| package my.customant; |
| import org.apache.tools.ant.filters.TokenFilter; |
| |
| public class Capitalize |
| implements TokenFilter.Filter |
| { |
| public String filter(String token) { |
| if (token.length() == 0) |
| return token; |
| return token.substring(0, 1).toUpperCase() + |
| token.substring(1); |
| } |
| } |
| </pre></blockquote> |
| |
| This may be used as follows: |
| <blockquote><pre> |
| <typedef type="capitalize" classname="my.customant.Capitalize" |
| classpath="my.customant.path"/> |
| <copy file="input" tofile="output"> |
| <filterchain> |
| <tokenfilter> |
| <stringtokenizer/> |
| <capitalize/> |
| </tokenfilter> |
| </filterchain> |
| </copy> |
| </pre></blockquote> |
| |
| <HR> |
| |
| <P align=center>Copyright © 2002-2003 Apache Software Foundation. All rights |
| Reserved.</P></BODY></HTML> |