Remoting

id:koichik さんへ
S2OpenAMFもRemoting一族の仲間ではないでしょうか?
よくわかってないので、はずしているかもしれませんが。
・・・で、さすがに、わからずに書くのもどうかと思ったので、ダウンロードしてチラッと見てみました。
ちがう、ようにも思える。どうなんだろう?

俺のバカ

Interfaceにコンストラクタは書けないですね。
ということで、前言は撤回します。プロパティのほうが良さそうですね。
こうなると、やっぱりSpringを参考にするといいのかなぁ。

あと、S2HessianやS2XmlRpcで、抽象でないメソッドをリモート呼び出ししているのは、深い意図があったわけではなく、サービスインターフェースに無いメソッドは「呼ぶな!」というスタンスだったからです。
が、さすがにそれはどうかと思うので、次のバージョンまでに、抽象で無いメソッドはローカルのメソッドを呼ぶようにします。
toStringとかは、Interceptorで気の利いた文字列を作ってあげたほうがいいのかなぁ。

Remoting

S2HessianのClientInterceptorのコードは、僕が書いたのがベースになってると思うので、そのときの意図を説明させてもらうと、サービスのURIをプロパティで指定するようにしているのはSpringを意識しています。
Springでは、

RemoteAccessor (抽象クラス)
  UrlBasedRemoteAccessor (抽象クラス)
    HessianClientInterceptor (各プロトコルごとの具象クラス)

のような継承関係になっていて、S2でもいずれはそんな感じになればいいなぁ、と思いそんなふうにしました。


が、S2XmlRpcを書いているときに、サービスのURIをプロパティで設定する必要があるのか、という疑問にかられ、コンストラクタで設定するように変更しました。
Springの場合、FactoryBeanを使ってどうのこうのしているみたいなのですが、S2の場合普通にInterceptorで書けるので、diconファイル以外でサービスのURIを設定することは無いだろう、と思ったからです。

というわけで、今は、どちらかというとコンストラクタで設定するほうがよいように思っています。確信はありませんが。


あと、クライアントのAPIは、イメージ的には、

package org.seasar.remoting;

public interface RemoteInvocationInterceptor {
  public RemoteInvocationInterceptor(String uri);
  public RemoteInvocationInterceptor(String uri, String id, String pwd);
  public Object invoke(MethodInvocation invocation);
}

みたいなのがあって、各プロトコルごとに上のInterfaceを実装する、と。
まあ、上のは今考えたので、もうちょっと練らないといけないでしょうけど。

・・・S2Axis、あまり追いかけてませんでした。
いまざっと見てみたのですが、ちょっと合わないですねぇ。
もうちょっと考えてから出直してきます。

『トランプ殺人事件』 竹本健治

傑作。
ゲーム3部作はこの作品のためにあったと思わせられる。
結局、物語中で語られなかった部分に、この作品の魅力が詰まっている。
語られていない物語にこれほど惹かれるとは。

『将棋殺人事件』 竹本健治

ふうむ、よくわからなかった。
実験的な手法が、ぎりぎりエンターテイメントに届かなかったような印象。
ストーリーにも結末にも、全面的にはうなずけないものがある。

S2XmlRpc

Boxcarring(というよりsystem.multicallと呼ぶべきか?)のクライアント側を実装してみたんだけど、世の中にこれが使えるサーバーってあるんだろうか?
あと、作ってみて思ったけど、これってあまりうれしくない気がする。Javaみたいに型付けの強い言語では特に。
結局、メソッドの戻り値を得ようと思ったら、リモートのメソッドを呼んだ順番にmulticallして得た戻り値の配列を、キャストしながら見ていかなければいけないわけで。
スクリプト系の言語だとそこら辺を気にしなくていいから、もうちょっとうれしいんだろうけど。

もうちょっと考えよう。