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

5.17.7 構造体

(1)IDLマッピング

IDL言語で構造体structを指定した場合、Java言語ではstructクラス、structHolderクラス、およびstructHelperクラスになります。
structクラス名は、IDLで定義した構造体名になります。本クラスは、inパラメタおよび復帰値を扱う場合に使用します。
structクラスで定義されているメンバの意味を以下の表に示します。


structクラスのメンバ

意味

デフォルトコンストラクタ

何もしません。

コンストラクタ

指定されたパラメタをインスタンスメンバに設定します。


structHolderクラス名は、以下のようにIDLで定義した構造体名+Holderになります。本クラスは、out/inoutパラメタを扱う場合に使用します。


<structHolderクラス>

[package <packageName>;]
final public class <struct_class>Holder implements
                       org.omg.CORBA.portable.Streamable {
    public [<packageName>.]<struct_class>  value; 
    public <struct_class>Holder() {}
    public <struct_class>Holder([<packageName>.]<struct_class> 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() {...}
}

structHolderクラスで定義されているメンバの意味を以下の表に示します。


structHolderクラスのメンバ

意味

デフォルトコンストラクタ

valueメンバへの設定なしで、インスタンスを生成するために使用します。

コンストラクタ

valueメンバに指定されたパラメタを設定します。

_read()

要素の値を読み込みます。

_write()

要素の値を書き込みます。

_type()

TypeCodeを取り出します。


structHelperクラス名は、以下のようにIDLで定義した構造体名+Helperになります。
Helperクラスは、ユーザ定義型のデータのデータストリームへの書き込み、データストリームからのユーザ定義型のデータの取り出し、ユーザ定義型のTypeCode,リポジトリIDの参照などの機能を提供します。


<structHelperクラス>

[package <packageName>;]
public class <struct_class>Helper {
    public static void 
        insert(org.omg.CORBA.Any a, <packageName>.<struct_class>  value){...} 
    public static <packageName>.<struct_class>  
        extract(org.omg.CORBA.Any a){...} 
    public static org.omg.CORBA.TypeCode
        type(){...}
    public static String  
        id(){...}
    public static <packageName>.<struct_class>  
        read(org.omg.CORBA.portable.InputStream istream){...} 
    public static void
        write(org.omg.CORBA.portable.OutputStream ostream, 
              <packageName>.<struct_class>  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(){...}
}

structHelperクラス中で定義されているメンバの意味を以下の表に示します。


structHelperクラスのメンバ

意味

insert()

要素の値を挿入します。

extract()

要素の値を取り出します。

type()

TypeCodeを取り出します。

id()

リポジトリIDを返します。


IDL言語での定義が以下のように定義されていた場合について、アプリケーションプログラムの例を示します。


IDL言語】

module ODsample{
    struct samplefix {      // 構造体(固定長) 
        long    para1; 
        long    para2; 
    };
    struct samplevar {      // 構造体(可変長) 
        long    para1; 
        string  para2; 
    };
    interface   structtest{
        samplefix   op2(
            in samplefix str1, 
            out samplefix str2, 
            inout samplefix str3 ); 
        samplevar   op1(
            in samplevar str1, 
            out samplevar str2, 
            inout samplevar str3 ); 
    };
};

これをJava言語で記述すると、以下のようになります。


Java言語】

<インタフェース>

package ODsample; 
public interface structtestOperations {
    public ODsample.samplefix op2(ODsample.samplefix str1, 
                                  ODsample.samplefixHolder str2, 
                                  ODsample.samplefixHolder str3 ); 
    public ODsample.samplevar op1(ODsample.samplevar str1, 
                                  ODsample.samplevarHolder str2, 
                                  ODsample.samplevarHolder str3 ); 
}

<structクラス>

package ODsample; 
final public class samplefix
    implements org.omg.CORBA.portable.IDLEntity
{
    public int para1; 
    public int para2; 
    public samplefix() {}
    public samplefix(int para1, int para2) {...}
}

package ODsample; 
final public class samplevar
    implements org.omg.CORBA.portable.IDLEntity
{
    public int para1; 
    public java.lang.String para2; 
    public samplevar() {}
    public samplevar( int para1, java.lang.String para2) {...}
}

<structHolderクラス>

package ODsample; 
public class samplefixHolder
      implements org.omg.CORBA.portable.Streamable {
    public ODsample.samplefix value; 
    public samplefixHolder()  {}
    public samplefixHolder(ODsample.samplefix 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() {...}
}

package ODsample; 
public class samplevarHolder
        implements org.omg.CORBA.portable.Streamable {
    public ODsample.samplevar value; 
    public samplevarHolder()  {}
    public samplevarHolder(ODsample.samplevar 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() {...}
}

<structHelperクラス>

package ODsample; 
public class samplefixHelper
{
    public static void
        insert(org.omg.CORBA.Any a, ODsample.samplefix value){...} 
    public static ODsample.samplefix
        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 ODsample.samplefix
       read(org.omg.CORBA.portable.InputStream istream){...} 
    public static void
       write(org.omg.CORBA.portable.OutputStream ostream, ODsample.samplefix value){...} 
}

package ODsample; 
public class samplevarHelper
{
    public static void
        insert(org.omg.CORBA.Any a, ODsample.samplevar value){...} 
    public static ODsample.samplevar
        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 ODsample.samplevar
        read(org.omg.CORBA.portable.InputStream istream){...} 
    public static void
        write(org.omg.CORBA.portable.OutputStream ostream, ODsample.samplevar value){...} 
}

(2)クライアントアプリケーションでの処理

inパラメタのstruct型のデータ領域は、newを使用して獲得します。inout/outパラメタの場合は、structHolderクラスを使用してデータ領域を割り当てます。
クライアントアプリケーションは、in/inoutパラメタの入力値として、structクラスのインスタンスのメンバに値を設定します。inoutパラメタでは、作成したstructクラスのインスタンスをstructHolderクラスのメンバに設定します。
inout/outパラメタの出力値を参照するには、structHolderクラスのインスタンスのvalueを参照します。


import org.omg.CORBA.*; 
import ODsample.*; 

public class structClient {
    public static void main(String args[]) {
        // ORBの前処理
        // オブジェクトリファレンスの獲得
             :
        try {

            // 固定長構造体

            // inパラメタ用変数
            int        in_fix_para1 = 3; 
            int        in_fix_para2 = 10; 
            samplefix  in_fix       = new samplefix( in_fix_para1, in_fix_para2 ); 

            // outパラメタ用変数
            samplefixHolder outHolder_fix = new samplefixHolder();

            // inoutパラメタ用変数
            int        inout_fix_para1 = 20; 
            int        inout_fix_para2 = 50; 
            samplefix  inout_fix_tmp   = new samplefix(inout_fix_para1, inout_fix_para2); 
            samplefixHolder inoutHolder_fix = new samplefixHolder( inout_fix_tmp ); 

            // 復帰値用変数
            samplefix  ret_fix; 

            // サーバアプリケーションのメソッド呼出し
            ret_fix = target.op2( in_fix, outHolder_fix, inoutHolder_fix ); 

            // メソッドの結果表示
            // 復帰値の表示
            System.out.println( ret_fix.para1 ); 
            System.out.println( ret_fix.para2 ); 

            // outパラメタの表示
            System.out.println( outHolder_fix.value.para1 ); 
            System.out.println( outHolder_fix.value.para2 ); 

            // inoutパラメタの表示
            System.out.println( inoutHolder_fix.value.para1 ); 
            System.out.println( inoutHolder_fix.value.para2 ); 

            // 可変長構造体

            // inパラメタ用変数
            int        in_var_para1 = 3; 
            String     in_var_para2 = "test";
            samplevar  in_var       = new samplevar( in_var_para1, in_var_para2 ); 

            // outパラメタ用変数
            samplevarHolder outHolder_var = new samplevarHolder();

            // inoutパラメタ用変数
            int        inout_var_para1 = 20; 
            String     inout_var_para2 = "dummy";
            samplevar  inout_var_tmp   = new samplevar(inout_var_para1, inout_var_para2); 

            samplevarHolder inoutHolder_var = new samplevarHolder( inout_var_tmp ); 

            // 復帰値用変数
            samplevar  ret_var; 

            // サーバアプリケーションのメソッド呼出し
            ret_var = target.op1( in_var, outHolder_var, inoutHolder_var ); 

            // メソッドの結果表示 
            // 復帰値の表示
            System.out.println( ret_var.para1 ); 
            System.out.println( ret_var.para2 ); 

            // outパラメタの表示
            System.out.println( outHolder_var.value.para1 ); 
            System.out.println( outHolder_var.value.para2 ); 

           // inoutパラメタの表示
           System.out.println( inoutHolder_var.value.para1 ); 
           System.out.println( inoutHolder_var.value.para2 ); 
        }
        catch (java.lang.Exception e) {
            // エラー処理
                :
        }
    }
}

(3)サーバアプリケーションでの処理

inout/outパラメタにデータを代入するには、inout/outのHolderクラスのvalueに設定します。


import org.omg.CORBA.*; 
import org.omg.PortableServer.*; 
import ODsample.*; 

// Servantクラス
// サーバアプリケーションのメソッド
class structServant extends structtestPOA {

    // 固定長構造体
    public samplefix op2( samplefix in_fix, 
                          samplefixHolder outHolder_fix, 
                          samplefixHolder inoutHolder_fix ) {
        // 入力パラメタの表示
        // inパラメタの表示
        System.out.println( in_fix.para1 ); 
        System.out.println( in_fix.para2 ); 

        // inoutパラメタの表示
        System.out.println( inoutHolder_fix.value.para1 ); 
        System.out.println( inoutHolder_fix.value.para2 ); 

        // 出力パラメタの設定
        // outパラメタの設定
        int        out_fix_para1 = 123; 
        int        out_fix_para2 = 456; 
        samplefix  out_fix_tmp   = new samplefix( out_fix_para1, out_fix_para2 ); 
        outHolder_fix.value      = out_fix_tmp; 

        // inoutパラメタの設定
        inoutHolder_fix.value.para1 = inoutHolder_fix.value.para1 * 10; 
        inoutHolder_fix.value.para2 = inoutHolder_fix.value.para2 * 10; 

        // 復帰の設定
        int        ret_fix_para1 = 333; 
        int        ret_fix_para2 = 777; 
        samplefix  ret_fix       = new samplefix( ret_fix_para1, ret_fix_para2 ); 

        // 復帰
        return( ret_fix ); 
    }

    // 可変長構造体
    public samplevar op1( samplevar in_var, 
                          samplevarHolder outHolder_var, 
                          samplevarHolder inoutHolder_var ) {
        // 入力パラメタの表示
        // inパラメタの表示
        System.out.println( in_var.para1 ); 
        System.out.println( in_var.para2 ); 

        // inoutパラメタの表示
        System.out.println( inoutHolder_var.value.para1 ); 
        System.out.println( inoutHolder_var.value.para2 ); 

        // 出力パラメタの設定
        // outパラメタの設定
        int        out_var_para1 = 11111; 
        String     out_var_para2 = "out-str";
        samplevar  out_var_tmp   = new samplevar( out_var_para1, out_var_para2 ); 
        outHolder_var.value      = out_var_tmp; 

        // inoutパラメタの設定
        inoutHolder_var.value.para1 = inoutHolder_var.value.para1 + 2000; 
        inoutHolder_var.value.para2 = inoutHolder_var.value.para2 + "-inout-str";

        // 復帰の設定
        int        ret_var_para1 = 0; 
        String     ret_var_para2 = "return-str";
        samplevar  ret_var       = new samplevar( ret_var_para1, ret_var_para2 ); 

        // 復帰
        return( ret_var ); 
    }
}

public class structServer {
    public static void main(String args[]) {
        try {
             // ORBの前処理
                :
             // POAオブジェクトの生成
                :
             // Servantの生成とそのPOAへの登録
                :
             // POAManagerの活性化
                :
        }
        catch (java.lang.Exception e) {
            // エラー処理
                :
        }
    }
}