S2Axis における dicon メタデータの利用

最近の流行に乗ってドキュメントというか仕様先行で (笑).
S2Axis では,遠くない未来に S2.1 でサポートされるはずの dicon メタデータを活用して様々な指定ができるようにします.
その構想を書いてみるテスト.


Expose
現在の S2Axis では,コンテナ内の全てのコンポーネント (正確には名前の付けられているコンポーネント) が Web サービスとして公開されてしまいます.それはやっぱりイマイチ.
そんなわけで (どんなわけで?),公開するコンポーネントメタデータで特定します.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.Expose">true</meta>
        ...
    </component>

明示的に true が指定されたコンポーネントだけが Web サービスとして公開されることにします.
<components> 要素に記述した <meta> 要素は下位の <component> 要素に引き継がれるので,Web サービスとして公開するコンポーネントを一つの dicon ファイルにまとめて,次のように記述するのがオススメ. この方法は S2.1.3 ではサポートされませんでした.

<components>
    <meta name="org.seasar.axis.server.Expose">true</meta>

    <component name="foo" class="....">
        ...
    </component>
</components>

dicon ファイルの一部のコンポーネントを公開したくなければそれだけ false<meta> を指定すれば OK.


EndpointAddr
現在の S2Axis では,サービスののエンドポイントアドレス (URL) は,

コンテキストパス/名前空間/コンポーネント
コンテキストパス/コンポーネント

となっています.
これだけではちょっと柔軟性に欠けるので,メタデータでコンテキストパス以降のパスを指定できることにします.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.EndpointAddr">foo/bar/hogehoge</meta>
        ...
    </component>

EndpointAddr が指定された場合,コンポーネント名は使われません.EndpointAddr は,複数記述することができるものとします.
なお,Exposetrue が指定されていても,そのコンポーネントに名前が無く,EndpointAddr も指定されていない場合,そのコンポーネントは公開されません (警告を出すことにします).


AllowedInterface
AllowedMethod
現在の S2Axis では,コンポーネントの全てのメソッドが公開されてしまいます.それはあんまりなので,コンポーネントが実装している interface を指定して公開できることにします.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.AllowedInterface">foo.bar.HogeHoge</meta>
        ...
    </component>

あるいは,公開するメソッドを指定することもできます.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.AllowedMethod">foo</meta>
        ...
    </component>

AllowedInterface および AllowedMethod は混在可能で,どちらも複数指定できることにします.
メタデータが指定されなかった場合には,次のようにしたいと考えています.

  • コンポーネントinterface を実装していれば,その interface のメソッドだけが公開される.
  • コンポーネントinterface を実装していない場合は,java.lang.Object で定義されているメソッドを除いた public メソッドが公開される.

と書いてますが,どこまで実装できるのかよく分かってません.(^^;
Axis の WSDD では公開するメソッド名を指定できるのですが,オーバーロードされたメソッドを選択的に指定できるのかは未調査です.


TypeMapping
メソッドの引数および戻り値に関して,Axis が勝手にうまく計らってくれるのは概ねプリミティブ型と String 型などごく一部のクラスだけです.
それ以外の型については,明示的に Serializer/Deserializer を登録してあげなくてはなりません.
とはいえ,たいていの場合つまり JavaBeans なクラスについては Axis が用意してくれている BeanSerializer/BeanDeserializer を使うことができます.
ということで,標準でマッピングされない型については,S2Axis が勝手に BeanSerialzier/BeanDeserialzier を登録することにします.
しかし,それでは十分でない場合もあるでしょう.そんなわけで,使用する Serializer/Deserializer を指定できることにします.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.TypeMapping">
            <component class="org.seasar.axis.server.TypeMappingDecl">
                <property name="type">@foo.bar.HogeHogeBean@class</property>
                <property name="qname">"ns:local"</property>
                <property name="namespace">"foo.bar"</property>
                <property name="serializer">@foo.bar.HogeHogeBeanSerializerFactory@class</property>
                <property name="deserializer">@foo.bar.HogeHogeBeanDeserializerFactory@class</property>
            </component>
        </meta>
        ...
    </component>

TypeMappingDecl のプロパティは全て任意です.必要なものだけ指定すれば OK.


WSDL
Axis は,URL に ?wsdl を指定することにより,サービスの WSDL を返す機能を持っています.
これは基本的に,サービスの実装クラスから WSDL を生成して返すのですが,別途明示的に WSDL を指定することもできます.
S2Axis でもこれに対応して,明示的に WSDL を指定できるようにします.

    <component name="foo" class="....">
        <meta name="org.seasar.axis.server.WSDL">"HogeHoge.wsdl"</meta>
        ...
    </component>

指定された文字列は,まずはファイルのパス名として解釈します.そのファイルが存在しなければ,クラスローダからリソースとして検索します.
WSDL が指定されていなければ,サービスの実装クラスから WSDL が生成されます.


こんなものかなぁ?
メタデータ周りの仕様・API がまだ不明なので,いろいろ変更があるかもしれません.