21.3.2 アンタイプドオブジェクトラッパーのインプリメント

<この項の構成>
(1) C++の場合
(2) Javaの場合
(3) pre_methodおよびpost_methodパラメタ

(1) C++の場合

コードサンプル21-3に,TimeWrap.hファイルに定義されたTimingUntypedObjectWrapperのインプリメンテーションを示します。アンタイプドオブジェクトラッパーはVISObjectWrapper::UntypedObjectWrapperクラスから派生していなければなりません。ユーザはアンタイプドオブジェクトラッパー中のpre_methodとpost_methodの両メソッドのインプリメンテーションを提供できます。

ファクトリがインストールされたら,ファクトリのコンストラクタによって自動的にまたはVISObjectWrapper::ChainUntypedObjectWrapperFactory::createメソッドの起動によって手動で,クライアントがオブジェクトにバインドする際,またはサーバがオブジェクトインプリメンテーションでメソッドを起動する際に,アンタイプドオブジェクトラッパーオブジェクトが自動的に生成されます。

コードサンプル21-3に示すpre_methodは,TimeWrap.Cで定義されたTimerBeginメソッドを起動します。このメソッドは,現在の時間を取得するためにClosureオブジェクトを使用します。同様に,post_methodはTimerDeltaメソッドを起動し,pre_methodが呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。

コードサンプル21-3 TimingUntypedObjectWrapperインプリメンテーション(C++)

class TimingObjectWrapper : public VISObjectWrapper::
     UntypedObjectWrapper {
  public:
     TimingObjectWrapper(
           const char* key=NULL) : _key(key) {}

     void pre_method(const char* operation,
           CORBA::Object_ptr target,
           VISClosure& closure) {
        cout << "*Timing: [" << flush;
        if ((char *)_key)
           cout << _key << flush;
        else
           cout << "<no key>" << flush;
        cout << "] pre_method¥t" << operation << "¥t->"
           << endl;
        TimerBegin(closure, operation);
     }

     void post_method(const char* operation,
           CORBA::Object_ptr target,
           CORBA::Environment& env,
           VISClosure& closure) {
        cout << "*Timing: [" << flush;
        if ((char *)_key)
           cout << _key << flush;
        else
           cout << "<no key>" << flush;
        cout << "] post_method¥t" ;
        TimerDelta(closure, operation);
     }
  private:
     CORBA::String_var _key;
};

(2) Javaの場合

コードサンプル21-4に,TimingUntypedObjectWrapperのインプリメンテーションを示します。アンタイプドオブジェクトラッパーはUntypedObjectWrapperクラスから派生していなければなりません。ユーザはアンタイプドオブジェクトラッパー中のpre_methodとpost_methodの両メソッドのインプリメンテーションを提供できます。

ファクトリがインストールされたら,ファクトリのコンストラクタによって自動的にまたはChainUntypedObjectWrapperFactory::addメソッドの起動によって手動で,クライアントがオブジェクトにバインドする際,またはサーバがオブジェクトインプリメンテーションでメソッドを起動する際に,アンタイプドオブジェクトラッパーオブジェクトが自動的に生成されます。

コードサンプル21-4に示すpre_methodは,現在の時間を取得し,それをプライベート変数に保存し,メッセージを出力します。同様に,post_methodも現在の時間を取得し,pre_methodが呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。

コードサンプル21-4 TimingUntypedObjectWrapperインプリメンテーション(Java)

package UtilityObjectWrappers;
import com.inprise.vbroker.interceptor.*;

public class TimingUntypedObjectWrapper implements
                                    UntypedObjectWrapper {
  private long time;
  public void pre_method(String operation,
        org.omg.CORBA.Object target,
        Closure closure) {
     System.out.println("Timing: " +
              ((com.inprise.vbroker.CORBA.Object) target).
              _object_name() + "->" + operation + "()");
     time = System.currentTimeMillis();
  }
  public void post_method(String operation,
        org.omg.CORBA.Object target,
        org.omg.CORBA.Environment env,
        Closure closure) {
     long diff = System.currentTimeMillis() - time;
     System.out.println("Timing: Time for call ¥t" +
        ((com.inprise.vbroker.CORBA.Object)target).
         _object_name() + "->" + operation + "() = " +
         diff + " ms.");
  }
}

(3) pre_methodおよびpost_methodパラメタ

pre_methodとpost_methodは表21-2のパラメタを受け取ります。

表21-2 pre_methodおよびpost_methodメソッドの共通引数

パラメタ説明
operation目的のオブジェクトでリクエストしたオペレーションの名前
target目的のオブジェクト
closureこのオブジェクトラッパーのメソッド呼び出し用にデータを保存する領域

post_methodはEnvironmentパラメタも受け取ります。Environmentパラメタは,メソッド呼び出しの前の手順で起こる可能性のある例外をユーザに通知する際に使えます。