Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド
目次 索引 前ページ次ページ

第3部 EJB編> 第15章 EJBアプリケーションの呼出し方法> 15.10 IDL変換規則に関する補足資料

15.10.1 変換規則

 JavaからIDLに変換する際の変換規則を以下に示します。変換規則の詳細はhttp://java.sun.com/products/rmi-iiopを参照してください。
 なお、【備考】に○がついているJavaの記述方法を使用する場合には注意してください。JavaクラスからIDLに変換する際に名前が重複し、配備時にエラーとなることがあります。

Java

IDL

備考

1

パッケージ(package)
例) a.b.c

モジュール(module)
例) ::a::b::c

2

IDLキーワード
例) oneway

先頭に'_'を付加します。
例) _oneway

3

先頭が'_'
例) _fred

先頭に'J'を付加します。
例) J_fred

4

'$'やユニコード文字などのIDLで定義できない文字
例) a$b, x\u03bCy

'U'とUnicode値を表す4桁の16進数(大文字)で置換します。
例) aU0024b, xU03BCy

5

内部クラス
例) クラスBertの内部クラスFred

外部クラス名と内部クラス名を2つの'_'で連結します。
例) Bert__Fred

6

オーバーロードされたメソッド
例)
void hello();
void hello(
  int x,
  a.b.c y,
  int z);

以下の手順で変換します。

  1. メソッド名に2つの'_'を付加する。
  2. IDL変換後の型を2つの'_'で連結する。
  3. スペースを'_'で置換する。

例)
void hello__();
void hello__long_a_b_c__long(
  in long x,
  in ::a::b::c y,
  in long z);

  • 継承元と継承先で同名のメソッドが存在した場合(オーバーライドを含む)は継承先のメソッド名を変換します。

7

大文字/小文字だけが異なる識別子
例) jack, Jack, jAcK

以下の手順で変換します。

  1. 末尾に'_'を付加する。
  2. 大文字の位置を示す10進インデックスのリストを'_'で連結する。(インデックスは0ベース)

例) jack_, Jack_0, jAcK_1_3

8

メソッド名が他の識別子(定数、フィールド)の名前と重複した場合
例) 定数"foo"とメソッド"foo"

定数、フィールドの名前の末尾に'_'を付加し、メソッド名は変換しません。
例) 定数"foo_"とメソッド"foo"

9

変換後に名前の重なる場合
例)
void foo();
void foo(int x);
void foo__long();

エラーとして扱います。

10

void

void

11

boolean

boolean

12

char

char

13

byte

byte

14

short

short

15

int

long

16

long

long long

17

float

float

18

double

double

19

リモートインタフェース

  • java.rmi.Remoteインタフェースを直接的または間接的に継承したインタフェース(java.rmi.Remoteインタフェースは除く)
  • すべてのメソッド(継承メソッドを含む)がjava.rmi.RemoteExceptionもしくはそのスーパークラスを生成するように定義されている。

インタフェース(interface)

20

java.rmi.Remoteインタフェース

::java::rmi::Remote

//IDL
module java {
module rmi {
typedef Object Remote;
};
};

21

リモートインタフェースの継承関係

IDLの継承関係

22

以下のいずれかの条件に当てはまるリモートインタフェースのメソッド

  1. get<name>メソッドとset<name>メソッドのペアがあり次の条件に当てはまる場合。
    • get<name>メソッドの引数がない。
    • set<name>メソッドの引数が1つで、戻り値がvoidである。
    • get<name>メソッドの復帰値の型がset<name>メソッドの引数の型と同じ。
    • get<name>とset<name>がjava.rmi.RemoteExceptionとそのサブクラス以外の検査例外クラス(*2)を生成しない。
       
  2. get<name>メソッドが次の条件に当てはまる場合。
    • 引数がない。
    • 復帰値の型がvoidでない。
    • java.rmi.RemoteExceptionとそのサブクラス以外の検査例外クラス(*2)を生成しない。
       
  3. is<name>メソッドとset<name>メソッドのペアがあり次の条件に当てはまる場合。
    • is<name>メソッドの引数がない。
    • set<name>メソッドの引数が1つで、戻り値がvoidである。
    • is<name>メソッドの復帰値の型とset<name>メソッドの引数の型がbooleanである。
    • is<name>とset<name>がjava.rmi.RemoteExceptionとそのサブクラス以外の検査例外クラス(*2)を生成しない。
       
  4. is<name>メソッドが次の条件に当てはまる場合。
    • 引数がない。
    • 復帰値の型がbooleanである。
    • java.rmi.RemoteExceptionとそのサブクラス以外の検査例外クラス(*2)を生成しない。

