Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第6章 アプリケーションの開発(Java言語)> 6.17 データ型に対するマッピング

6.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クラスのインスタンスを取り出し、このインスタンスに直接設定します。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005