Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第6章 アプリケーションの開発(Java言語) | > 6.18 データ型に対するマッピング |
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{...} }
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 ) { //エラー処理 : } } }
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) { //エラー処理 : } } }
目次
索引
![]() ![]() |