Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第6章 アプリケーションの開発(Java言語) | > 6.18 データ型に対するマッピング |
IDL言語でシーケンス型sequenceを指定した場合、Java言語ではsequenceの要素の型に対応するデータ型の配列(データ型[ ])、およびsequenceHolderクラスとsequenceHelperクラスになります。
データ型の配列は、inパラメタおよび復帰値を扱う場合に使用します。
sequenceHolderクラス名は、以下のようにIDLで定義したシーケンス型名+Holderになります。本クラスは、out、inoutパラメタを扱う場合に使用します。
<sequenceHolderクラス>
[package <packageName>;] final public class <sequence_class>Holder implements org.omg.CORBA.portable.Streamable { public <sequence_element_type>[] value; public <sequence_class>Holder() {}; public <sequence_class>Holder(<sequence_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() {...} }
以下の表にsequenceHolderクラスで定義されているメンバの意味を示します。
sequenceHolderクラスのメンバ |
意味 |
デフォルトコンストラクタ |
valueメンバへの設定なしで、インスタンスを生成するために使用します。 |
コンストラクタ |
パラメタで指定された値(sequence型データ)をvalueメンバに設定します。 |
_read() |
要素の値を読み込みます。 |
_write() |
要素の値を書き込みます。 |
_type() |
TypeCodeを取り出します。 |
sequenceHeperクラス名は、以下のようにIDLで定義したシーケンス型名+Helperになります。
Helperクラスはユーザ定義型のデータのデータストリームへの書き込み、データストリームからのユーザ定義型のデータの取り出し、ユーザ定義型のTypeCode、リポジトリIDの参照等の機能を提供します。
<sequenceHelperクラス>
[package <packageName>;] public class <sequence_class>Helper { public static void insert(org.omg.CORBA.Any a, <sequence_element_type>[] value){...} public static <sequence_element_type>[] extract (org.omg.CORBA.Any a){...} public static org.omg.CORBA.TypeCode type(){...} public static String id(){...} public static int[] read(org.omg.CORBA.portable.InputStream istream){...} public static void write(org.omg.CORBA.portable.OutputStream ostream, int[] 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(){...} }
以下の表にseqenceHelperクラス中で定義されているメンバの意味を示します。
sequenceHelperクラスのメソッド |
意味 |
insert() |
要素の値を挿入します。 |
extract() |
要素の値を取り出します。 |
type() |
TypeCodeを取り出します。 |
id() |
リポジトリIDを返します。 |
IDL言語での定義が以下のように定義されていた場合について、アプリケーションプログラムの例を示します。
【IDL言語】
module ODsample{ interface seqtest{ typedef sequence<long> sampleseq; sampleseq op1(in sampleseq seq1, out sampleseq seq2, inout sampleseq seq3 ); }; };
これをJava言語で記述すると以下のようになります。
【Java言語】
<インタフェースクラス>
package ODsample; public interface seqtestOperations { public int[] op1(int[] seq1, ODsample.seqtestPackage.sampleseqHolder seq2, ODsample.seqtestPackage.sampleseqHolder seq3 ); }
<sequenceHolderクラス>
package ODsample.seqtestPackage; public class sampleseqHolder implements org.omg.CORBA.portable.Streamable { public int[] value; public sampleseqHolder() {} public sampleseqHolder(int[] 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() {...} }
<sequenceHelperクラス>
package ODsample.seqtestPackage; public class sampleseqHelper { 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(){...} 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){...} }
inパラメタのsequence型のデータ領域は、newを使用して獲得します。inout、outパラメタの場合はsequenceHolderクラスを使用してデータ領域を割り当てます。inoutパラメタのsequenceにデータを割り当てるには、コンストラクタのパラメタで必要な個数分指定することにより、sequenceのインスタンスデータvalueに領域が割り当てられます。そのvalueにデータを設定します。sequenceデータの参照は、インスタンスデータvalueを参照します。
import org.omg.CORBA.*; import ODsample.*; public class seqClient { public static void main(String args[]) { // ORBの前処理 // オブジェクトリファレンスの獲得 : try{ int i; // inパラメタ用変数 int in[] = new int[10]; for( i = 0; i < in.length; i++ ) in[i] = i; // outパラメタ用変数 ODsample.seqtestPackage.sampleseqHolder outHolder = new ODsample.seqtestPackage.sampleseqHolder(); // inoutパラメタ用変数 ODsample.seqtestPackage.sampleseqHolder inoutHolder = new ODsample.seqtestPackage.sampleseqHolder( new int[20] ); for( i = 0; i < inoutHolder.value.length; i++ ) inoutHolder.value[i] = i * 2; // 復帰値用変数 int result[]; // サーバアプリケーションのメソッド呼出し result = target.op1( in, outHolder, inoutHolder ); // メソッドの結果表示 // 復帰値の表示 for( i = 0; i < result.length; i++ ) System.out.println( "result[" + i + "]=" + result[i] ); // outパラメタの表示 for( i = 0; i < outHolder.value.length; i++ ) System.out.println( "outHolder.value[" + i + "]=" + outHolder.value[i] ); // inoutパラメタの表示 for( i = 0; i < inoutHolder.value.length; i++ ) System.out.println( "inoutHolder.value[" + i + "]=" + inoutHolder.value[i] ); } catch (java.lang.Exception e) { //エラー処理 : } } }
inout、outパラメタにデータを代入するには、inout、outのHolderクラスのvalueに設定します。
import org.omg.CORBA.*; import org.omg.PortableServer.*; import ODsample.*; // Servantクラス // サーバアプリケーションのメソッド class seqServant extends seqtestPOA { public int[] op1( int[] in, ODsample.seqtestPackage.sampleseqHolder outHolder, ODsample.seqtestPackage.sampleseqHolder inoutHolder ) { int i; // 入力パラメタの表示 // inパラメタの表示 for( i = 0; i < in.length; i++ ) System.out.println( "in[" + i + "]=" + in[i] ); // inoutパラメタの表示 for( i = 0; i < inoutHolder.value.length; i++ ) System.out.println( "inoutHolder.value[" + i + "]=" + inoutHolder.value[i] ); // 出力パラメタの設定 // outパラメタの設定 outHolder.value = new int[5]; for( i = 0; i < outHolder.value.length; i++ ) outHolder.value[i] = in[i] * 100; // inoutパラメタの設定 for( i = 0; i < inoutHolder.value.length; i++ ) inoutHolder.value[i] = inoutHolder.value[i] * 2; // 復帰の設定 int result[] = new int[5]; for( i = 0; i < result.length; i++ ) result[i] = in[i] + 100; // 復帰 return( result ); } } public class seqServer { public static void main(String args[]) { try { // ORBの前処理 : // POAオブジェクトの生成 : // Servantの生成とそのPOAへの登録 : // POAManagerの活性化 : } catch (java.lang.Exception e) { //エラー処理 : } } }
目次
索引
![]() ![]() |