S2Axis serviceType と allowedMethods

ちょっとずつでも実装を進めようということで,今日は serviceType と allowedMethods を実装しました.
serviceType は Axis の WSDD で

<service name="MyService" provider="java:RPC">
    <parameter name="className" value="foo.Foo"/>

と書いた場合の,className に該当します.
WSDD に記述した className は,サービスの実装クラスを示すと同時に,?wsdl によって WSDL を生成する元ネタになります (別途 WSDL ファイルを指定しなかった場合).
S2Axis (っていうか S2) の場合,サービスの実装クラスは dicon の <component> 要素に記述されるため,別途実装クラスを指定する必要はありませんが,WSDL ファイルを生成する元ネタは実装クラスではなくて Java interface にできるとうれしかったりするはず.
そんなわけで (どんなわけで?),S2 が解釈する <compoent> 要素の class 属性とは別に,<meta> 要素内に serviceType プロパティを指定できるようにしました.なんで名前が className ではないかというと,このプロパティは String ではなくて Class 型なのです.なので,className は変.でも class だと Object#getClass() とバッティングしてそんなプロパティ作れないのと,class よりむしろ interface を指定するだろうということで,serviceType にしましたとさ.


そして allowedMethods は WSDD で指定できるものと全く同じです.もっと凝ったものにしようかと思っていたのですが,interface にメソッドを書いておきながらそのメソッドを Web サービスとして公開しないのは使い方がおかしくないか? という気のせいがしたので,あまり活用すべきものでもないと判断して Axis が提供する機能そのままという事にしておきます.


ということで,現状 S2Axis を使う場合の app.dicon はこんな感じになってます.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
  "http://www.seasar.org/dtd/components21.dtd">
<components>
  <include path="s2axis.dicon"/>

  <component name="Foo" class="org.seasar.axis.examples.foo.FooImpl">
    <property name="fullName">
      <component class="org.seasar.axis.examples.foo.FullName">
        <property name="firstName">"Yuri"</property>
        <property name="lastName">"Ebihara"</property>
      </component>
    </property>

    <meta name="s2axis:rpc-service">
      <component class="org.seasar.axis.server.ServiceDef">
        <property name="serviceType">@org.seasar.axis.examples.foo.Foo@class</property>
        <property name="allowedMethods">"getFullName"</property>
        <initMethod name="addBeanMappingDef">
          <arg>
            <component class="org.seasar.axis.server.BeanMappingDef">
              <property name="type">@org.seasar.axis.examples.foo.FullName@class</property>
            </component>
          </arg>
        </initMethod>
      </component>
    </meta>
  </component>
</components>

以前書いた構想とは全然違ってます.(^^;
<meta>name 属性は Kijimuna に補完してもらえないので,<meta> を使いまくるのはやめて,その中に <component> 要素を置くことにしました.
<meta name="s2axis:rpc-service"> のついたコンポーネントを探して Axis に登録するコンポーネントs2axis.dicon の中に定義されています.
こうやって見ると,BeanMapping/TypeMapping の定義は煩雑でうんざりしそう... やっぱり BeanMapping は自動で登録したいですね.頑張ろ.