Maven SQL Plugin

ビルドプロセス中に SQL を流そうと思い、以前に antrun で sql タスクでやったことがあるので、同じようにやってみたものの、ある程度の量流すとビルドプロセスが落ちる感じ(前はこんなことなかった気がするのだが…)。エラー出力もない感じで、これ以上調べるにはソースを見ていくしかない気が。これに時間をかけるのもなんなので、調べると Maven SQL Plugin があった。これを始めから使えばよかったのね。というわけで、以下のように記述。

<build>
:
<plugins>
:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.2</version>
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.1.119</version>
</dependency>
</dependencies>
<configuration>
<driver>org.h2.Driver</driver>
<url>jdbc:h2:file:${basedir}/target/test-classes/db/fess</url>
<username>sa</username>
<password></password>
</configuration>
<executions>
<execution>
<phase>test-compile</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<srcFiles>
<srcFile>${basedir}/src/main/config/fess.ddl</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
:

srcFilesの代わりに、SQLをそのまま流せる sqlCommandもある。executionも複数書いて、いろんな phase とかで処理可能。

Solr 1.3 のマルチコアでdataDirを指定する

マルチコアの設定を試していたのだけど、ここによると、dataDir も設定できるようにも見えるが、それとなく Solr 1.4 と書いてあり、solr.xmlでは Solr 1.3 では指定することができない。というわけで、ここによると、各コアの solrconfig.xml で指定しておけば良いことがわかる(がしかし、そのやりとり内の例が間違っている…)。というわけで、Solr 1.3 でマルチコアにして、dataDir を各コアで指定したいときには、solr.xml で

<?xml version="1.0" encoding="UTF-8"?>
<solr persistent="true" sharedLib="lib">
<cores adminPath="/admin/cores">
<core name="core0" instanceDir="core0" />
<core name="core1" instanceDir="core1" />
<core name="core2" instanceDir="core2" />
<core name="core3" instanceDir="core3" />
</cores>
</solr>

という感じにして、各コアの solrconfig.xml で

:
<dataDir>./solr/${solr.core.name}/data</dataDir>
:

とdataDirを指定しておけば、各コアに conf とかをまるっとコピーすることができる。

S2RobotにTikaを入れる

S2RobotのExtractorとMimeTypeHelperを自前で実装していたけど、この中身の実装を Apache Tika に変更することにした。Tika は Lucene のサブプロジェクトで MimeType の取得やファイルから文字列情報を取り出したりする機能を持つ(S2Robotでも実装していたやつね)。Tika を使った方が良いと思った理由はMimeタイプの評価がかなり強力な点。activation だとファイル名くらいしかみないけど、Tika はファイルの中身を評価して返してくる。というわけで、採用することにした。

で、Tika だけど、ドキュメント=ソースみたいな状況(英語の情報すらないような気もする)。使い方とか見当たらん。というわけで、ソースを見ていったのだけど、TikaCLI を見るとなんとなく分かる。AutoDetectParser を new して、Hander と Metadata があればファイルから文字列情報を抜き出してくれる。S2Robotに書いたコードを抜き出すと、

Metadata metadata = new Metadata();
// 別に以下を入れないでも良い。
metadata.set(Metadata.RESOURCE_NAME_KEY, resourceName);
metadata.set(Metadata.CONTENT_TYPE, contentType);
Parser parser = new AutoDetectParser();
StringWriter writer = new StringWriter();
try {
parser.parse(in, new BodyContentHandler(writer), metadata);
} catch (Exception e) {
throw new ExtractException("Could not extract a content.", e);
}
// この段階で writer にファイル内のコンテンツが保存されている
// メタデータが欲しければ
String[] names = metadata.names();
for (String name : names) {
System.out.println(name+": "+metadata.get(name));
}

という感じ。Mimeタイプの判定に利用されるファイルはtika-coreのjarに含まれる org/apache/tika/mime/tika-mimetypes.xml になる。コンテンツ取得で利用される(つまりパーサの定義)はorg/apache/tika/tika-config.xmlになる。渡すMetadataは結果のメータデータも格納される(渡すときに入っていれば補助的な感じで利用されると思う)。handler はStSAXみたいだけど、別にXMLファイルじゃなくても、このhandler で呼ばれて処理されるようだ。