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

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

6.17.6 シーケンス型

(1)IDLマッピング

 IDL言語でシーケンス型sequenceを指定した場合、Java言語ではsequenceの要素の型に対応するデータ型の配列(データ型[ ])、およびsequenceHolderクラスとsequenceHelperクラスになります。
 データ型の配列は、inパラメタおよび復帰値を扱う場合に使用します。
 sequenceHolderクラス名は、以下のようにIDLで定義したシーケンス型名+Holderになります。本クラスは、out、inoutパラメタを扱う場合に使用します。

  <sequenceHolderクラス>
  [package <packageName>;]
  final public class <sequence_class>Holder
         implements org.omg.CORBA.portable.Streamable  {
      public <sequence_element_type>[] value; 
      public <sequence_class>Holder() {};
      public <sequence_class>Holder(<sequence_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() {...}
  }

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

sequenceHolderクラスのメンバ

意味

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

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

コンストラクタ

パラメタで指定された値(sequence型データ)をvalueメンバに設定します。

_read()

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

_write()

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

_type()

TypeCodeを取り出します。

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

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

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

sequenceHelperクラスのメソッド

意味

insert()

要素の値を挿入します。

extract()

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

type()

TypeCodeを取り出します。

id()

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

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

【IDL言語】

  module ODsample{
      interface   seqtest{
          typedef sequence<long>  sampleseq; 
          sampleseq op1(in sampleseq seq1, 
                        out sampleseq seq2, 
                        inout sampleseq seq3 ); 
      };
  };

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

【Java言語】

  <インタフェースクラス>
  package ODsample;
  public interface seqtestOperations {
      public int[] op1(int[] seq1, 
                       ODsample.seqtestPackage.sampleseqHolder seq2, 
                       ODsample.seqtestPackage.sampleseqHolder seq3 ); 
  }
  <sequenceHolderクラス>
  package ODsample.seqtestPackage; 
  public class sampleseqHolder  implements org.omg.CORBA.portable.Streamable {
      public int[] value; 
      public sampleseqHolder() {}
      public sampleseqHolder(int[] 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() {...}
  }
  <sequenceHelperクラス>
  package ODsample.seqtestPackage; 
  public class sampleseqHelper
  {
      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(){...}
      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){...} 
  }

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

 inパラメタのsequence型のデータ領域は、newを使用して獲得します。inout、outパラメタの場合はsequenceHolderクラスを使用してデータ領域を割り当てます。inoutパラメタのsequenceにデータを割り当てるには、コンストラクタのパラメタで必要な個数分指定することにより、sequenceのインスタンスデータvalueに領域が割り当てられます。そのvalueにデータを設定します。sequenceデータの参照は、インスタンスデータvalueを参照します。

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

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

              // inパラメタ用変数
              int in[] = new int[10]; 
              for( i = 0; i < in.length; i++ ) 
                  in[i] = i; 

              // outパラメタ用変数
              ODsample.seqtestPackage.sampleseqHolder outHolder =
                         new ODsample.seqtestPackage.sampleseqHolder();
              // inoutパラメタ用変数
              ODsample.seqtestPackage.sampleseqHolder inoutHolder =
                         new ODsample.seqtestPackage.sampleseqHolder( new int[20] ); 
              for( i = 0; i < inoutHolder.value.length; i++ ) 
                  inoutHolder.value[i] = i * 2; 

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

              // サーバアプリケーションのメソッド呼出し
              result = target.op1( in, outHolder, inoutHolder ); 

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

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

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

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

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

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

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

      public int[] op1( int[] in, 
                        ODsample.seqtestPackage.sampleseqHolder outHolder, 
                        ODsample.seqtestPackage.sampleseqHolder inoutHolder ) {
          int i; 

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

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

          // 出力パラメタの設定
          // outパラメタの設定
          outHolder.value = new int[5]; 
          for( i = 0; i < outHolder.value.length; i++ ) 
              outHolder.value[i] = in[i] * 100; 

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

          // 復帰の設定
          int result[] = new int[5]; 
          for( i = 0; i < result.length; i++ ) 
              result[i] = in[i] + 100; 

          // 復帰
          return( result ); 
      }
  }

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

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

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