(1)IDLマッピング
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){...}
}(2)クライアントアプリケーションでの処理
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) {
//エラー処理
:
}
}
}(3)サーバアプリケーションでの処理
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) {
//エラー処理
:
}
}
}