attribute

以下のように変換します。番号(1、2、...)は左欄の番号に対応します。

  1. set<name>メソッドの引数の型に対応する読取り書込み可能attribute
  2. get<name>メソッドの復帰値の型に対応する読取り専用attribute
  3. set<name>メソッドの引数の型に対応する読取り書込み可能attribute
  4. is<name>メソッドの復帰値の型に対応する読取り専用attribute

attribute名の取得手順を以下に示します。

  1. メソッド名先頭の"get"、"is"、または"set"に続く文字を展開する。
  2. 最初の文字を小文字に変換する。ただし、1文字目と2文字目の両方が大文字の場合は変換しない。
  3. 他の識別子名と名前が重複した場合は語尾に2つの'_'を付加する。

23

リモートインタフェースの項目22以外のメソッド

以下の手順で変換します。

  1. 項目6、7の変換規則を適用する。
  2. 引数を対応するIDL型のinパラメタに変換する。
  3. 例外は対応するIDLの例外に変換する。また、java.rmi.RemoteExceptionまたはそのサブクラスと、非検査例外クラス(*1)はIDLにマッピングしない。

24

リモートインタフェースの定数(public final staticフィールド)

Javaと同じ値を持ち、対応するIDL型の定数(const)に変換します。wstringとwcharの値はエスケープします。
(*3)

25

リモートインタフェースのバージョンチェック

リポジトリID
例)
#pragma ID RMInterface
"RMI:pack.RMInterface:0000000000000000"

26

直列化可能クラス

  • java.io.Serializableインタフェースを直接的または間接的に継承する。
  • java.io.Remoteインタフェースを直接的にも間接的にも実装しない。
  • 以下のクラスを除く。
    • java.lang.String
    • java.lang.Class
    • org.omg.CORBA.portable.IDLEntity またはorg.omg.CORBA.portable.ValueBaseを直接的または間接的に実装するクラス

valuetype

27

直列化可能クラスで、org.omg.CORBA.portable.IDLEntityまたはorg.omg.CORBA.portable.ValueBaseを直接的または間接的に実装するクラス
(*4)

IDLにマッピングしません。

28

直列化可能クラスの継承クラス関係

IDLの継承関係

29

直列化可能クラスが実装するインタフェースとの関係(java.io.Serializableとjava.io.Externalizableは除く)

  • 実装するインタフェースが項目53に当てはまる場合はIDLの継承関係に変換します。
  • 実装するインタフェースが項目48に当てはまる場合はIDLのsupports関係に変換します。

30

直列化可能クラスのメソッド

IDLにマッピングしません。

31

直列化可能クラスのコンストラクタ

IDLにマッピングしません。

32

直列化可能クラスの定数(public final staticフィールド)

Javaと同じ値を持ち、対応するIDL型の定数に変換します。wstringとwcharの値はエスケープします。
(*3)

33

直列化可能クラスでjava.io.Externalizableを実装しているクラス

custom valuetype

34

直列化可能クラスで以下の条件に当てはまる場合

  • java.io.Externalizableを実装しない。
  • writeObjectメソッドが定義されている。

custom valuetype

35

直列化可能クラスで以下の条件に当てはまる場合

  • java.io.Externalizableを実装しない。
  • java.io.ObjectStreamField[]型で名前にserialPersistentFieldsのprivate static finalフィールドが宣言されている。

左欄のフィールドserialPersistentFieldsに対応するフィールドだけIDLにマッピングします。
(*3)

36

直列化可能クラスのフィールド。

  1. 非staticで非transientなpublicフィールド
  2. 非staticで非transientなprivateフィールド
  3. 上記以外

以下のように変換します。番号(1、2、...)は左欄の番号に対応します。

  1. publicデータメンバ
  2. privateデータメンバ
  3. IDLにマッピングしない。

37

直列化可能クラスのバージョンチェック

