天天看点

Ant类型之FilterChain

一、概述

        FilterChain是一组FilterReader,用户可以通过继承java.io.FilterReader类来定义自己的FilterReader。通过使用filterreader元素可以轻松的将自定义的FilterReader做为嵌套元素插入到filterchain中。通过FilterChain,ant可以灵活的进行数据的转换。支持FilterChain的task有:concat、copy、loadfile、loadproperties、move。过滤器链是通过嵌套0到多个过滤器形成的。Ant提供了一些内置的过滤器。

二、内置过滤器

        FilterReader:一个定义过滤器的通用方法。可以用它在构建文件中定义用户自定义的过滤器元素。内置的过滤器也可以通过这种方式进行定义。filterreader元素必须提供一个classname属性,用这个名称解析的类必须继承java.io.FilterReader。如果自定义的过滤器需要参数化,必须实现org.apache.tools.type.Parameterizable。

                classname:filterreader的类名。

        filterreader支持嵌套classpath和param元素,每个param可以接受name、type和value属性。其他的过滤器也默认支持。

        ClassConstants:过滤java类中定义的基本常量,并以name=value的格式按行输出。此过滤器需要bcel包来解析java类文件。此过滤器与大多数操作字符序列的过滤器不同,此过滤器在组成类的字节序列上进行操作,但是字节到达过滤器后是字符序列,所以在使用字符编码时要格外注意,大多数编码信息会从任意字节序列转为字符,在转回字节的过程中丢失。特别是常用的默认字符编码(CP152和UTF8)。因此,从ant1.7起,从字符转换到字节采用ISO-8859-1编码,也必须使用这个编码读取java类文件。

        EscapeUnicode:ant1.6起,将输入的所有非US-ASCII字符更改为等效的\u加上4位数字的unicode转义。

        ExpandProperties:如果数据包含${}格式的ant属性,过滤器会将其替换为实际的值。ant1.8.3起,可以嵌套propertyset元素。

        HeadFilter:读取提供给过滤器的数据的前几行。具有以下属性:

                lines:读取的行数,默认为10。

                skip:跳过的行数,默认为0。

        LineContains:只包含用户指定字符串的行。具有以下属性:

                contains:要包含的字符串。只能作为嵌套元素使用,支持多个contains元素。

                negate:ant1.7起,是否只选择不包含指定字符串的行。

        LineContainsRegExp:只包含与用户指定的正则表达式匹配的字符串的行。具有以下属性:

                regexp:正则表达式。只能作为嵌套元素使用,支持多个contains元素。有关嵌套元素regexp的说明,请参考regexp类型。

                negate:ant1.7起,是否只选择不包含与指定正则表达式匹配的字符串的行。

                caseseneitive:ant1.8.2起,是否区分大小写,默认为true。

        PrefixLines:每一行附加一个前缀。具有以下属性:

                prefix:附加到行的前缀。

        SuffixLines:ant1.8起,每一行附加一个后缀。具有以下属性:

                suffix:附加到行的后缀。

        ReplaceTokens:将开始标记和结束标记之间的所有字符串替换为用户定义的值。具有以下属性:

                begintoken:开始标记,默认为@。

                endtoken:结束标记,默认为@。

                token:用户定义的字符标记。只能做为嵌套元素使用。

                propertiesfile:获取标记字符的属性文件。只能在通过filterreader方式使用ReplaceTokens时使用。

                value:字符标记替换的值,token的属性。

        StripJavaComments:使用java语法准则从数据中去除注释。不支持任何属性。

        StripLineBreaks:从数据中去除特定的字符。具有以下属性:

                linebreaks:要去掉的字符,默认为“\r\n”。

        StripLineComments:删除以用户指定的注释起始字符串开头的行。

                comment:当出现在行的开头时,将此行识别为注释的字符串。

        TabsToSpaces:用空格替换制表符。具有以下属性:

                tablength:替换的空格数量,默认为8。

        TailFilter:读取提供给过滤器的数据的最后几行。具有以下属性:

                lines:读取的行数,默认为10。如果为-1,表示读取所有的行。

                skip:从后面跳过的行数,默认为0。

        DeleteCharacters:ant1.6起,删除指定的字符。具有以下属性:

                chars:要删除的字符,支持转义。

        ConcatFilter:ant1.6起,预写或附加内容文件到过滤后的文件。具有以下属性:

                prepend:内容将预写到文件的文件名。

                append:内容将附加到文件的文件名。

        TokenFilter:ant1.6起,将输入切分为一组字符串,并将这组字符串传递给字符串过滤器,与其他过滤器不同,TokenFilter不支持param元素。分词器和字符串过滤器通过嵌套元素定义。只能定义一个分词器,如果没有指定默认为LineTokenizer,可以有0到多个字符串过滤器。字符串过滤器处理分词字符串后返回字符串或者null。如果返回字符串,会将字符串传递到下一个过滤器,直到所有的过滤器都被调用。如果所有过滤器都调用后返回的是字符串,会将字符串与相关的分词分隔符输出。分隔符可以通过delimOutput属性覆盖。具有以下属性:

                delimOutput:如果不为空,覆盖分词器返回的分隔符。

        默认分词器有:

                LineTokenizer:将输入切分成行,分词器通过“\r”、“\n”或者“\r\n”分隔行。是默认的分词器。具有以下属性:

                        includeDelims:是否包含行结尾,默认为false。

                FileTokenizer:将所有的输入做为一个分词字符串。所以不要在很大的输入上用这个分词器。

                StringTokenizer:基于java.util.StringTokenizer。将输入按照空格或者指定的分隔符切分成一组字符串。如果输入以分隔符开头,第一个字符会是空字符串。具有以下属性:

                        delims:分隔符,默认为空格,

                        delimsaretokens:如果设置为true,每个分隔符也会返回,默认为false。

                        suppressdelims:如果设置为true,不返回分隔符,默认为false。

                        includeDelims:如果设置为true,分词字符串包含分隔符,默认为false。

        默认字符串过滤器有:

                ReplaceString:一个简单的字符串替换过滤器,可以被FilterChain直接使用。具有以下属性:

                        form:要被替换的字符串。

                        to:被替换字符串的新值,如果不设置,默认为空字符串。

                ContainsString:过滤包含自定字符串的分词字符串。具有以下属性:

                        contains:要包含的字符串。

                ReplaceRegex:替换匹配正则表达式字符串的过滤器,可以被FilterChain直接使用。具有以下属性:

                        pattern:要匹配的正则表达式。

                        replace:替换匹配正则表达式字符串的字符串。默认为空字符串。

                        flags:匹配正则表达式所使用的模式,可选值有g(全局替换,替换所有匹配项)、i(不区分大小写)、m(多行匹配模式,使用^和$做为任一行的开始和结束)、s(单行模式,“.”可以与任意字符匹配,包括换行符,所有的输入看作是一行)。

                ContainsRegex:过滤匹配正则表达式的字符串。还可以选择替换与正则表达式匹配的字符串。可以被FilterChain直接使用。具有以下属性:

                        pattern:要匹配的正则表达式。

                        replace:替换匹配正则表达式字符串的字符串。默认为原始字符串。

                        flags:匹配正则表达式所使用的模式,可选值有g(全局替换,替换所有匹配项)、i(不区分大小写)、m(多行匹配模式,使用^和$做为任一行的开始和结束)、s(单行模式,“.”可以与任意字符匹配,包括换行符,所有的输入看作是一行)。

                Trim:去掉字符串开始和结束的空格,可以被FilterChain直接使用。

                IgnoreBlank:移除空的分词字符串,可以被FilterChain直接使用。

                DeleteCharacters:从分词字符串中删除自定字符,具有以下属性:

                        chars:要删除的字符,支持转义。

                UniqFilter:去掉重复的分词字符串,可以被FilterChain直接使用。

                ScriptFilter:执行支持BSF或者JSR223语言的脚本。script提供了包含getToken()和setToken(String) 方法的self对象。可以被FilterChain直接使用。具有以下属性:

                        language:编写脚本的程序语言,必须是支持BSF或者JSR223的语言。

                        manager:使用的脚本引擎管理器。可选值有:bsf(BSF脚本管理器)、javax(jdk1.6+支持的JSR223脚本管理器)、auto(如果bsf存在使用bsf,否则使用javax),默认为auto。

                        src:如果脚本不是嵌套在标签中,设置脚本文件的位置。

                        setbeans:ant1.8起,是否在脚本中设置所有属性、引用和targets。如果设置为false,只有project和self可用。默认为true。

                        classpath:传递到脚本的类路径。

                        classpathref:使用的类路径引用。

        FixCRLF:见ant内置任务fixcrlf。

        SortFilter:ant1.8起,读取所有行并进行排序,顺序可以反转,可以自定义java.util.Comparator接口的实现来进行更多的控制。

                reverse:是否反转顺序,默认为false。如果设置了comparator属性,则忽略此属性。

                comparator:实现了java.util.Comparator的类的名字。此类用于确定行的排列顺序。

