umjammer です、 アノテーションばっかりですみません... Java には UPnP のライブラリとして CyberLink for Java というものがあります。この作者はいろいろな賞を取っていて凄腕そうです。 なぜ UPnP かというと DLNA を始めとする家電オートメーションに興味があるので、楽に UPnP クライアントや、サーバーを構築できないかなと思っていたからです。 UPnP のクライアントのプログラムはくだけた言い方をすると RPC です。結局やりたいことは値のセット、ゲットをネットワーク越しで行うことだけです。通信処理等は同じことの繰り返しなので自動生成などで十分です。JAX-RPC などの Web Services もアノテーション全盛なので UPnP にアノテーションを適用するのも自然な成り行きでしょう。 先の CyberLink for Java は、まっとうなプログラムですのでライブラリをそのまま使用してクライアントを書くと多少冗長になります。 冗長さをなくすために UPnP のアノテーションライブラリを書いてみました。 そのアノテーションライブラリを使用して先ほどの Light のサンプルを書き直してみます。

package light2;

import vavi.net.upnp.annotation.UPnPAction;
import vavi.net.upnp.annotation.UPnPDevice;
import vavi.net.upnp.annotation.UPnPStateVariable;


/**
 * Light.
 */
@UPnPDevice(description = "/light2/description/description.xml")
public class Light {

    /** */
    @UPnPStateVariable(name = "Power")
    private int power = 0;

    @UPnPAction(name = "GetPower", arg = "Power")
    public int getPower() {
        return power;
    }

    @UPnPAction(name = "SetPower", arg = "Power", result = "Result")
    public void setPower(int power) {
        this.power = power;
        view.setPowerEnabled(power != 0);
    }

    public interface View {
        void setPowerEnabled(boolean enabled);
    }

    private View view;

    public void setView(View view) {
        this.view = view;
    }
}
無事、POJO + アノテーションに落ち着きました。ついでに簡易MVCも施しています。 本当は @UPnPDevice の引数である XML ファイルもアノテーションを元に自動生成するべきですが、それは次期バージョンとさせてください。 コードはこちら、 http://code.google.com/p/cyberlink4java2/