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

5.17.4 列挙型

(1)IDLマッピング

IDL言語で列挙型enumを指定した場合、Java言語では、enumクラス/enumHolderクラス/enumHelperクラスになります。
enumクラスには、以下のように要素を識別するためのメンバと、メンバにアクセスするためのメソッドが定義されています。本クラスは、inパラメタおよび復帰値を扱う場合に使用します。enumクラス名は、以下のようにIDLで定義したenum名(enumName)になります。


<enumクラス>

[package <packageName>]
public final class <enumName>{
    public static final int _<label_1> = <labelValue>;
    public static final <enumName> <label_1> = new <enumName>(_<label_1>);
         :
    public static final int _<label_n> = <label Value>;
    public static final <enumName> <label_n> = new <enumName>(_<label_n>);

    public int value() {...}
    public static <enumName> from_int(int value) {...}
    private <enumName>(int value) { }
}

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


enumクラスのメンバ

意味

value()

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

from_int()

要素の値を指定して、要素名を取り出します。


enumHolderクラスは、以下のようにIDLで定義したenum名+Holderとなります。本クラスは、outやinoutパラメタを受け渡す場合に使用します。


<enumHolderクラス>

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

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


enumHolderクラスのメンバ

意味

value

要素の値。

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

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

コンストラクタ

valueメンバにパラメタで指定された要素の値を設定します。

_read()

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

_write()

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

_type()

TypeCodeを取り出します。


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


<enumHelperクラス>

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

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


enumHelperクラスのメンバ

意味

insert()

要素の値を挿入します。

extract()

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

type()

TypeCodeを取り出します。

id()

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


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


IDL言語】

module ODsample{
    enum EnumType { a, b, c };

    interface  enumtest{
        EnumType op( in EnumType in_p, out EnumType out_p, inout EnumType io_p ); 
    };
};

これをJava言語にマッピングすると、以下のようになります。


Java言語】

<インタフェース>

package ODsample; 
public interface enumtestOperations {
    public ODsample.EnumType op(ODsample.EnumType in_p, 
                                ODsample.EnumTypeHolder out_p, 
                                ODsample.EnumTypeHolder io_p ); 
}

<enumクラス>

package ODsample; 
public final class EnumType
implements org.omg.CORBA.portable.IDLEntity
{
    public static final int _a = (int)0; 
    public static final EnumType a = new EnumType(_a); 
    public static final int _b = (int)1; 
    public static final EnumType b = new EnumType(_b); 
    public static final int _c = (int)2; 
    public static final EnumType c = new EnumType(_c); 
    public static final EnumType MAX_VALUE = new EnumType(Integer.MAX_VALUE); 
    public int value(){...}
    public static EnumType from_int(int i){...}
    private EnumType(int value){ }
}

<enumHolderクラス>

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

<enumHelperクラス>

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

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

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

public class enumClient {
    public static void main(String args[]) {
        // ORBの前処理
        // オブジェクトリファレンスの獲得
              :
        try{
            // inパラメタ用変数
            EnumType  in   = EnumType.a; 
            //outパラメタ用変数
            EnumTypeHolder outHolder = new EnumTypeHolder();
            // inoutパラメタ用変数
            EnumTypeHolder inoutHolder = new EnumTypeHolder( EnumType.b ); 
            // 復帰値用変数
            EnumType       result; 
            
            // サーバアプリケーションのメソッド呼出し
            result = target.op( in, outHolder, inoutHolder ); 
    
            // メソッドの結果表示 
            System.out.println( result.value() ); 
            System.out.println( outHolder.value.value() ); 
            System.out.println( inoutHolder.value.value() ); 
        }
        catch ( java.lang.Exception e ) {
            // エラー処理
                :
        }
    }
}

Java言語でinパラメタをサーバアプリケーションに受け渡す場合は、直接enumクラスのインスタンスにデータを設定します。また、out/inoutパラメタとしてサーバアプリケーションにパラメタを受け渡す場合は、new演算子を使用して各データ型のenumHolderクラスのインスタンスを生成します。inoutパラメタには、enumクラスのデータを設定します。
設定には、以下の2つの方法があります。


【デフォルトコンストラクタを使用した方法】

EnumTypeHolder a = new EnumTypeHolder();  // デフォルトコンストラクタ
a.value = EnumType.c;                     // データの代入

【コンストラクタを使用した方法】

EnumTypeHolder b = new EnumTypeHolder(EnumType.c);  // コンストラクタ

なお、サーバの処理結果は、out/inoutパラメタ、および復帰値の各インスタンスのvalueに値が設定されます。


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

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

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

    public EnumType op( EnumType in, 
                        EnumTypeHolder outHolder, 
                        EnumTypeHolder inoutHolder ) {
        // 入力パラメタの表示
        System.out.println( in.value() ); 
        System.out.println( inoutHolder.value.value() ); 

        // 出力パラメタの設定
        outHolder.value = EnumType.b; 
        inoutHolder.value = EnumType.c; 

        // 復帰
        return( EnumType.a ); 
    }
}

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

Java言語でinパラメタを参照する場合は、inパラメタのインスタンスのvalueで参照します。inoutパラメタを参照するには、enumHolderクラスからenumクラスのインスタンスを取り出し、このインスタンスのvalueで参照します。また、out/inoutパラメタとしてクライアントアプリケーションにパラメタを返す場合は、enumHolderクラスからenumクラスのインスタンスを取り出し、このインスタンスに直接設定します。