backport175 体験記

連載ではありません.(^^;
あまり評判よろしくなさげな backport175 をちょっとだけ触ってみました.
backport175 は J2SE 5.0 で導入された Annotation を J2SE 1.3/1.4 でも使えるようにしましょうという代物らしいです.
んで,Eclipse プラグインがあることになってるわけですよ.うれしいじゃありませんか.しかし...
http://backport175.codehaus.org/downloads/eclipse
このアップデートサイトを更新マネージャに登録しても,なんか空っぽなんですよね...
ちょっと前に触ってみようとした時はここで挫折してしまったのですが,今回はもうちょっと頑張りましたよ.
なんで更新マネージャで何も出てこないかというと,site.xml が...

<?xml version="1.0" encoding="UTF-8"?>
<site>
   <description url="http://backport175.codehaus.org/downloads/eclipse">
      Backport175 Eclipse Plugin Update site
   </description>
</site>

そりゃあんた,説明だけじゃしょうがありませんがな.(^^;
でもでも,アップデートサイトを見ると,ブツ (Jar) はあるんですよね.
そんなわけで (どんなわけで?),適当なディレクトリに featuresplugins というディレクトリを作って,上記サイトから features/org.codehaus.backport175.ide.eclipse.feature_1.0.1.jarplugins/org.codehaus.backport175.ide.eclipse.core_1.0.1.jar をダウンロードします.そして以下の site.xml を作成!!

<?xml version="1.0" encoding="UTF-8"?>
<site>
    <description url="http://backport175.codehaus.org/downloads/eclipse">
      Backport175 Eclipse Plugin Update site
    </description>
    <feature 
        url="features/org.codehaus.backport175.ide.eclipse.feature_1.0.1.jar"
        id="org.codehaus.backport175.ide.eclipse.feature" version="1.0.1"
    >
       <category name="backport175"/>
    </feature>
    <category-def name="backport175" label="backport175"/>
</site>

こいつを Eclipse のローカルアップデートサイトに登録してインストール!!!!
これでめでたく backport175 プラグインが組み込まれました♪


そんなわけで (どんなわけで?),さっそくお試し.
まずは Annotation を用意.

package ex;

public interface Alias {
    /**
     * @org.codehaus.backport175.DefaultValue("")
     */
    String name();
}

なんか,デフォルト値を与える場合はこう書くらしいです.
んで,注釈を付けるクラスを用意.

package ex;

/**
 * @ex.Alias(name="エビちゃん")
 */
public class EbiYuri {
    /**
     * @ex.Alias(name="トリプルバリア〜")
     */
    public String sunscreen() {
        return "ANESSA";
    }
}

JavaDoc らしい.この辺は J2SE5 の Annotation とは全然別物なんですね.
そしてテスト.

package ex;

import org.codehaus.backport175.reader.Annotation;
import org.codehaus.backport175.reader.Annotations;

import junit.framework.TestCase;

public class EbiYuriTest extends TestCase {
    public void test() throws Exception {
        Annotation classAnnotation = Annotations.getAnnotation(Alias.class, EbiYuri.class);
        assertEquals("エビちゃん", ((Alias) classAnnotation).name());

        Annotation methodAnnotation = Annotations.getAnnotation(Alias.class, EbiYuri.class
                .getMethod("sunscreen", null));
        assertEquals("トリプルバリア〜", ((Alias) methodAnnotation).name());
    }
}

こいつを実行!!
...
ぐはぁっ,ぬるぽ... (;_;)
ちっ,プロジェクトを右クリックして「Enable Backport175 Annotations」を選択しておかないといけなかったらしい.ちゃんとドキュメントに書いてありますがな.
気を取り直して実行!!!!
...
ぐはぁっ,またしてもぬるぽ... (;_;)
Error Log View を見てみたら,

cannot find source for compiled resource C:/develop/workspaces/s2-dev/backport175/classes/ex/Alias.class

とかって出てるし.
コンパイル済みの Alias.class から対応するソースファイルを見つけられない?
うーみゅ...
なんかですね,backport175 Eclipse plugin のページにある画面のスクリーンショットを見るとちゃんと動いている気配があるわけですよ.で,何か違うのかな〜って思ったらですね,このスクリーンショットはデフォルトパッケージなんですよね.


そんなわけで (どんなわけで?),EbiYuriEbiYuriTest をデフォルトパッケージへ移動!!
おやぁ??
メソッドに付けた Annotation の左の方にエラーを示すマーカーが... バリデーションが動くようになったらしい.でもでも,「Problems View」には何も出てないけど? おっと,フィルタがデフォルトでチェックされてないのね.「Annotation Probrems」をチェックすると...

ex.Alias : cannot parse annotation [@ex.Alias(name="トリプルバリア〜")] due to: Lexical error at line 1, column 24. Encountered: "\uff5e" (65374), after : "\"\u30c8\u30ea\u30d7\u30eb\u30d0\u30ea\u30a2"

むぅ... いやな予感.「トリプルバリア〜」を「トリプルバリアー」に書き換えてみると...
エラーが消えた.(ToT)
そうですか,やっぱそんなもんですか.困ったなぁ,「トリプルバリアー」じゃ雰囲気が合わないじゃないか.
いいや.とりあえず修正して保存,っと.あれ? 今度は「エビちゃん」にエラーが... 「ち」がダメらしい.(ToT)
使えるのか? backport175...
ともあれ (JW),「エビちゃん」は「EBI-CHAN」に,「トリプルバリア〜」は「トリプルバリアー」にすることでエラーが消えました.
そして実行!!!!!!
...
ぐはぁっ,テストを修正してなかった.(;_;)
テストも直して今度こそ実行!!!!!!!!
...
\(^o^)/


っていうか,全然嬉しくないぞ.とりあえず日本語使うなら UNICODE エスケープしろってこと? やってらんねーーーー.
つーかですね,デフォルトパッケージでないとダメってどういうことよ?? 話になりませんがな.
とりあえず,backport175 Eclipse plugin は実用レベルには至ってない感じ.の割には 2 月以来放置プレイっぽいってどういうことよ??


しょうがないので Eclipse plugin は諦めます.Uninstall!!
そして Ant タスクの方にチャレンジです.
backport175 のサイトから backport175-1.0.RC1.jar をダウンロードしてきてクラスパスに設定します.
んで,Eclipse プロジェクトのルートフォルダに build.xml を作成.

<?xml version="1.0"?>
<project name="backport175" default="build">

    <path id="project.class.path">
        <pathelement path="lib/backport175-1.0.RC1.jar" />
    </path>

    <target name="build">
        <taskdef
            name="annotationc"
            classname="org.codehaus.backport175.compiler.task.AnnotationCTask"
            classpathref="project.class.path"
        />

        <annotationc verbose="true" destdir="${basedir}/classes">
            <src path="${basedir}/src" />
            <classpath path="${basedir}/classes"/>
            <fileset dir="src">
                <include name="**/*.java" />
            </fileset>
        </annotationc>
    </target>
</project>

そして Eclipse プロジェクトのプロパティで「Builders」を選んで「New」ボタン,「Ant Build」を選んで「Buildfile」に上で作った build.xml を設定します.自動ビルドがお気に入りなら「Build Options」タブにある「During Auto Builds」をチェック.
EbiYuriEbiYuriTestex パッケージに戻してテストを実行!!!!!!!!!!
...
\(^o^)/


日本語の扱いに関するダメっぷりは変わりませんが,パッケージの問題はクリア.
でもでも,Eclipse plugin がないと Annotation の検証ができないんですよね.
一応,Ant のビルド時にメッセージを出してくれるのですが,それで確認するのも辛いなぁ.
あ,あれれ??

[annotationc] INFO: JavaDoc tag [org.codehaus.backport175.DefaultValue] is not treated as an annotation - class could not be resolved at ex.Alias in ex/Alias.class, line 8

をいをい,デフォルト値の設定はこれじゃないのか??
うーみゅ,試してみるとデフォルト値の空文字列が設定されなくて,null になっちゃいます.しくしくしく.


ともあれ (JW),コンソールの出力なんか見てられないので,Bytecode outline plugin で確認するってのを試してみるテスト.Bytecode outline plugin は ASM の仲間 (?) で,以下からダウンロードできます.
http://forge.objectweb.org/project/showfiles.php?group_id=23&release_id=887
こいつが何をやってくれるかというと,クラスファイルのバイトコードをビューに表示してくれるのです.J2SE5 も backport175 も,Annotation はクラスファイルの中に Attribute として保存されるので,Bytecode outline view を表示すると

public sunscreen (): String
METHOD ATTRIBUTE RuntimeVisibleAnnotations :
@Lex/Alias; ( トリプルバリアー )
CLASS ATTRIBUTE RuntimeVisibleAnnotations :
@Lex/Alias; ( EBI-CHAN )

ってな感じで Annotation が意図したとおり設定されていることを確認することができます.まぁ,でかいクラスになると Bytecode outline view の中からこの部分を見つけるのに一苦労かもしれませんが.Properties View に表示してくれる plugin が欲しいなぁ.そんなに難しくなさそうですが...


うーみゅ,そうはいっても,この backport175 が使い物になるのかを考えるとちょっと微妙.
Jakarta Commons Attribute とかでもいいんじゃないの?
Eclipse plugin と違って backport175 本体は一応開発が続いているようなので,まだ見限ることはないかもしれませんが...
とりあえず,あまり印象のいいプロダクトではない感じ.だってさぁ,「エビちゃん」も「トリプルバリア〜」も扱えないんじゃこの日記的には困っちゃうわけですよ.サンプルが書けないもの.まぁ,しばらく忘れても平気かな.よし,忘れましょう!
そんなわけで (どんなわけで?),backport175 体験記でした♪