Antの代表的なフィルタリーダー

# 記事の概要

Antのファイルリーダのうち、
ビルド作業において使用頻度の高いテキスト置換を行うものをピックアップし、
サンプルコードとともに紹介します。

## ExpandProperties
実装クラス：org.apache.tools.ant.filters.ExpandProperties

テキストファイル内で使用されているAntのプロパティ`${....}`を、
該当するプロパティの値(実行時に内部で置き換えられている値)に置換します。
設定できる属性はないので、タグのみ記載します。

```xml
<filterchain>
  <expandproperties/>
</filterchain>
```

```text
# ビルドファイルでのプロパティの定義
<property name="path.lib" location="WebContent/WEB-INF/lib" />
# 置換前
libDir = "/project/${path.lib}/libdir"
# 置換後
libDir = "/project/WebContent/WEB-INF/lib/libdir"
```

## HeadFilter
実装クラス：org.apache.tools.ant.filters.HeadFilter

テキストファイルの先頭から指定した行数のテキストを切り出します。
クラスファイルからパッケージ名だけを取り出したりできます。

| 属性 | 説明 | 初期値 | 
|:--|:--|--:|
| lines | 取り出す行数を指定します。 | 10 |
| skip | 先頭から指定した行数までをスキップします。 | 0 |

```xml
<filterchain>
  <headfilter lines="1"/>
</filterchain>
```

```text
# 置換前
package com.example.app;

import ...
# 置換後
package com.example.app;
```

## TailFilter
実装クラス：org.apache.tools.ant.filters.TailFilter

テキストファイルの最後から指定した行数のテキストを切り出します。
クラスファイルのリターン句のみ取り出したりできます。

| 属性 | 説明 | 初期値 | 
|:--|:--|--:|
| lines | 取り出す行数を指定します。 | 10 |
| skip | 末尾から指定した行数までをスキップします。 | 0 |

```xml
<filterchain>
  <headfilter lines="1" skip="2"/>
</filterchain>
```

```text
# 置換前
    ...
    return output;
  }
}[EOF]
# 置換後
    return output;
```

## LineContains
実装クラス：org.apache.tools.ant.filters.LineContains

指定した文字列が含まれている行を抽出します。
文字列はContains子要素のvalue属性で指定します。Contains子要素を複数指定すると、
指定したすべての文字列が含まれる行のみが抽出されます。

| 属性・要素 | 説明 | 補足 | 
|:--|:--|:--|
| contains | value属性に文字列を指定します。 |  |
| negate | trueに設定すると、指定文字列が含まれない行を抽出します。 | Ant1.7〜 |

```xml
<linecontains>
  <contains value="foo"/>
  <contains value="bar"/>
</linecontains>
<!-- negate指定時 -->
<linecontains negate="true">
  <contains value="foo"/>
  <contains value="bar"/>
</linecontains>
```

```text
# 置換前
foo text
sample text
bar text
# 置換後
foo text
bar text
```

## LineContainsRegExp
実装クラス：org.apache.tools.ant.filters.LineContainsRegExp

LineContainsの文字列マッチ条件として正規表現を利用できます。
条件はRegexp子要素のpattern属性で指定します。

| 属性・要素 | 説明 | 補足 | 必須 |
|:--|:--|:--|:--:|
| regexp | pattern属性に正規表現を指定します。 |  | ● |
| negate | trueに設定すると、指定文字列が含まれない行を抽出します。 | Ant1.7〜 |  |
| casesensitive | 大文字、小文字を区別するかを指定します。(default：true) | Ant1.8.2〜 |  |

```xml
<linecontainsregexp>
  <!-- 行頭がfooで始まる行のみ指定 -->
  <regexp pattern="^foo"/>
</linecontainsregexp>
```

```text
# 置換前
foo text
sample text
text foo
# 置換後
foo text
```

## PrefixLines
実装クラス：org.apache.tools.ant.filters.PrefixLines

テキストファイルの各行の先頭に文字列を挿入します。
ファイル全体のコメントアウトなどに使用できます。

| 属性 | 説明 |
|:--|:--|
| prefix | 行頭に挿入する文字列を指定します。 |