リポジトリID
例)
#pragma ID Hedgehog
"RMI:alpha.bravo.Hedgehog:12345678ABCDEF00:0123456789ABCDEF"
(*3)

38

java.lang.Stringクラス

  1. パラメタ、復帰値、データメンバ
  2. 定数

以下のように変換します。番号(1、2)は左欄の番号に対応します。

  1. ::CORBA::WStringValue
  2. wstring

39

java.lang.Classクラス

::javax::rmi::CORBA::ClassDesc

40

配列
例1) boolean[]
例2) long[]
例3) a.b.C[]
例4) x.Y[][]

以下のようにorg.omg.CORBA..boxedRMIモジュールに展開します。

  • 例1) モジュール::org::omg::boxedRMIを定義し、以下のvaluetypeを展開する。
    valuetype seq1_boolean sequence<boolean>
  • 例2) モジュール::org::omg::boxedRMIを定義し、以下のvaluetypeを展開する。
    valuetype seq1_long_long sequence<long long>;
  • 例3) モジュール::org::omg::boxedRMI::a::bを定義し、以下のvaluetypeを展開する。
    valuetype seq1_C sequence<::a::b::C>;
  • 例4) モジュール ::org::omg::boxedRMI::xを定義し、以下のvaluetypeを展開する。
    valuetype seq1_Y sequence<::x::Y>;
    valuetype seq2_Y sequence<seq1_Y>;

41

例外

exceptionとvaluetypeの両方に変換し、exceptionには対応するvaluetypeのフィールドを1つ定義します。

  • exception
    以下の手順で変換し、メソッド名のraises節に定義する。
    1. 末尾部分が"Exception"の場合は削除する。
    2. 名前の末尾に"Ex"を付加する。
    3. 他の変換規則を適用する。
  • valuetype
    項目26〜37と同様に変換され、対応するexceptionに名前が"value"の単一のデータメンバで定義される。

42

CORBAオブジェクト参照型
org.omg.CORBA.Objectインタフェースを直接的または間接的に継承し、IDLtoJavaの規約に準拠しているJavaインタフェース(org.omg.CORBA.Objectは除く)
(*4)

既存のinterfaceに変換される。新規にIDLは出力しません。

43

org.omg.CORBA.Objectインタフェース

Object

44

CORBAオブジェクト参照型以外のIDLエンティティ型インタフェース
(*4)

IDLエンティティを含む、"boxed"なvaluetypeに変換します。

45

java.io.Serializableインタフェース

::java::io::Serializable

//IDL
module java {
module io {
typedef any Serializable;
};
};

46

java.io.Externalizableインタフェース

::java::io::Externalizable

//IDL
module java {
module io {
typedef any Externalizable;
};
};

47

java.lang.Objectクラス

::java::lang::_Object

//IDL
module java {
module lang {
typedef any _Object;
};
};

48

以下の条件に当てはまるインタフェース

  • java.rmi.Remoteインタフェースを直接的にも間接的にも継承しない。
  • すべてのメソッド定義(継承メソッドを含む)がjava.rmi.RemoteExceptionまたはjava.rmi.RemoteExceptionのスーパークラスを生成する。

abstract interface

49

項目48に当てはまるインタフェースの継承インタフェース

継承abstract interface

50

項目48に当てはまるインタフェースのメソッド

項目22、23と同様に変換します。

51

項目48に当てはまるインタフェースの定数

項目24と同様に変換します。

52

リモートインタフェースを実装するクラス

  1. 単一リモートインタフェースを実装
  2. 複数リモートインタフェースを実装

以下のように変換します。番号(1、2)は左欄の番号に対応します。

  1. IDLを出力しない。
  2. リモートインタフェースを継承するインタフェース(interface)に変換する。

53

項目19、20、42、43、44、45、46、48のどれにも当てはまらないインタフェース

abstract value

54

項目26、27、33、34、38、39、47、52のどれにも当てはまらないクラス

abstract value

 *1) 非検査例外クラス:java.lang.RuntimeExceptionとそのサブクラス、およびjava.lang.Errorとそのサブクラス
 *2) 検査例外クラス:非検査例外クラス以外の例外クラス
 *3) RMI over IIOPの規約を完全に実装していません。動作には問題ありません。
 *4) 本バージョンでは使用しないでください。


目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED