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

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

14.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

外部クラス名と内部クラス名を“__”で連結します。
(例)
Bert__Fred

6

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

以下の手順で変換します。
メソッド名に2つの“_”を付加する。
IDL変換後の型を2つの“_”で連結する。
スペースを“_”で置換する。
(例)
void hello__();
void hello__long_a_b_c__long(
in long x,
in ::a::b::c y,
in long z);

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

7

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

以下の手順で変換します。
末尾に“_”を付加する。
大文字の位置を示す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、...)は左欄の番号に対応します。

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

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

(1) メソッド名先頭の“get”、“is”、または“set”に続く文字を展開する。

(2) 最初の文字を小文字に変換する。ただし、1文字目と2文字目の両方が大文字の場合は変換しない。

(3) 他の識別子名と名前が重複した場合は語尾に“__”を付加する。

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)本バージョンでは使用しないでください。


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

All Rights Reserved, Copyright(C) 富士通株式会社 2005