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

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

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

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

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