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

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

6.17.9 配列

(1)IDLマッピング

 IDL言語で配を定義した場合、Java言語では、要素の型に対応するデータ型の配列、および配列名Holderクラスと配列名Helperクラスになります。
 データ型の配列は、inパラメタおよび復帰値を扱う場合に使用します。
 配列名Holderクラス名は、IDLで定義した配列名+Holderになります。本クラスは、out、inoutパラメタを扱う場合に使用します。

  <配列名Holderクラス>
  [package <packageName>;]
  final public class <array_class>Holder
        implements org.omg.CORBA.portable.Streamable  {
      public < array _element_type>[] value; 
      public < array _class>Holder() {};
      public < array _class>Holder(<array _element_type>[] 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() {...}
  }

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

配列名Holderクラスのメンバ

意味

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

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

コンストラクタ

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

_read()

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

_write()

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

_type()

TypeCodeを取り出します。

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

  <配列名Helperクラス>
  [package <packageName>;]
  public class <array_class>Helper
  {
      public static void
          insert(org.omg.CORBA.Any a, <array _element_type>[] value){...} 
      public static <array _element_type>[]
          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 <array _element_type>[]
          read( org.omg.CORBA.portable.InputStream istream ){...} 
      public static void
          write(org.omg.CORBA.portable.OutputStream ostream, 
                <array _element_type>[] value) 
                throws  org.omg.CORBA.MARSHAL{...}
  }

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

配列名Helperクラスのメンバ

意味

insert()

要素の値を挿入します。

extract()

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

type()

TypeCodeを取り出します。

id()

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

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

【IDL言語】

  module ODsample{
      interface arraytest{
          typedef long fix[4][3][2]; 
          typedef string str[2][3][4]; 
          fix op1( in fix para1, out fix para2, inout fix para3 ); 
          str op2( in str para1, out str para2, inout str para3 ); 
      };
  };

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

【Java言語】

  <インタフェース>
  package ODsample; 
  public interface arraytestOperations {
      public int[][][] op1(int[][][] para1, 
                           ODsample.arraytestPackage.fixHolder para2, 
                           ODsample.arraytestPackage.fixHolder para3 ); 
      public java.lang.String[][][] op2(java.lang.String[][][] para1, 
                           ODsample.arraytestPackage.strHolder para2, 
                           ODsample.arraytestPackage.strHolder para3 ); 
  }
  <配列名Holderクラス>
  package ODsample.arraytestPackage; 
  public final class fixHolder  implements org.omg.CORBA.portable.Streamable {
      public int[][][] value; 
      public fixHolder()  {}
      public fixHolder(int[][][] value) {...}
      public void _read (org.omg.CORBA.portable.InputStream istream) {...}
      public void _write (org.omg.CORBA.portable.OutputStream ostream) {...}
      public org.omg.CORBA.TypeCode _type () {...}
  }

  package ODsample.arraytestPackage; 
  public final class strHolder implements org.omg.CORBA.portable.Streamable {
      public java.lang.String[][][] value; 
      public strHolder()  {}
      public strHolder(java.lang.String[][][] value) {...}
      public void _read (org.omg.CORBA.portable.InputStream istream) {...}
      public void _write (org.omg.CORBA.portable.OutputStream ostream) {...}
      public org.omg.CORBA.TypeCode _type () {...}
  }
  <配列名Helperクラス>
  package ODsample.arraytestPackage; 
  public class fixHelper
  {
      public static void
          insert(org.omg.CORBA.Any a, int[][][] value){...} 
      public static int[][][]
          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 int[][][]
          read( org.omg.CORBA.portable.InputStream istream ){...} 
      public static void
          write(org.omg.CORBA.portable.OutputStream ostream, 
                int[][][] value) throws  org.omg.CORBA.MARSHAL{...}
  }

  package ODsample.arraytestPackage; 
  public class strHelper
  {
      public static void
          insert(org.omg.CORBA.Any a, java.lang.String[][][] value){...} 
      public static java.lang.String[][][]
          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 java.lang.String[][][]
          read( org.omg.CORBA.portable.InputStream istream ){...} 
      public static void
          write(org.omg.CORBA.portable.OutputStream ostream, 
                java.lang.String[][][] value) 
                throws  org.omg.CORBA.MARSHAL{...}
  }

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

 inパラメタの配列型のデータ領域は、newを使用して獲得します。inout、outパラメタの場合は配列名Holderクラスを使用してデータ領域を割り当てます。inout、outパラメタを参照するには、インスタンスデータのvalueを参照します。

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

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

              int i, j, k; 

              // int型配列

              // inパラメタ用変数
              int[][][] in_fix = new int[4][3][2]; 
              for( i = 0; i < in_fix.length; i++ ) 
                  for( j = 0; j < in_fix[i].length; j++ ) 
                      for( k = 0; k < in_fix[i][j].length; k++ ) 
                          in_fix[i][j][k]  =  i + j + k; 

              // outパラメタ用変数
              ODsample.arraytestPackage.fixHolder outHolder_fix =
                             new ODsample.arraytestPackage.fixHolder();

              // inoutパラメタ用変数
              int[][][] inout_fix_tmp = new int[4][3][2]; 
              for( i = 0; i < inout_fix_tmp.length; i++ ) 
                  for( j = 0; j < inout_fix_tmp[i].length; j++ ) 
                      for( k = 0; k < inout_fix_tmp[i][j].length; k++ ) 
                          inout_fix_tmp[i][j][k]  =  i + j + k + 1; 
              ODsample.arraytestPackage.fixHolder inoutHolder_fix =
                    new ODsample.arraytestPackage.fixHolder( inout_fix_tmp ); 

              // 復帰値用変数
              int[][][] ret_fix; 

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

              // メソッドの結果表示
              // 復帰値の表示
              for( i = 0; i < ret_fix.length; i++ ) 
                  for( j = 0; j < ret_fix[i].length; j++ ) 
                      for( k = 0; k < ret_fix[i][j].length; k++ ) 
                          System.out.println( "ret_fix[" + i + "][" + j + "][" + k + "]="
                                              + ret_fix[i][j][k] ); 

              // outパラメタの表示
              for( i = 0; i < outHolder_fix.value.length; i++ ) 
                  for( j = 0; j < outHolder_fix.value[i].length; j++ ) 
                      for( k = 0; k < outHolder_fix.value[i][j].length; k++ ) 
                          System.out.println(
                              "outHolder_fix.value[" + i + "][" + j + "][" + k + "]="
                                        +  outHolder_fix.value[i][j][k] ); 

              // inoutパラメタの表示
              for( i = 0; i < inoutHolder_fix.value.length; i++ ) 
                  for( j = 0; j < inoutHolder_fix.value[i].length; j++ ) 
                      for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ ) 
                          System.out.println(
                              "inoutHolder_fix.value[" + i + "][" + j + "][" + k + "]="
                                        + inoutHolder_fix.value[i][j][k] ); 

              // String型配列

              // inパラメタ用変数
              String[][][] in_str = new String[2][3][4]; 
              for( i = 0; i < in_str.length; i++ ) 
                  for( j = 0; j < in_str[i].length; j++ ) 
                      for( k = 0; k < in_str[i][j].length; k++ ) 
                          in_str[i][j][k]  =  "indata" + i + j + k; 

              // outパラメタ用変数
              ODsample.arraytestPackage.strHolder outHolder_str =
                              new ODsample.arraytestPackage.strHolder();

              // inoutパラメタ用変数
              String[][][] inout_str_tmp = new String[2][3][4]; 
              for( i = 0; i < inout_str_tmp.length; i++ ) 
                  for( j = 0; j < inout_str_tmp[i].length; j++ ) 
                     for( k = 0; k < inout_str_tmp[i][j].length; k++ ) 
                        inout_str_tmp[i][j][k]  =  "inoutdata" + i + j + k + "snd"; 
              ODsample.arraytestPackage.strHolder inoutHolder_str =
                  new ODsample.arraytestPackage.strHolder( inout_str_tmp ); 

              // 復帰値用変数
              String[][][] ret_str; 

              // サーバアプリケーションのメソッド呼出し
              ret_str = target.op2( in_str, outHolder_str, inoutHolder_str ); 

              // メソッドの結果表示 
              // 復帰値の表示
             for( i = 0; i < ret_str.length; i++ ) 
                 for( j = 0; j < ret_str[i].length; j++ ) 
                     for( k = 0; k < ret_str[i][j].length; k++ ) 
                         System.out.println(
                            "ret_str[" + i + "][" + j + "][" + k + "]=" + ret_str[i][j][k] ); 

              // outパラメタの表示
              for( i = 0; i < outHolder_str.value.length; i++ ) 
                  for( j = 0; j < outHolder_str.value[i].length; j++ ) 
                      for( k = 0; k < outHolder_str.value[i][j].length; k++ ) 
                          System.out.println(
                              "outHolder_str.value[" + i + "][" + j + "][" + k + "]="
                                    + outHolder_str.value[i][j][k] ); 

              // inoutパラメタの表示
              for( i = 0; i < inoutHolder_str.value.length; i++ ) 
                  for( j = 0; j < inoutHolder_str.value[i].length; j++ ) 
                      for( k = 0; k < inoutHolder_str.value[i][j].length; k++ ) 
                          System.out.println(
                              "inoutHolder_str.value[" + i + "][" + j + "][" + k + "]="
                                  + inoutHolder_str.value[i][j][k] ); 
          }
          catch ( java.lang.Exception e ) {
              //エラー処理
             :
          }
      }
  }

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

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

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

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

      public int[][][] op1( int[][][] in_fix, 
                            ODsample.arraytestPackage.fixHolder outHolder_fix, 
                            ODsample.arraytestPackage.fixHolder inoutHolder_fix ) 
      {
          int i, j, k; 

          // 入力パラメタの表示
          // inパラメタの表示
          for( i = 0; i < in_fix.length; i++ ) 
              for( j = 0; j < in_fix[i].length; j++ ) 
                  for( k = 0; k < in_fix[i][j].length; k++ ) 
                      System.out.println(
                        "in_fix[" + i + "][" + j + "][" + k + "]=" + in_fix[i][j][k] ); 

          // inoutパラメタの表示
          for( i = 0; i < inoutHolder_fix.value.length; i++ ) 
              for( j = 0; j < inoutHolder_fix.value[i].length; j++ ) 
                  for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ ) 
                      System.out.println(
                      "inoutHolder_fix.value[" + i + "][" + j + "][" + k + "]="
                                          + inoutHolder_fix.value[i][j][k] ); 

          // 出力パラメタの設定
          // outパラメタの設定
          int[][][] out_fix_tmp = new int[4][3][2]; 
          for( i = 0; i < out_fix_tmp.length; i++ ) 
              for( j = 0; j < out_fix_tmp[i].length; j++ ) 
                  for( k = 0; k < out_fix_tmp[i][j].length; k++ ) 
                      out_fix_tmp[i][j][k]  =  ( i + j + k ) * 10; 
          outHolder_fix.value = out_fix_tmp; 

          // inoutパラメタの設定
          for( i = 0; i < inoutHolder_fix.value.length; i++ ) 
              for( j = 0; j < inoutHolder_fix.value[i].length; j++ ) 
                  for( k = 0; k < inoutHolder_fix.value[i][j].length; k++ ) 
                      inoutHolder_fix.value[i][j][k]  =  
                                       inoutHolder_fix.value[i][j][k] * 20; 

          // 復帰の設定
          int[][][] ret_fix = new int[4][3][2]; 
          for( i = 0; i < ret_fix.length; i++ ) 
              for( j = 0; j < ret_fix[i].length; j++ ) 
                  for( k = 0; k < ret_fix[i][j].length; k++ ) 
                      ret_fix[i][j][k]  =  ( i + j + k ) * 100; 

          // 復帰
          return( ret_fix ); 
      }

      public String[][][] op2( String[][][] in_str, 
                            ODsample.arraytestPackage.strHolder outHolder_str, 
                            ODsample.arraytestPackage.strHolder inoutHolder_str ) 
      {
          int i, j, k; 

          // 入力パラメタの表示
          // inパラメタの表示
          for( i = 0; i < in_str.length; i++ ) 
              for( j = 0; j < in_str[i].length; j++ ) 
                  for( k = 0; k < in_str[i][j].length; k++ ) 
                      System.out.println(
                        "in_str[" + i + "][" + j + "][" + k + "]=" + in_str[i][j][k] ); 

          // inoutパラメタの表示
          for( i = 0; i < inoutHolder_str.value.length; i++ ) 
              for( j = 0; j < inoutHolder_str.value[i].length; j++ ) 
                  for( k = 0; k < inoutHolder_str.value[i][j].length; k++ ) 
                      System.out.println(
                            "inoutHolder_str.value[" + i + "][" + j + "][" + k + "]="
                                          + inoutHolder_str.value[i][j][k] ); 

          // 出力パラメタの設定
          // outパラメタの設定
          String[][][] out_str_tmp = new String[2][3][4]; 
          for( i = 0; i < out_str_tmp.length; i++ ) 
              for( j = 0; j < out_str_tmp[i].length; j++ ) 
                  for( k = 0; k < out_str_tmp[i][j].length; k++ ) 
                      out_str_tmp[i][j][k]  =  "outdata" + i + j + k; 
          outHolder_str.value = out_str_tmp; 

          // inoutパラメタの設定
          for( i = 0; i < inoutHolder_str.value.length; i++ ) 
              for( j = 0; j < inoutHolder_str.value[i].length; j++ ) 
                  for( k = 0; k < inoutHolder_str.value[i][j].length; k++ ) 
                      inoutHolder_str.value[i][j][k]  =
                                        inoutHolder_str.value[i][j][k] + "-rcv";

          // 復帰の設定
          String[][][] ret_str = new String[2][3][4]; 
          for( i = 0; i < ret_str.length; i++ ) 
              for( j = 0; j < ret_str[i].length; j++ ) 
                  for( k = 0; k < ret_str[i][j].length; k++ ) 
                      ret_str[i][j][k]  =  "retdata" + i + j + k; 

          // 復帰
          return( ret_str ); 
      }
  }

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

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

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