サンプルコード説明~CurlからJavaのメソッドを呼ぶ~(2)
次にCurl側のコードを見ていきたいと思います。
curl/SAMPLEディレクトリ配下にFoo.scurl、Hoge.scurl、Person.scurl、SampleException.scurl、load.scurlがありますが、これらはCurl ORBのコード生成ツールから自動的に生成されたコードです。
例えばサービスクラスHogeを一部見てみますと以下のようなコードが生成されています。
||| ||| Curl ORB for java (version 0.6) ||| This code was generated by the Curl code generator automatically. ||| package name : SAMPLE ||| generated date : 2009-04-01 14:03:48.499000 ||| {import * from COM.CURLAP.ORB} {define-class public Hoge {inherits ApplicationContextClient} {constructor public {default server-url:#Url = null} {construct-super.ApplicationContextClient "hoge", server-url = server-url} } {method public {async-hello v0:String, ...:EventHandler}:AsyncWorker {return {self.async-invoke "hello", arguments = {FastArray v0}, {splice ...}} asa AsyncWorker} } {method public {hello v0:String}:#String {return {self.invoke "hello", arguments = {FastArray v0}} asa #String} } {method public {async-get-person ...:EventHandler}:AsyncWorker {return {self.async-invoke "getPerson", {splice ...}} asa AsyncWorker} } {method public {get-person}:#Person {return {self.invoke "getPerson"} asa #Person} } ...
JavaのコードからCurlのコードを生成する場合、以下のルールに従い、生成されます。
- パッケージ名は大文字となります(Curlの一般的なネーミングルール)。
- メソッド名は、すべて小文字で単語の区切りはハイフンとなります(java:getPerson -> Curl:get-person)。
- クラス名は同様です。
- 同期通信用メソッドは、そのままで、非同期通信用メソッドは"async-"という名前が付与されます。
次にデータクラスであるPersonを見ます。
{define-class public serializable Person field private _name:#String field private _age:int field private _sex:bool {getter public {age}:int {return self._age asa int} } {getter public {sex}:bool {return self._sex asa bool} } {getter public {name}:#String {return self._name asa #String} } {setter public {age v:int}:void set self._age = v } {setter public {sex v:bool}:void set self._sex = v } {setter public {name v:String}:void set self._name = v } }
こちらは、以下のルールに従い、生成されます。
- パッケージ名は大文字となります(Curlの一般的なネーミングルール)。
- メソッド名は、すべて小文字で単語の区切りはハイフン(-)となります(java:getPerson -> Curl:get-person)。
- クラス名は同様です。
- ゲッター・セッターが存在する場合、フィールド名は、アンダーバー(_)付きになります。
- ゲッター・セッターはフィールド名となります。
では上記の生成されたクラスを利用する方法を説明していきます。
と言っても、Curlのメソッド・コールと同様ですので、Curl ORBやJavaを意識することなく、利用することが可能です。以下がサンプルに含まれるソースコード(sample1.curl)の一部です。
|| インスタンス生成 def foo = {Foo} || メソッド呼び出し def person = {foo.get-person} def hello = {foo.hello {non-null person.name}} def result = {foo.add {t1.value.to-int}, {t2.value.to-int}}
{hoge.get-person}で、Java側のSpringで管理されているHogeインスタンス(idが"hoge")のgetPersonメソッドを呼び出し、結果(Personオブジェクト)を取得し、personという変数にセットしています。また、{hoge.add 数字, 数字}を実行すると、Java側のaddメソッドが呼び出され、足し算の結果が戻り値として返ります。上記の例ですとresult変数に足し算の結果がセットされます。
ちなみに、Curl ORBが動いているサーバ(ここではApache Tomcatサーバ)がlocalhost:8080以外で動いている場合は、サーバURLを変更する必要があります。これにはset-default-server-urlプロシージャを利用し、変更します。この行は他の処理よりも前に一行のみ記述してください(例えば、アプレットが呼び出された直後に挿入)。
{set-default-server-url {url "http://hogehoge:8888/test-server"}}
詳細はこちら(サーバURLを指定)を参照ください。