PharoでXMLRPCを使う(2)

以前にPharoでXMLRPCを使う。という記事を書いたが、Pharo 2.0でXMLRPC使おうとすると問題が起こる。
というのもXMLRPCではKom系のWebサーバーを使っているのに対して、Pharo 2.0ではZincがデフォルトだからである。
過去の記事どおりにインストールしようとすると、いろいろなパッケージを入れた後でエラーとなってしまう。
手動でKom系を追加してもいいのだろうが、今後どのような扱いがされるのか不安なので、XMLRPCでZincが使えるようにした。

嘘です。嘘を言いました。ごめんなさい。

実は、既にXMLRPCではZincが使えるようにされているので若干の修正を加えればちゃんと動きます。
ConfigurationOfXMLRPCを書き換えるのが面倒だったので、以下では、手動で構築する手順について述べていきます。

準備

XMLParserとXMLWriterが必要なので、あらかじめパッケージをインストールしておきます。

MetacelloConfigurationBrowser open.

でMetacelloのブラウザを起動し、一覧からXMLParserを選んでInstallボタンを押してインストールします。
ついでにXMLWriterも自動的にインストールされるので、これで準備はOKです。

Client-Coreパッケージのロード

まずは、XMLRPCのClientパッケージをロードする。そのために、Monticelloにレポジトリを追加する。

MCHttpRepository
	location: 'http://ss3.gemstone.com/ss/XMLRPC'
	user: ''
	password: ''

上記のようにHTTPのレポジトリを追加して開くと、XMLRPC関係のパッケージが表示される。
XMLRPC-Client-Coreを選んだら、右側のペインでXMLRPC-Client-Core-SantiagoBragagnolo.30を選んでLoadする。
(おそらく、これ以降のパッケージを選んでも大丈夫だと思うが、EiichiroItoというシグネチャのものは選ばない方がいいと思われるwww。以下同様。)

Client-Testsパッケージのロード

この手のパッケージでテストしないのは地獄を見るだけなので、Testsパッケージも追加する。
先ほどのレポジトリから、XMLRPC-Clients-Testsを選び、右側のペインでXMLRPC-Client-Tests-SantiagoBragagnolo.14を選んでLoadする。

Server-Coreパッケージのロード

レポジトリの左側のペインでXMLRPC-Server-Coreを選び、XMLRPC-Server-Core-SantiagoBragagnolo.19をLoadする。

Server-Testsパッケージのロード

レポジトリの左側のペインでXMLRPC-Server-Coreを選び、XMLRPC-Server-Tests-SantiagoBragagnolo.9をLoadする。

これで一通りのパッケージがロードできた。
しかし、現在のテストコードはKom用なので、これをZinc用に書き換える必要がある。

XMLRPCTestクラスの修正

XMLRPCTestクラスのsetUpメソッドを修正する。このメソッドでは、XMLRPCKomServerEchoTestを使ってテストするように書かれているが、この部分をXMLRPCZNServerEchoTestに書き換える。

XMLRPCStandardEchoクラスの修正

XMLRPCStandardEchoクラスのクラス側メソッドであるecho:を修正する。

echo: aValue

   ^aValue

元のコードでは、エコーで返されるコレクションのfirstをとるようになっているが、このfirstを削除してaValueそのものを返すようにする。

XMLRPCZNServerEchoTestクラスの修正

XMLRPCZNServerEchoTestクラスのsetUpを修正する。

setUp
	"self new setUp"
	"XMLRPCHttpModule stop"
	XMLRPCServer defaultClass: XMLRPCZNServer.
	newServer := false.
	XMLRPCStandardEcho addTests.
	XMLRPCHttpModule
		start;
		setDebugMode.
	(Delay forMilliseconds: 5) wait.
	newServer := true

元のコードでは、HttpServiceでサービスの登録有無を確認しているが、特に必要ないと思われるのでその部分をごっそり削除する。

以上でZincへの対応は終わり。テストクラスのうち、XMLRPCKomServerEchoTestとXMLRPCKomServerTestを除けばちゃんとグリーンでテストがとおるようになる。

問題点

実は大きな問題があり、この修正をかけた後でサーバーを起動したまま保存&終了すると、次回Pharoがフリーズするという現象を確認している。
Save & Quitする場合は確実にサーバーを止めないと非常に痛い目にあうので注意すること。