1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CORBAのIDLファイルでメソッドの返り値・引数に配列を指定する方法

Posted at

はじめに

いまどき、CORBAを使ってる人なんているの!?なんて話はさておき:thermometer_face:

そもそもCORBAとは?

ググればいくらでも出てくると思いますが……

Common Object Request Broker Architectureの略(コルバ・コーバ)。
分散処理を連携するための規格で、IDL(Interface Definition Language)で言語非依存のインターフェイスのみを定義する。
COBRAでは、コードをその機能や呼び出し方の情報と共に一種のカプセル化し、CORBAに対応したコンポーネント同士は言語やOSの違いによらず通信することができる。
つまり、IDLに記述したインターフェイスを実装していれば異なる言語(JavaとかCとか)間でも通信ができます:scream_cat:

参考サイト

今回のケースでは、idljコマンドでIDLに記述したインターフェイスをJavaに変換します……が、IDLの文法とJavaの文法が異なるためハマってしまいました。
(idljコマンドはJDKをインストールすると使えます。)

IDLの例

例として引数に価格を渡して消費税を計算するメソッドを定義すると以下のようになります。

test.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配列に変換するメソッドです。

Converter.idl
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に、octetbyteに相当。

では、さっそく、これをidljコマンドでJavaファイルに変換してみましょう。

idlj -fall -td ./ ./Converter.idl を実行すると、以下のようなJavaコードが出力されます。

生成結果

生成したインターフェイスを実装する場合はConveterPOAを拡張します。

ConverterImpl.java
package com.neriudon.corba;

public class ConverterImpl extends ConveterPOA {

  @Override
  public byte[] convert(String[] request) {
    // TODO Auto-generated method stub
    return null;
  }
}

IORファイルなどを使って実際にオブジェクトを通信する部分は割愛します:frowning2:

ちなみに、JavaでCORBAを扱う場合はJacORBというプロジェクトもあります。

この記事を投稿した経緯

IDLの文法とJavaの文法が異なるためハマってしまったので:cry:
byteの記法や配列の記法とかは単独でヒットするのですが、メソッドの入出力の例がなかなか見つからず苦労しました:confounded:
あとQiitaのコードブロックがIDLに対応していたのが驚き:stuck_out_tongue_winking_eye:

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?