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

5.20.8 共用体

(1)IDLマッピング

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


unionクラスのメンバ

意味

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

何もしません。

弁別子へのアクセスメソッド

弁別子へのアクセスメソッド名は、discriminatorになります。

メンバへの設定メソッド

メンバへの設定メソッド名は、メンバ名になります。

メンバの参照メソッド

メンバの参照メソッド名は、メンバ名になります。


unionHolderクラス名は、IDLで定義した共用体名+Holderになります。本クラスは、out/inoutパラメタを扱う場合に使用します。


<unionHolderクラス>

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

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


unionHolderクラスのメンバ

意味

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

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

コンストラクタ

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

_read()

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

_write()

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

_type()

TypeCodeを取り出します。


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


<unionHelperクラス>

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

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


unionHelperクラスのメンバ

意味

insert()

要素の値を挿入します。

extract()

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

type()

TypeCodeを取り出します。

id()

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


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


IDL言語】

module ODsample{
    union samplefix switch(long){       // 共用体(固定長) 
        case 1: long    para1; 
        case 2: long    para2; 
    };
    union samplevar switch(long){       // 共用体(可変長) 
        case 1: long    para1; 
        case 2: string  para2; 
    };
    interface uniontest{
        samplefix  op2(
            in samplefix uni1, 
            out samplefix uni2, 
            inout samplefix uni3
        ); 
        samplevar  op1(
            in samplevar uni1, 
            out samplevar uni2, 
            inout samplevar uni3
        ); 
    };
};

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


Java言語】

<インタフェース>

package ODsample;
public interface uniontestOperations {
    public ODsample.samplefix op2(ODsample.samplefix uni1, 
                                  ODsample.samplefixHolder uni2, 
                                  ODsample.samplefixHolder uni3 ); 
    public ODsample.samplevar op1(ODsample.samplevar uni1, 
                                  ODsample.samplevarHolder uni2, 
                                  ODsample.samplevarHolder uni3 ); 
}

<unionクラス>

package ODsample; 
final public class samplefix 
    implements org.omg.CORBA.portable.IDLEntity
{
    private int _discriminator; 
    private java.lang.Object value; 
    public samplefix() {}
    public int discriminator(){...}
    public int para1()
        throws org.omg.CORBA.BAD_OPERATION{...}
    public void para1( int value ){...} 
    public int para2()
        throws org.omg.CORBA.BAD_OPERATION{...}
    public void para2( int value ){...} 
}

package ODsample; 
final public class samplevar 
    implements org.omg.CORBA.portable.IDLEntity
{
    private int _discriminator; 
    private java.lang.Object value; 
    public samplevar() {}
    public int discriminator(){...}
    public int para1()
        throws org.omg.CORBA.BAD_OPERATION{...}
    public void para1( int value ){...} 
    public java.lang.String para2()
        throws org.omg.CORBA.BAD_OPERATION{...}
    public void para2( java.lang.String value ){...} 
}

<unionHolderクラス>

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() {...}
}

