はじめに
いまどき、CORBAを使ってる人なんているの!?なんて話はさておき
そもそもCORBAとは?
ググればいくらでも出てくると思いますが……
Common Object Request Broker Architectureの略(コルバ・コーバ)。
分散処理を連携するための規格で、IDL(Interface Definition Language)で言語非依存のインターフェイスのみを定義する。
COBRAでは、コードをその機能や呼び出し方の情報と共に一種のカプセル化し、CORBAに対応したコンポーネント同士は言語やOSの違いによらず通信することができる。
つまり、IDLに記述したインターフェイスを実装していれば異なる言語(JavaとかCとか)間でも通信ができます。
参考サイト
今回のケースでは、idljコマンドでIDLに記述したインターフェイスをJavaに変換します……が、IDLの文法とJavaの文法が異なるためハマってしまいました。
(idljコマンドはJDKをインストールすると使えます。)
IDLの例
例として引数に価格を渡して消費税を計算するメソッドを定義すると以下のようになります。
module com{
module neriudon {
module corba {
interface CalcTax{
double calc(in long price);
};
};
};
};
module
はJavaのpackage
に、IDLのlong
はJavaのint
に相当します。詳しくはJava IDL: IDL to Java Language Mappingを参照してください。
で、ここからが本題です。↑のサイトに変換表が記載されていますが、メソッドの返り値・引数に配列を指定したい場合はどうしたらよいのでしょうか?
で、調べた結果……
Is it possible to accept a string array as argument in corba idl file
配列はtypedef
を使ってあらかじめ定義しておく必要があるようです。なんか構造体みたいですね。
以下はStringの配列をbyte配列に変換するメソッドです。
module com{
module neriudon {
module corba {
typedef sequence<octet> response;
typedef sequence<string> request;
interface Conveter
{
response convert(in request request);
};
};
};
};
※IDLのstring
はJavaのString
に、octet
はbyte
に相当。
では、さっそく、これをidlj
コマンドでJavaファイルに変換してみましょう。
idlj -fall -td ./ ./Converter.idl
を実行すると、以下のようなJavaコードが出力されます。
生成したインターフェイスを実装する場合はConveterPOA
を拡張します。
package com.neriudon.corba;
public class ConverterImpl extends ConveterPOA {
@Override
public byte[] convert(String[] request) {
// TODO Auto-generated method stub
return null;
}
}
IORファイルなどを使って実際にオブジェクトを通信する部分は割愛します。
ちなみに、JavaでCORBAを扱う場合はJacORBというプロジェクトもあります。
この記事を投稿した経緯
IDLの文法とJavaの文法が異なるためハマってしまったので。
byteの記法や配列の記法とかは単独でヒットするのですが、メソッドの入出力の例がなかなか見つからず苦労しました。
あとQiitaのコードブロックがIDLに対応していたのが驚き。