| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) | 
			目次
			索引
			![]()  
		 | 
	
| 第6章 アプリケーションの開発(Java言語) | > 6.17 データ型に対するマッピング | 
 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){...} 
  }
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) {
              //エラー処理
                  :
          }
      }
  }
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) {
              //エラー処理
                :
          }
      }
  }
			目次
			索引
			![]()  
		 |