(1)IDLマッピング
IDL言語で列挙型enumを指定した場合、Java言語ではenumクラスとenumHolderクラスとenumHelperクラスになります。
enumクラスには、以下のように要素を識別するためのメンバと、メンバにアクセスするためのメソッドが定義されています。本クラスは、inパラメタおよび復帰値を扱う場合に使用します。enumクラス名は、以下のようにIDLで定義したenum名(enumName)になります。
<enumクラス>
[package <packageName>]
public final class <enumName>{
public static final int _<label_1> = <labelValue>;
public static final <enumName> <label_1>
= new <enumName>(_<label_1>);
:
public static final int _<label_n> = <label Value>;
public static final <enumName> <label_n>
= new <enumName>(_<label_n>);
public int value() {...}
public static <enumName> from_int(int value) {...}
}
private <enumName>(int value) { }
}enumクラス中で定義されているメンバの意味を以下の表に示します。
enumクラスのメンバ | 意味 |
|---|---|
value() | 要素の値を取り出します。 |
from_int() | 要素の値を指定して、要素名を取り出します。 |
enumHolderクラスは、以下のようにIDLで定義したenum名+Holderとなります。本クラスは、outやinoutパラメタを受け渡す場合に使用します。
<enumHolderクラス>
[package <packageName>;]
final public class <enumName>Holder
implements org.omg.CORBA.portable.Streamable {
public [<packageName>.]<enumName> value;
public <enumName>Holder() { }
public <enumName>Holder([<packageName>.]<enumName> value){...}
public void _read (org.omg.CORBA.portable.InputStream i){...}
public void _write(org.omg.CORBA.portable.OutputStream o){...}
public org.omg.CORBA.TypeCode _type(){...}
}enumHolderクラス中で定義されているメンバの意味を以下の表に示します。
enumHolderクラスのメンバ | 意味 |
|---|---|
value | 要素の値。 |
デフォルトコンストラクタ | valueメンバへの設定なしで、インスタンスを生成するために使用します。 |
コンストラクタ | valueメンバにパラメタで指定された要素の値を設定します。 |
_read() | 要素の値を読み込みます。 |
_write() | 要素の値を書き込みます。 |
_type() | TypeCodeを取り出します。 |
enumHelperクラスは、以下のようにIDLで定義したenum名+Helperになります。
Helperクラスは、ユーザ定義型のデータのデータストリームへの書き込み、データストリームからのユーザ定義型のデータの取り出し、ユーザ定義型のTypeCode、リポジトリIDの参照などの機能を提供します。
<enumHelperクラス>
[package <packageName>;]
public class <enumName>Helper {
public static void
insert (org.omg.CORBA.Any a,[<packageName>.]<enumName> value){...}
public static [<packageName>.]<enumName>
extract (org.omg.CORBA.Any a){...}
public static org.omg.CORBA.TypeCode
type(){...}
public static [<packageName>.]<enumName>
read(org.omg.CORBA.portable.InputStream istream){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
[<packageName>.]<enumName> value){...}
public static String
id(){...}
public java.lang.Object
read_Object(org.omg.CORBA.portable.InputStream istream){...}
public void
write_Object(org.omg.CORBA.portable.OutputStream ostream,
Object value){...}
public java.lang.String
get_id( ){...}
public org.omg.CORBA.TypeCode
get_type(){...}
}enumHelperクラス中で定義されているメンバの意味を以下の表に示します。
enumHelperクラスのメンバ | 意味 |
|---|---|
insert() | 要素の値を挿入します。 |
extract() | 要素の値を取り出します。 |
type() | TypeCodeを取り出します。 |
id() | リポジトリIDを返します。 |
IDL言語での定義が以下のように定義されていた場合について、アプリケーションプログラム例を示します。
【IDL言語】
module ODsample{
enum EnumType { a, b, c };
interface enumtest{
EnumType op( in EnumType in_p, out EnumType out_p, inout EnumType io_p );
};
};これをJava言語にマッピングすると、以下のようになります。
【Java言語】
<インタフェース>
package ODsample;
public interface enumtestOperations {
public ODsample.EnumType op(ODsample.EnumType in_p,
ODsample.EnumTypeHolder out_p,
ODsample.EnumTypeHolder io_p );
}<enumクラス>
package ODsample;
public final class EnumType
implements org.omg.CORBA.portable.IDLEntity
{
public static final int _a = (int)0;
public static final EnumType a = new EnumType(_a);
public static final int _b = (int)1;
public static final EnumType b = new EnumType(_b);
public static final int _c = (int)2;
public static final EnumType c = new EnumType(_c);
public static final EnumType MAX_VALUE = new EnumType(Integer.MAX_VALUE);
public int value(){...}
public static EnumType from_int(int i){...}
private EnumType(int value){ }
}<enumHolderクラス>
package ODsample;
public class EnumTypeHolder
implements org.omg.CORBA.portable.Streamable {
public ODsample.EnumType value;
public EnumTypeHolder() { }
public EnumTypeHolder(ODsample.EnumType value){...}
public void _read(org.omg.CORBA.portable.InputStream i){...}
public void _write(org.omg.CORBA.portable.OutputStream o){...}
public org.omg.CORBA.TypeCode _type(){...}
}<enumHelperクラス>
package ODsample;
public class EnumTypeHelper
{
public static void
insert(org.omg.CORBA.Any a, ODsample.EnumType value){...}
public static ODsample.EnumType
extract(org.omg.CORBA.Any a){...}
public static String
id(){...}
public java.lang.Object
read_Object(org.omg.CORBA.portable.InputStream istream){...}
public void
write_Object(org.omg.CORBA.portable.OutputStream ostream,
Object value){...}
public java.lang.String
get_id( ){...}
public org.omg.CORBA.TypeCode
get_type(){...}
private static org.omg.CORBA.TypeCode _type;
synchronized public static org.omg.CORBA.TypeCode
type(){...}
public static ODsample.EnumType
read(org.omg.CORBA.portable.InputStream istream){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
ODsample.EnumType value){...}
}(2)クライアントアプリケーションでの処理
import org.omg.CORBA.*;
import ODsample.*;
public class enumClient {
public static void main(String args[]) {
// ORBの前処理
// オブジェクトリファレンスの獲得
:
try{
// inパラメタ用変数
EnumType in = EnumType.a;
//outパラメタ用変数
EnumTypeHolder outHolder = new EnumTypeHolder();
// inoutパラメタ用変数
EnumTypeHolder inoutHolder
= new EnumTypeHolder( EnumType.b );
// 復帰値用変数
EnumType result;
// サーバアプリケーションのメソッド呼出し
result = target.op( in, outHolder, inoutHolder );
// メソッドの結果表示
System.out.println( result.value() );
System.out.println( outHolder.value.value() );
System.out.println( inoutHolder.value.value() );
}
catch ( java.lang.Exception e ) {
//エラー処理
:
}
}
} Java言語でinパラメタをサーバアプリケーションに受け渡す場合は、直接enumクラスのインスタンスにデータを設定します。また、out、inoutパラメタとしてサーバアプリケーションにパラメタを受け渡す場合は、new演算子を使用して各データ型のenumHolderクラスのインスタンスを生成します。inoutパラメタには、enumクラスのデータを設定します。
設定には、以下の2つの方法があります。
【デフォルトコンストラクタを使用した方法】
EnumTypeHolder a = new EnumTypeHolder(); //デフォルトコンストラクタ a.value = EnumType.c; //データの代入
【コンストラクタを使用した方法】
EnumTypeHolder b = new EnumTypeHolder(EnumType.c); //コンストラクタ
なお、サーバの処理結果は、out、inoutパラメタおよび復帰値の各インスタンスのvalueに値が設定されます。
(3)サーバアプリケーションでの処理
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import ODsample.*;
// Servantクラス
// サーバアプリケーションのメソッド
class enumServant extends enumtestPOA {
public EnumType op( EnumType in,
EnumTypeHolder outHolder,
EnumTypeHolder inoutHolder ) {
// 入力パラメタの表示
System.out.println( in.value() );
System.out.println( inoutHolder.value.value() );
// 出力パラメタの設定
outHolder.value = EnumType.b;
inoutHolder.value = EnumType.c;
// 復帰
return( EnumType.a );
}
}
public class enumServer {
public static void main(String args[]) {
try {
// ORBの前処理
:
// POAオブジェクトの生成
:
// Servantの生成とそのPOAへの登録
:
// POAManagerの活性化
:
}
catch (java.lang.Exception e) {
//エラー処理
:
}
}
}Java言語でinパラメタを参照する場合は、inパラメタのインスタンスのvalueで参照します。inoutパラメタを参照するには、enumHolderクラスからenumクラスのインスタンスを取り出し、このインスタンスのvalueで参照します。また、out、inoutパラメタとしてクライアントアプリケーションにパラメタを返す場合、enumHolderクラスからenumクラスのインスタンスを取り出し、このインスタンスに直接設定します。