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

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

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

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

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