三、简单示例

<project>
	<loadproperties srcfile="E:\workspace\trans\bin\com\run\ayena\trans\core\Trans.class" encoding="ISO-8859-1">
		<filterchain>
			<classconstants/>
		</filterchain>
	</loadproperties>
	
	<echo message="${REMOTE}"/>
	
	<property name="name" value="FilterChain"/>
	<property name="reader" value="FilterReader"/>
	
	<copy file="demo.txt" tofile="escapeunicode.txt">
		<filterchain>
			<escapeunicode/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="expandproperties.txt">
		<filterchain>
			<expandproperties/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="headfilter.txt">
		<filterchain>
			<headfilter lines="3" skip="2"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="linecontains.txt">
		<filterchain>
			<linecontains >
				<contains value="嵌套" />
			</linecontains>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="linecontainsregexp.txt">
		<filterchain>
			<linecontainsregexp casesensitive="false">
				<regexp pattern="FilterChain*"/>
			</linecontainsregexp>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="prefixlines.txt">
		<filterchain>
			<prefixlines prefix="prefix"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="suffixlines.txt">
		<filterchain>
			<suffixlines suffix="suffix"/>
		</filterchain>
	</copy>
	
	<copy file="tokendemo.txt" tofile="replacetokens.txt">
		<filterchain>
			<replacetokens begintoken="@" endtoken="@">
			<token key="name" value="${name}"/>
			<token key="reader" value="${reader}"/>
			</replacetokens>
		</filterchain>
	</copy>
	
	<copy file="tokendemo.txt" tofile="replacetokens1.txt">
		<filterchain>
			<filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
				<param type="propertiesfile"  value="token.properties"/>
				<param type="begintoken" value="@"/>
				<param type="endtoken" value="@"/>
			</filterreader>
		</filterchain>
	</copy>
	
	
	<copy file="demo.txt" tofile="stripjavacomments.txt">
		<filterchain>
			<stripjavacomments />
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="striplinebreaks.txt">
		<filterchain>
			<striplinebreaks linebreaks="/*"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="striplinecomments.txt">
		<filterchain>
			<striplinecomments>
				<comment value="--"/>
				<comment value="#"/>
				<comment value="//"/>
			</striplinecomments>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="tabstospaces.txt">
		<filterchain>
			<tabstospaces tablength="16"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="tailfilter.txt">
		<filterchain>
			<tailfilter lines="-1" skip="3"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="deletecharacters.txt">
		<filterchain>
			<deletecharacters chars="n\r\n\t " />
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="concatfilter.txt">
		<filterchain>
			<concatfilter append="token.properties" prepend="token.properties"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="tokenfilter.txt">
		<filterchain>
			<tokenfilter delimOutput="\t">
				<stringtokenizer delims="/"/>
				<replacestring from="concat" to="Concat"/>
				<replaceregex pattern="Concat" replace="concat" flags="gi"/>
				<containsstring contains="concat"/>
				<containsregex pattern="concat*"/>
				<trim/>
				<ignoreblank/>
				<scriptfilter language="javascript">
					self.setToken(self.getToken().toUpperCase());
				</scriptfilter>
			</tokenfilter>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="fixcrlf.txt">
		<filterchain>
			<fixcrlf tab="add" eof="add" fixlast="false"/>
		</filterchain>
	</copy>
	
	<copy file="demo.txt" tofile="sortfilter.txt">
		<filterchain>
			<sortfilter reverse="true"/>
		</filterchain>
	</copy>
</project>