```xml
<linecontainsregexp>
  <prefixlines prefix="// "/>
</linecontainsregexp>
```

```text
# 置換前
foo text
bar text
# 置換後
// foo text
// bar text
```

## ReplaceTokens
実装クラス：org.apache.tools.ant.filters.ReplaceTokens

フィルタセットと同じようにトークンの置換を行います。
Token子要素によりトークンを指定します。Token子要素では、key属性にトークン文字列、
value属性に置換後の文字列を指定します。

| 属性 | 説明 | 初期値 | 
|:--|:--|:--:|
| begintoken | トークンの開始区切り文字を指定します。 | @ |
| endtoken | トークンの終了区切り文字を指定します。 | @ |
区切り文字に設定できるのは１文字だけです。
２文字以上指定しても、最初の１文字が区切り文字になります。


```xml
<filterchain>
  <replacetokens begintoken="{" endtoken="}">
    <token key="config-pre-name" value="config-"/>
  </replacetokens>
</filterchain>
```

```text
# 置換前
{config-pre-name}setting.xml
# 置換後
config-setting.xml
```

## StripJavaComments
実装クラス：org.apache.tools.ant.filters.StripJavaComments

Javaソースファイルで用いられるコメントをすべて取り除きます。（`/*　*/`および`//`）
リリースモジュールからコメントを除外し、ファイルサイズを下げるなどが可能です。

```xml
<filterchain>
  <stripjavacomments/>
</filterchain>
```

```java
# 置換前
/*
 test
 */
public class Test {
    public void method() {
        // test
    }
# 置換後
public class Test {
    public void method() {

    }
```

## StripLineComments
実装クラス：org.apache.tools.ant.filters.StripLineComments

先頭が特定の文字列で始まっている行をコメント行とみなし、そのコメント行を取り除きます。
コメントとみなす文字列はComment子要素のvalue属性により指定します。
最初の文字が設定値でも、先頭にタブやスペースが入っているとコメント行とみなされません。
バッチファイルなど、Java以外のファイルのコメントを除外するのに使えます。

```xml
<striplinecomments>
  <comment value="REM "/>
  <comment value="rem "/>
</striplinecomments>
```

```text
# 置換前
REM do anything
sample
rem end anything
# 置換後
sample
```

## StripLineBreaks
実装クラス：org.apache.tools.ant.filters.StripLineBreaks

テキストファイルから指定した改行文字を取り除きます。(デフォルトは \r と \n )
改行文字はlinebreaks属性で指定できます。linebreaksに複数文字の文字列を指定した場合、
複数文字全体が改行文字と見なされるのではなく、その文字列に含まれる各々の１文字が
改行文字とみなされます。つまり、"あいう"を設定しても、"あいう"が改行文字と見なされる
のではなく、"あ"、"い"、"う"それぞれが改行文字となります。
リリースモジュールから改行を除外し、ファイルサイズを下げたい場合などに使用できます。

```xml
<filterreader classname="org.apache.tools.ant.filters.StripLineBreaks">
  <param name="linebreaks" value="()"/>
</filterreader>
```

```text
# 置換前
sample(and)test()
# 置換後
sampleandtest
```

## TabToSpaces
実装クラス：org.apache.tools.ant.filters.TabToSpaces

テキストファイル中のタブをスペースに置き換えます。
一つのタブをいくつのスペースに置き換えるかは、tablength属性により指定します。

| 属性 | 説明 | 初期値 |
|:--|:--|:--:|
| tablength | 置き換えるスペースの数を指定します。 | 8 |

```xml
<tabstospaces tablength="8"/>
```

```text
# 置換前
[¥t]sample
# 置換後
・・・・・・・・sample
```
※タブ文字、半角スペースを可視化するのに「[¥t]」、「・」と表記しています。

# 終わりに

以上、使用頻度の高いファイルリーダーについて紹介してきました。
公式ドキュメントには、より詳しい情報が載っていますのでそちらも参照してみてください。

参照ページ：[公式ドキュメント](https://ant.apache.org/manual/Types/filterchain.html#stripjavacomments)