(1)IDLマッピング
IDL言語で構造体structを指定した場合、Java言語ではstructクラス、structHolderクラス、およびstructHelperクラスになります。
structクラス名は、IDLで定義した構造体名になります。本クラスは、inパラメタおよび復帰値を扱う場合に使用します。
structクラスで定義されているメンバの意味を以下の表に示します。
structクラスのメンバ | 意味 |
|---|---|
デフォルトコンストラクタ | 何もしません。 |
コンストラクタ | 指定されたパラメタをインスタンスメンバに設定します。 |
structHolderクラス名は、以下のようにIDLで定義した構造体名+Holderになります。本クラスは、out、inoutパラメタを扱う場合に使用します。
<structHolderクラス>
[package <packageName>;]
final public class <struct_class>Holder implements
org.omg.CORBA.portable.Streamable {
public [<packageName>.]<struct_class> value;
public <struct_class>Holder() {}
public <struct_class>Holder([<packageName>.]<struct_class> 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() {...}
}structHolderクラスで定義されているメンバの意味を以下の表に示します。
structHolderクラスのメンバ | 意味 |
|---|---|
デフォルトコンストラクタ | valueメンバへの設定なしで、インスタンスを生成するために使用します。 |
コンストラクタ | 指定されたパラメタをvalueメンバに設定します。 |
_read() | 要素の値を読み込みます。 |
_write() | 要素の値を書き込みます。 |
_type() | TypeCodeを取り出します。 |
structHelperクラス名は、以下のようにIDLで定義した構造体名+Helperになります。
Helperクラスは、ユーザ定義型のデータのデータストリームへの書き込み、データストリームからのユーザ定義型のデータの取り出し、ユーザ定義型のTypeCode,リポジトリIDの参照などの機能を提供します。
<structHelperクラス>
[package <packageName>;]
public class <struct_class>Helper {
public static void
insert(org.omg.CORBA.Any a, <packageName>.<struct_class> value){...}
public static <packageName>.<struct_class>
extract(org.omg.CORBA.Any a){...}
public static org.omg.CORBA.TypeCode
type(){...}
public static String
id(){...}
public static <packageName>.<struct_class>
read(org.omg.CORBA.portable.InputStream istream){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
<packageName>.<struct_class> value){...}
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(){...}
}structHelperクラス中で定義されているメンバの意味を以下の表に示します。
structHelperクラスのメンバ | 意味 |
|---|---|
insert() | 要素の値を挿入します。 |
extract() | 要素の値を取り出します。 |
type() | TypeCodeを取り出します。 |
id() | リポジトリIDを返します。 |
IDL言語での定義が以下のように定義されていた場合について、アプリケーションプログラムの例を示します。
【IDL言語】
module ODsample{
struct samplefix { // 構造体(固定長)
long para1;
long para2;
};
struct samplevar { // 構造体(可変長)
long para1;
string para2;
};
interface structtest{
samplefix op2(
in samplefix str1,
out samplefix str2,
inout samplefix str3 );
samplevar op1(
in samplevar str1,
out samplevar str2,
inout samplevar str3 );
};
};これをJava言語で記述すると、以下のようになります。
【Java言語】
<インタフェース>
package ODsample;
public interface structtestOperations {
public ODsample.samplefix op2(ODsample.samplefix str1,
ODsample.samplefixHolder str2,
ODsample.samplefixHolder str3 );
public ODsample.samplevar op1(ODsample.samplevar str1,
ODsample.samplevarHolder str2,
ODsample.samplevarHolder str3 );
}<structクラス>
package ODsample;
final public class samplefix
implements org.omg.CORBA.portable.IDLEntity
{
public int para1;
public int para2;
public samplefix() {}
public samplefix(int para1, int para2) {...}
}
package ODsample;
final public class samplevar
implements org.omg.CORBA.portable.IDLEntity
{
public int para1;
public java.lang.String para2;
public samplevar() {}
public samplevar( int para1,
java.lang.String para2) {...}
}<structHolderクラス>
package ODsample;
public class samplefixHolder
implements org.omg.CORBA.portable.Streamable {
public ODsample.samplefix value;
public samplefixHolder() {}
public samplefixHolder(ODsample.samplefix 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() {...}
}
package ODsample;
public class samplevarHolder
implements org.omg.CORBA.portable.Streamable {
public ODsample.samplevar value;
public samplevarHolder() {}
public samplevarHolder(ODsample.samplevar 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() {...}
}<structHelperクラス>
package ODsample;
public class samplefixHelper
{
public static void
insert(org.omg.CORBA.Any a, ODsample.samplefix value){...}
public static ODsample.samplefix
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.samplefix
read(org.omg.CORBA.portable.InputStream istream){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
ODsample.samplefix value){...}
}
package ODsample;
public class samplevarHelper
{
public static void
insert(org.omg.CORBA.Any a, ODsample.samplevar value){...}
public static ODsample.samplevar
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.samplevar
read(org.omg.CORBA.portable.InputStream istream){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
ODsample.samplevar value){...}
}(2)クライアントアプリケーションでの処理
inパラメタのstruct型のデータ領域は、newを使用して獲得します。inout、outパラメタの場合は、structHolderクラスを使用してデータ領域を割り当てます。
クライアントアプリケーションは、in、inoutパラメタの入力値として、structクラスのインスタンスのメンバに値を設定します。inoutパラメタでは、作成したstructクラスのインスタンスをstructHolderクラスのメンバに設定します。
inout、outパラメタの出力値を参照するには、structHolderクラスのインスタンスのvalueを参照します。
import org.omg.CORBA.*;
import ODsample.*;
public class structClient {
public static void main(String args[]) {
// ORBの前処理
// オブジェクトリファレンスの獲得
:
try {
// 固定長構造体
// inパラメタ用変数
int in_fix_para1 = 3;
int in_fix_para2 = 10;
samplefix in_fix = new samplefix( in_fix_para1,
in_fix_para2 );
// outパラメタ用変数
samplefixHolder outHolder_fix = new samplefixHolder();
// inoutパラメタ用変数
int inout_fix_para1 = 20;
int inout_fix_para2 = 50;
samplefix inout_fix_tmp = new samplefix(inout_fix_para1,
inout_fix_para2);
samplefixHolder inoutHolder_fix =
new samplefixHolder( inout_fix_tmp );
// 復帰値用変数
samplefix ret_fix;
// サーバアプリケーションのメソッド呼出し
ret_fix = target.op2( in_fix, outHolder_fix, inoutHolder_fix );
// メソッドの結果表示
// 復帰値の表示
System.out.println( ret_fix.para1 );
System.out.println( ret_fix.para2 );
// outパラメタの表示
System.out.println( outHolder_fix.value.para1 );
System.out.println( outHolder_fix.value.para2 );
// inoutパラメタの表示
System.out.println( inoutHolder_fix.value.para1 );
System.out.println( inoutHolder_fix.value.para2 );
// 可変長構造体
// inパラメタ用変数
int in_var_para1 = 3;
String in_var_para2 = "test";
samplevar in_var = new samplevar( in_var_para1,
in_var_para2 );
// outパラメタ用変数
samplevarHolder outHolder_var = new samplevarHolder();
// inoutパラメタ用変数
int inout_var_para1 = 20;
String inout_var_para2 = "dummy";
samplevar inout_var_tmp = new samplevar(inout_var_para1,
inout_var_para2);
samplevarHolder inoutHolder_var =
new samplevarHolder( inout_var_tmp );
// 復帰値用変数
samplevar ret_var;
// サーバアプリケーションのメソッド呼出し
ret_var = target.op1( in_var, outHolder_var, inoutHolder_var );
// メソッドの結果表示
// 復帰値の表示
System.out.println( ret_var.para1 );
System.out.println( ret_var.para2 );
// outパラメタの表示
System.out.println( outHolder_var.value.para1 );
System.out.println( outHolder_var.value.para2 );
// inoutパラメタの表示
System.out.println( inoutHolder_var.value.para1 );
System.out.println( inoutHolder_var.value.para2 );
}
catch (java.lang.Exception e) {
//エラー処理
:
}
}
}(3)サーバアプリケーションでの処理
inout、outパラメタにデータを代入するには、inout、outのHolderクラスのvalueに設定します。
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import ODsample.*;
// Servantクラス
// サーバアプリケーションのメソッド
class structServant extends structtestPOA {
// 固定長構造体
public samplefix op2( samplefix in_fix,
samplefixHolder outHolder_fix,
samplefixHolder inoutHolder_fix ) {
// 入力パラメタの表示
// inパラメタの表示
System.out.println( in_fix.para1 );
System.out.println( in_fix.para2 );
// inoutパラメタの表示
System.out.println( inoutHolder_fix.value.para1 );
System.out.println( inoutHolder_fix.value.para2 );
// 出力パラメタの設定
// outパラメタの設定
int out_fix_para1 = 123;
int out_fix_para2 = 456;
samplefix out_fix_tmp =
new samplefix( out_fix_para1, out_fix_para2 );
outHolder_fix.value = out_fix_tmp;
// inoutパラメタの設定
inoutHolder_fix.value.para1 = inoutHolder_fix.value.para1 * 10;
inoutHolder_fix.value.para2 = inoutHolder_fix.value.para2 * 10;
// 復帰の設定
int ret_fix_para1 = 333;
int ret_fix_para2 = 777;
samplefix ret_fix = new samplefix( ret_fix_para1, ret_fix_para2 );
// 復帰
return( ret_fix );
}
// 可変長構造体
public samplevar op1( samplevar in_var,
samplevarHolder outHolder_var,
samplevarHolder inoutHolder_var ) {
// 入力パラメタの表示
// inパラメタの表示
System.out.println( in_var.para1 );
System.out.println( in_var.para2 );
// inoutパラメタの表示
System.out.println( inoutHolder_var.value.para1 );
System.out.println( inoutHolder_var.value.para2 );
// 出力パラメタの設定
// outパラメタの設定
int out_var_para1 = 11111;
String out_var_para2 = "out-str";
samplevar out_var_tmp =
new samplevar( out_var_para1, out_var_para2 );
outHolder_var.value = out_var_tmp;
// inoutパラメタの設定
inoutHolder_var.value.para1 = inoutHolder_var.value.para1 + 2000;
inoutHolder_var.value.para2 =
inoutHolder_var.value.para2 + "-inout-str";
// 復帰の設定
int ret_var_para1 = 0;
String ret_var_para2 = "return-str";
samplevar ret_var =
new samplevar( ret_var_para1, ret_var_para2 );
// 復帰
return( ret_var );
}
}
public class structServer {
public static void main(String args[]) {
try {
// ORBの前処理
:
// POAオブジェクトの生成
:
// Servantの生成とそのPOAへの登録
:
// POAManagerの活性化
:
}
catch (java.lang.Exception e) {
//エラー処理
:
}
}
}