高度な内容: Dynamic Skeleton Interface (DSI)


Dynamic Skeleton Interface (DSI) を使用すると、インタフェースの詳細が事前に (コンパイル時に) わかっていないサーバントオブジェクトをサーバが提供できます。DSI を使用した場合、サーバは、IDL インタフェース定義からコンパイルされたスケルトンコードを使用する代わりにオペレーション呼び出しを動的に作成します。

DSI を使用する理由

DSI は、CORBA 環境と CORBA 以外の環境との橋渡し役として使用できます。DSI を使用すると、CORBA クライアントは、COM サービスなどとして実装されている CORBA オブジェクト上のメソッドを呼び出せるようになります。

CORBA クライアントの要求を COM サーバが理解できる形式に変換するには、動的サーバントを実装します。この変換処理を行うコードはすべて記述する必要があります。これを典型的な静的オブジェクト呼び出しと比較してみます。サーバは、呼び出されるインタフェース用のスケルトン (コンパイルされたもの) にアクセスできます。このスケルトンは、IDL インタフェース定義を idltojava コンパイラでコンパイルすることにより生成されます。ORB は、要求を受け取ると、このスケルトンコードを使ってサーバ側でオペレーション引数を組み立て、結果を送り返します。

動的サーバントの実装例

次のインタフェースについて検討してみます。

module HelloApp
{
    interface Hello
    {
        string printHelloArgs(in string arg1, in short arg2);
    };
};

次に示すのは、上記インタフェース用の動的サーバントの骨組みとなるコンパイル可能なコードです。メソッド要求を解析する基本部分だけが実装されているため、変換処理を実装したコードを挿入する必要があります。

// Copyright and License 

import HelloApp.*;

import java.util.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import java.io.*;
import org.omg.CORBA.*;

// servant must extend DynamicImplementation
class HelloServant extends DynamicImplementation
{

    // store the repository ID for the implemented interface
    static String[] myIDs = {"IDL:JavaIDL/DSIExample:1.0"};
    ORB orb;

    // create a reference to the ORB
    HelloServant(ORB orb) {
        this.orb = orb;
    }
    // must implement invoke() for handling requests
    public void invoke(ServerRequest request) {
        try {
            System.out.println("DSI: invoke called, op = "+request.op_name());

	    // create an NVList to hold the parameters
            NVList nvlist = orb.create_list(0);

	    // need an if statement like this for each method name
            if (request.op_name().equals("printHelloArgs") == true) {

		    // need an Any for each argument
                    Any any1 = orb.create_any();
                    any1.insert_string("");
                    nvlist.add_value("arg1", any1, ARG_IN.value);

                    Any any2 = orb.create_any();
                    any2.insert_string("");
                    nvlist.add_value("arg2", any2, ARG_IN.value);

		    // pass the NVList to the request to get values
                    request.params(nvlist);

                    System.err.println("Argument 1: In value: " + nvlist.item(0).value().extract_string());

                    System.err.println("Argument 2: In value: " + nvlist.item(1).value().extract_short());

                    TypeCode result_tc = orb.get_primitive_tc(TCKind.tk_void);
                    Any result_any = orb.create_any();
                    result_any.type(result_tc);

                    request.result(result_any);
            }
        }
        catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("DSIExample: Exception thrown: " + ex);
        }
    }    

// implement an _ids method to return repository ID of interface
public String[] _ids() {    
        return myIDs;
}

// HelloServer implemented in the usual fashion 
public class HelloServer {
 
    public static void main(String args[])
    {
        try{
            // create and initialize the ORB
            ORB orb = ORB.init(args, null);
 
            // create servant and register it with the ORB
            HelloServant helloRef = new HelloServant(orb);
            orb.connect(helloRef);
 
            OutputStream f = new FileOutputStream(System.getProperty("user.home")+System.getProperty("file.separator")+"DSI.ior");
            DataOutputStream out = new DataOutputStream(f);
            String ior = orb.object_to_string(helloRef);
            out.writeBytes(ior);
            out.close();
 
            System.out.println("IOR is "+ ior);
 
            // wait for invocations from clients
            java.lang.Object sync = new java.lang.Object();
            synchronized (sync) {
                sync.wait();
            }
 
        } catch (Exception e) {
            System.err.println("ERROR: " + e);
            e.printStackTrace(System.out);
        }
    }
}      


ホーム

Copyright © 1995-98 Sun Microsystems, Inc. All Rights Reserved.