<unionHelperクラス>

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パラメタのunion型のデータ領域は、newを使用して獲得します。inout/outパラメタの場合は、unionHolderクラスを使用してデータ領域を割り当てます。unionデータの参照/設定は、メンバ参照関数、弁別子アクセス関数を使用します。


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

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

            // inパラメタ用変数
            samplefix  in_fix   = new samplefix();
            in_fix.para1( 100 ); // 共用型変数をpara1の型で初期化

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

            // inoutパラメタ用変数
            samplefix  inout_fix_tmp = new samplefix();
            inout_fix_tmp.para1( 200 ); // 共用型変数をpara2の型で初期化
            samplefixHolder inoutHolder_fix =  new samplefixHolder(inout_fix_tmp); 

            // 復帰値用変数
            samplefix ret_fix; 

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

            // メソッドの結果表示 
            // 復帰値の表示
            switch( ret_fix.discriminator() ) {
                case 1: 
                    System.out.println( ret_fix.para1() ); 
                    break; 
                case 2: 
                    System.out.println( ret_fix.para2() ); 
                    break; 
            }

            // outパラメタの表示
            switch( outHolder_fix.value.discriminator() ) {
                case 1: 
                    System.out.println( outHolder_fix.value.para1() ); 
                    break; 
                case 2: 
                    System.out.println( outHolder_fix.value.para2() ); 
                    break; 
            }

            // inoutパラメタの表示
            switch( inoutHolder_fix.value.discriminator() ) {
                case 1: 
                    System.out.println( inoutHolder_fix.value.para1() ); 
                    break; 
                case 2: 
                    System.out.println( inoutHolder_fix.value.para2() ); 
                    break; 
            }

            // 可変長構造体

            // inパラメタ用変数
           samplevar  in_var   = new samplevar();
           in_var.para1( 500 ); // 共用型変数をpara1の型で初期化

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

           // inoutパラメタ用変数
           samplevar  inout_var_tmp = new samplevar();
           inout_var_tmp.para1( 200 ); // 共用型変数をpara2の型で初期化
           samplevarHolder inoutHolder_var =  new samplevarHolder(inout_var_tmp); 

           // 復帰値用変数
           samplevar ret_var; 

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

           // メソッドの結果表示 
           // 復帰値の表示
           switch( ret_var.discriminator() ) {
               case 1: 
                   System.out.println( ret_var.para1() ); 
                   break; 
               case 2: 
                   System.out.println( ret_var.para2() ); 
                   break; 
           }

           // outパラメタの表示
           switch( outHolder_var.value.discriminator() ) {
               case 1: 
                   System.out.println( outHolder_var.value.para1() ); 
                   break; 
               case 2: 
                   System.out.println( outHolder_var.value.para2() ); 
                   break; 
           }

           // inoutパラメタの表示
           switch( inoutHolder_var.value.discriminator() ) {
               case 1: 
                   System.out.println( inoutHolder_var.value.para1() ); 
                   break; 
               case 2: 
                   System.out.println( inoutHolder_var.value.para2() ); 
                   break; 
           }

        }
        catch (java.lang.Exception e) {
            // エラー処理
                  :
        }
    }
}

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

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


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

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

    public samplefix op2( samplefix in_fix, 
                          samplefixHolder outHolder_fix, 
                          samplefixHolder inoutHolder_fix ) {
        // 入力パラメタの表示
        // inパラメタの表示
        switch( in_fix.discriminator() ) 
        {
        case 1: 
            System.out.println( in_fix.para1() ); 
            break; 
        case 2: 
            System.out.println( in_fix.para2() ); 
            break; 
        }

        // inoutパラメタの表示と設定
        switch( inoutHolder_fix.value.discriminator() ) 
        {
        case 1: 
            System.out.println( inoutHolder_fix.value.para1() ); 

            // 共用型変数をpara1の型からpara2の型に変更
            inoutHolder_fix.value.para2( inoutHolder_fix.value.para1() * 100 ); 
            break; 
        case 2: 
            System.out.println( inoutHolder_fix.value.para2() ); 

            // 共用型変数をpara2の型からpara1の型に変更
            inoutHolder_fix.value.para1( inoutHolder_fix.value.para2() * 100 ); 
            break; 
        }

        // 出力パラメタの設定
        // outパラメタの設定
        samplefix  out_fix_tmp = new samplefix();
        out_fix_tmp.para2( 999 ); // 共用型変数をpara2の型で初期化
        outHolder_fix.value = out_fix_tmp; 

        // 復帰の設定
        samplefix  ret_fix   = new samplefix();
        ret_fix.para1( 0 );   // 共用型変数をpara1の型で初期化

        // 復帰
        return( ret_fix ); 
    }

    public samplevar op1( samplevar in_var, 
                          samplevarHolder outHolder_var, 
                          samplevarHolder inoutHolder_var ) {
        // 入力パラメタの表示
        // inパラメタの表示
        switch( in_var.discriminator() ) 
        {
        case 1: 
            System.out.println( in_var.para1() ); 
            break; 
        case 2: 
            System.out.println( in_var.para2() ); 
            break; 
        }

        // inoutパラメタの表示と設定
        switch( inoutHolder_var.value.discriminator() ) 
        {
        case 1: 
            System.out.println( inoutHolder_var.value.para1() ); 

            // 共用型変数をpara1の型からpara2の型に変更
            inoutHolder_var.value.para2( "inout-str-add-ret" ); 
            break; 
        case 2: 
            System.out.println( inoutHolder_var.value.para2() ); 

            // 共用型変数をpara2の型からpara1の型に変更
            inoutHolder_var.value.para1( 5000 ); 
            break; 
        }

        // 出力パラメタの設定
        // outパラメタの設定
        samplevar  out_var_tmp = new samplevar();
        out_var_tmp.para2( "out-str" ); // 共用型変数をpara2の型で初期化
        outHolder_var.value = out_var_tmp; 

        // 復帰の設定
        samplevar  ret_var   = new samplevar();
        ret_var.para2( "ret-str" );   // 共用型変数をpara1の型で初期化

        // 復帰
        return( ret_var ); 
    }
}

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