ページの先頭行へ戻る
Interstage Application Server V12.3.0 アプリケーション作成ガイド(CORBAサービス編)
FUJITSU Software

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