YahooAPIをXMLBeansで作りかえ。

以前YahooのWEBサービスJavaで利用できるようなAPI
(実際は、ネットワーク系のユーティリティと、オブジェクトバインディングしているだけ)
を作って、ひそやかに公開していたわけですが、


いないと思っていた利用者からの障害報告*1を受け、
再度生成し直した時に思ったわけです。
JaxMe2ってどうなのかな?と。


というわけで、
おそらく今後スタンダードの位置をつっぱしるであろう(主観)、
XMLBeansをつかって作りなおしてみようと思い立ったわけです。


ちなみに、YahooのWebサービスですが、自分でも使用していなかったりしますが、
IDがあるのと、SOAPではなくRESTであることを鑑みて題材にしたというのが適切・・・


サンプルはこちら
https://mokkouyou.dnsdojo.com/file/YahooAPI_XMLBeans.lzh

XMLBeansって・・・・

省略。
解説サイトにおまかせ。
http://www.ibm.com/developerworks/jp/opensource/library/os-ag-soa/


もともと、BEAプロダクトなので、情報も多いはず。
とりあえずは、オブジェクトとXMLバインディングツールだと思えばよし。

準備

XMLBeansのインストールを済ます。(2.3.0)
XMLBEANS_HOMEとする。(環境変数に設定する必要はない)


Eclipseで適当にJavaプロジェクトを作る。
直下にschemasフォルダ、libフォルダ、srcフォルダ(ソースディレクトリ)、gensrc(ソースディレクトリ)を作成。
srcは、成果物を利用するようなソースの配置を想定。※jarを作るだけなら不要。


http://developer.yahoo.co.jp/
より、Yahoo!検索の結果xsdを取得して、schemasに配置する。
旧YahooAPIを流用するので、WEB、Image、Videoの3つ。
※拡張子xsdで保存すること。


XMLBEANS_HOME/lib
のjarを、libフォルダに配置する。(ビルドバスに追加)

ちなみに

xsdが用意されていなかったり(そんなサービスはないと思うが)
自分で作るんだけど、xsd定義めんどい・・・とか、
Relaxerなんだけど・・・
とかいう場合は、Trungを使うととっても便利。

buildファイル

サンプルのbuildを流用して編集。
べた書き・・・

パッケージを指定したい

なんだか、ここで生成ソースに対するパッケージの指定が出来ない・・・
というわけで、パッケージの指定をしたい場合は、以下参照
http://wiki.apache.org/xmlbeans/XmlBeansFaq?highlight=%28package%29#configPackageName


簡単に言うと、
以下内容の.xsdconfigをschemasに配置しろ。との事。

<xb:config xmlns:pol="http://openuri.org/easypoLocal"
   xmlns:xb="http://www.bea.com/2002/09/xbean/config">

   <xb:namespace uri="urn:yahoo:jp:srch">
       <xb:package>com.dnsdojo.mokkouyou.yahoo.result.web</xb:package>
   </xb:namespace>
   <xb:namespace uri="urn:yahoo:jp:srchmi">
       <xb:package>com.dnsdojo.mokkouyou.yahoo.result.image</xb:package>
   </xb:namespace>
   <xb:namespace uri="urn:yahoo:jp:srchmv">
       <xb:package>com.dnsdojo.mokkouyou.yahoo.result.video</xb:package>
   </xb:namespace>
       <!-- If schema doesn't include targenamespace then use
       <xb:namespace uri="##any">
         <xb:package>org.openuri.easypo.xsdconfig</xb:package>
       </xb:namespace>
       -->
</xb:config>

その他

あとは、生成されたjarにパス通して、開いたコネクションから
InputStreamを、渡してやればよいです。


結局は、XMLBeanの使用法通りなんだけど、APIと名乗る以上、
RESTの組み立ても。


定数


Queryの保持クラス

マーシャリング

使用例


とまぁ、こんな感じ。
パフォーマンス計測することもないし、
複雑なこともやる気ないので、
JaxMe2とどっちがよいの?
といわれると微妙。
個人的には、JaxMe2でいいと思っている・・・・
特にパッケージ指定に関する部分ではマイナスですね。
パッケージエクスプローラで見えなくなるし。


他に方法があればいいんだが・・・

*1:障害というか、Yahoo側のResponseField変更があったのが障害の原因なのですが・・・