(1)IDLマッピング
IDL言語で配列を定義した場合、Java言語では、要素の型に対応するデータ型の配列、および配列名Holderクラスと配列名Helperクラスになります。
データ型の配列は、inパラメタおよび復帰値を扱う場合に使用します。
配列名Holderクラス名は、IDLで定義した配列名+Holderになります。本クラスは、out、inoutパラメタを扱う場合に使用します。
<配列名Holderクラス>
[package <packageName>;]
final public class <array_class>Holder
implements org.omg.CORBA.portable.Streamable {
public < array _element_type>[] value;
public < array _class>Holder() {};
public < array _class>Holder(<array _element_type>[] 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() {...}
}配列名Holderクラスで定義されているメンバの意味を以下の表に示します。
配列名Holderクラスのメンバ | 意味 |
|---|---|
デフォルトコンストラクタ | valueメンバへの設定なしで、インスタンスを生成するために使用します。 |
コンストラクタ | 指定されたパラメタをvalueメンバに設定します。 |
_read() | 要素の値を読み込みます。 |
_write() | 要素の値を書き込みます。 |
_type() | TypeCodeを取り出します。 |
配列名Helperクラス名は、以下のようにIDLで定義した配列名+Helperになります。
Helperクラスは、ユーザ定義型のデータのデータストリームへの書き込み、データストリームからのユーザ定義型のデータの取り出し、ユーザ定義型のTypeCode,リポジトリIDの参照などの機能を提供します。
<配列名Helperクラス>
[package <packageName>;]
public class <array_class>Helper
{
public static void
insert(org.omg.CORBA.Any a, <array _element_type>[] value){...}
public static <array _element_type>[]
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 <array _element_type>[]
read( org.omg.CORBA.portable.InputStream istream ){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
<array _element_type>[] value)
throws org.omg.CORBA.MARSHAL{...}
}配列名Helperクラス中で定義されているメンバの意味を以下の表に示します。
配列名Helperクラスのメンバ | 意味 |
|---|---|
insert() | 要素の値を挿入します。 |
extract() | 要素の値を取り出します。 |
type() | TypeCodeを取り出します。 |
id() | リポジトリIDを返します。 |
IDL言語での定義が以下のように定義されていた場合について、アプリケーションプログラムの例を示します。
【IDL言語】
module ODsample{
interface arraytest{
typedef long fix[4][3][2];
typedef string str[2][3][4];
fix op1( in fix para1, out fix para2, inout fix para3 );
str op2( in str para1, out str para2, inout str para3 );
};
};これをJava言語で記述すると、以下のようになります。
【Java言語】
<インタフェース>
package ODsample;
public interface arraytestOperations {
public int[][][] op1(int[][][] para1,
ODsample.arraytestPackage.fixHolder para2,
ODsample.arraytestPackage.fixHolder para3 );
public java.lang.String[][][] op2(java.lang.String[][][] para1,
ODsample.arraytestPackage.strHolder para2,
ODsample.arraytestPackage.strHolder para3 );
}<配列名Holderクラス>
package ODsample.arraytestPackage;
public final class fixHolder implements org.omg.CORBA.portable.Streamable {
public int[][][] value;
public fixHolder() {}
public fixHolder(int[][][] value) {...}
public void _read (org.omg.CORBA.portable.InputStream istream) {...}
public void _write (org.omg.CORBA.portable.OutputStream ostream) {...}
public org.omg.CORBA.TypeCode _type () {...}
}
package ODsample.arraytestPackage;
public final class strHolder implements org.omg.CORBA.portable.Streamable {
public java.lang.String[][][] value;
public strHolder() {}
public strHolder(java.lang.String[][][] value) {...}
public void _read (org.omg.CORBA.portable.InputStream istream) {...}
public void _write (org.omg.CORBA.portable.OutputStream ostream) {...}
public org.omg.CORBA.TypeCode _type () {...}
}<配列名Helperクラス>
package ODsample.arraytestPackage;
public class fixHelper
{
public static void
insert(org.omg.CORBA.Any a, int[][][] value){...}
public static int[][][]
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 int[][][]
read( org.omg.CORBA.portable.InputStream istream ){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
int[][][] value) throws org.omg.CORBA.MARSHAL{...}
}
package ODsample.arraytestPackage;
public class strHelper
{
public static void
insert(org.omg.CORBA.Any a, java.lang.String[][][] value){...}
public static java.lang.String[][][]
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 java.lang.String[][][]
read( org.omg.CORBA.portable.InputStream istream ){...}
public static void
write(org.omg.CORBA.portable.OutputStream ostream,
java.lang.String[][][] value)
throws org.omg.CORBA.MARSHAL{...}
}(2)クライアントアプリケーションでの処理
inパラメタの配列型のデータ領域は、newを使用して獲得します。inout、outパラメタの場合は、配列名Holderクラスを使用してデータ領域を割り当てます。inout、outパラメタを参照するには、インスタンスデータのvalueを参照します。
import org.omg.CORBA.*;
import ODsample.*;
public class arrayClient {
public static void main(String args[]) {
// ORBの前処理
// オブジェクトリファレンスの獲得
:
try{
int i, j, k;
// int型配列
// inパラメタ用変数
int[][][] in_fix = new int[4][3][2];
for( i = 0; i < in_fix.length; i++ )
for( j = 0; j < in_fix[i].length; j++ )
for( k = 0; k < in_fix[i][j].length; k++ )
in_fix[i][j][k] = i + j + k;
// outパラメタ用変数
ODsample.arraytestPackage.fixHolder outHolder_fix =
new ODsample.arraytestPackage.fixHolder();
// inoutパラメタ用変数
int[][][] inout_fix_tmp = new int[4][3][2];
for( i = 0; i < inout_fix_tmp.length; i++ )
for( j = 0; j < inout_fix_tmp[i].length; j++ )
for( k = 0; k < inout_fix_tmp[i][j].length; k++ )
inout_fix_tmp[i][j][k] = i + j + k + 1;
ODsample.arraytestPackage.fixHolder inoutHolder_fix =
new ODsample.arraytestPackage.fixHolder( inout_fix_tmp );
// 復帰値用変数
int[][][] ret_fix;
// サーバアプリケーションのメソッド呼出し
ret_fix = target.op1( in_fix, outHolder_fix, inoutHolder_fix );
// メソッドの結果表示
// 復帰値の表示
for( i = 0; i < ret_fix.length; i++ )
for( j = 0; j < ret_fix[i].length; j++ )
for( k = 0; k < ret_fix[i][j].length; k++ )
System.out.println( "ret_fix[" + i + "][" + j + "][" + k + "]="
+ ret_fix[i][j][k] );
// outパラメタの表示
for( i = 0; i < outHolder_fix.value.length; i++ )
for( j = 0; j < outHolder_fix.value[i].length; j++ )
for( k = 0; k < outHolder_fix.value[i][j].length; k++ )
System.out.println(
"outHolder_fix.value[" + i + "][" + j + "][" + k + "]="
+ outHolder_fix.value[i][j][k] );
// inoutパラメタの表示
for( i = 0; i < inoutHolder_fix.value.length; i++ )
for( j = 0; j < inoutHolder_fix.value[i].length; j++ )
for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ )
System.out.println(
"inoutHolder_fix.value[" + i + "][" + j + "][" + k + "]="
+ inoutHolder_fix.value[i][j][k] );
// String型配列
// inパラメタ用変数
String[][][] in_str = new String[2][3][4];
for( i = 0; i < in_str.length; i++ )
for( j = 0; j < in_str[i].length; j++ )
for( k = 0; k < in_str[i][j].length; k++ )
in_str[i][j][k] = "indata" + i + j + k;
// outパラメタ用変数
ODsample.arraytestPackage.strHolder outHolder_str =
new ODsample.arraytestPackage.strHolder();
// inoutパラメタ用変数
String[][][] inout_str_tmp = new String[2][3][4];
for( i = 0; i < inout_str_tmp.length; i++ )
for( j = 0; j < inout_str_tmp[i].length; j++ )
for( k = 0; k < inout_str_tmp[i][j].length; k++ )
inout_str_tmp[i][j][k] = "inoutdata" + i + j + k + "snd";
ODsample.arraytestPackage.strHolder inoutHolder_str =
new ODsample.arraytestPackage.strHolder( inout_str_tmp );
// 復帰値用変数
String[][][] ret_str;
// サーバアプリケーションのメソッド呼出し
ret_str = target.op2( in_str, outHolder_str, inoutHolder_str );
// メソッドの結果表示
// 復帰値の表示
for( i = 0; i < ret_str.length; i++ )
for( j = 0; j < ret_str[i].length; j++ )
for( k = 0; k < ret_str[i][j].length; k++ )
System.out.println(
"ret_str[" + i + "][" + j + "][" + k + "]=" + ret_str[i][j][k] );
// outパラメタの表示
for( i = 0; i < outHolder_str.value.length; i++ )
for( j = 0; j < outHolder_str.value[i].length; j++ )
for( k = 0; k < outHolder_str.value[i][j].length; k++ )
System.out.println(
"outHolder_str.value[" + i + "][" + j + "][" + k + "]="
+ outHolder_str.value[i][j][k] );
// inoutパラメタの表示
for( i = 0; i < inoutHolder_str.value.length; i++ )
for( j = 0; j < inoutHolder_str.value[i].length; j++ )
for( k = 0; k < inoutHolder_str.value[i][j].length; k++ )
System.out.println(
"inoutHolder_str.value[" + i + "][" + j + "][" + k + "]="
+ inoutHolder_str.value[i][j][k] );
}
catch ( java.lang.Exception e ) {
//エラー処理
:
}
}
}(3)サーバアプリケーションでの処理
inout、outパラメタにデータを代入する場合、inout、outのHolderクラスのvalueに設定します。
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import ODsample.*;
// Servantクラス
// サーバアプリケーションのメソッド
class arrayServant extends arraytestPOA {
public int[][][] op1( int[][][] in_fix,
ODsample.arraytestPackage.fixHolder outHolder_fix,
ODsample.arraytestPackage.fixHolder inoutHolder_fix )
{
int i, j, k;
// 入力パラメタの表示
// inパラメタの表示
for( i = 0; i < in_fix.length; i++ )
for( j = 0; j < in_fix[i].length; j++ )
for( k = 0; k < in_fix[i][j].length; k++ )
System.out.println(
"in_fix[" + i + "][" + j + "][" + k + "]=" + in_fix[i][j][k] );
// inoutパラメタの表示
for( i = 0; i < inoutHolder_fix.value.length; i++ )
for( j = 0; j < inoutHolder_fix.value[i].length; j++ )
for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ )
System.out.println(
"inoutHolder_fix.value[" + i + "][" + j + "][" + k + "]="
+ inoutHolder_fix.value[i][j][k] );
// 出力パラメタの設定
// outパラメタの設定
int[][][] out_fix_tmp = new int[4][3][2];
for( i = 0; i < out_fix_tmp.length; i++ )
for( j = 0; j < out_fix_tmp[i].length; j++ )
for( k = 0; k < out_fix_tmp[i][j].length; k++ )
out_fix_tmp[i][j][k] = ( i + j + k ) * 10;
outHolder_fix.value = out_fix_tmp;
// inoutパラメタの設定
for( i = 0; i < inoutHolder_fix.value.length; i++ )
for( j = 0; j < inoutHolder_fix.value[i].length; j++ )
for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ )
inoutHolder_fix.value[i][j][k] =
inoutHolder_fix.value[i][j][k] * 20;
// 復帰の設定
int[][][] ret_fix = new int[4][3][2];
for( i = 0; i < ret_fix.length; i++ )
for( j = 0; j < ret_fix[i].length; j++ )
for( k = 0; k < ret_fix[i][j].length; k++ )
ret_fix[i][j][k] = ( i + j + k ) * 100;
// 復帰
return( ret_fix );
}
public String[][][] op2( String[][][] in_str,
ODsample.arraytestPackage.strHolder outHolder_str,
ODsample.arraytestPackage.strHolder inoutHolder_str )
{
int i, j, k;
// 入力パラメタの表示
// inパラメタの表示
for( i = 0; i < in_str.length; i++ )
for( j = 0; j < in_str[i].length; j++ )
for( k = 0; k < in_str[i][j].length; k++ )
System.out.println(
"in_str[" + i + "][" + j + "][" + k + "]=" + in_str[i][j][k] );
// inoutパラメタの表示
for( i = 0; i < inoutHolder_str.value.length; i++ )
for( j = 0; j < inoutHolder_str.value[i].length; j++ )
for( k = 0; k < inoutHolder_str.value[i][j].length; k++ )
System.out.println(
"inoutHolder_str.value[" + i + "][" + j + "][" + k + "]="
+ inoutHolder_str.value[i][j][k] );
// 出力パラメタの設定
// outパラメタの設定
String[][][] out_str_tmp = new String[2][3][4];
for( i = 0; i < out_str_tmp.length; i++ )
for( j = 0; j < out_str_tmp[i].length; j++ )
for( k = 0; k < out_str_tmp[i][j].length; k++ )
out_str_tmp[i][j][k] = "outdata" + i + j + k;
outHolder_str.value = out_str_tmp;
// inoutパラメタの設定
for( i = 0; i < inoutHolder_str.value.length; i++ )
for( j = 0; j < inoutHolder_str.value[i].length; j++ )
for( k = 0; k < inoutHolder_str.value[i][j].length; k++ )
inoutHolder_str.value[i][j][k] =
inoutHolder_str.value[i][j][k] + "-rcv";
// 復帰の設定
String[][][] ret_str = new String[2][3][4];
for( i = 0; i < ret_str.length; i++ )
for( j = 0; j < ret_str[i].length; j++ )
for( k = 0; k < ret_str[i][j].length; k++ )
ret_str[i][j][k] = "retdata" + i + j + k;
// 復帰
return( ret_str );
}
}
public class arrayServer {
public static void main(String args[]) {
try {
// ORBの前処理
:
// POAオブジェクトの生成
:
// Servantの生成とそのPOAへの登録
:
// POAManagerの活性化
:
}
catch (java.lang.Exception e) {
//エラー処理
:
}
}
}