ページの先頭行へ戻る
Interstage Application Server V13.1.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

5.17.6 シーケンス型

(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メンバへの設定なしで、インスタンスを生成するために使用します。

コンストラクタ

valueメンバにパラメタで指定された値(sequence型データ)を設定します。

_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) {
            // エラー処理
                :
        }
    }
}