コードサンプル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が呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。
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;
};
コードサンプル21-4に,TimingUntypedObjectWrapperのインプリメンテーションを示します。アンタイプドオブジェクトラッパーはUntypedObjectWrapperクラスから派生していなければなりません。ユーザはアンタイプドオブジェクトラッパー中のpre_methodとpost_methodの両メソッドのインプリメンテーションを提供できます。
ファクトリがインストールされたら,ファクトリのコンストラクタによって自動的にまたはChainUntypedObjectWrapperFactory::addメソッドの起動によって手動で,クライアントがオブジェクトにバインドする際,またはサーバがオブジェクトインプリメンテーションでメソッドを起動する際に,アンタイプドオブジェクトラッパーオブジェクトが自動的に生成されます。
コードサンプル21-4に示すpre_methodは,現在の時間を取得し,それをプライベート変数に保存し,メッセージを出力します。同様に,post_methodも現在の時間を取得し,pre_methodが呼び出されてからどれくらい時間がたったかを調べ,経過時間を出力します。
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.");
}
}
pre_methodとpost_methodは表21-2のパラメタを受け取ります。
表21-2 pre_methodおよびpost_methodメソッドの共通引数
パラメタ | 説明 |
---|---|
operation | 目的のオブジェクトでリクエストしたオペレーションの名前 |
target | 目的のオブジェクト |
closure | このオブジェクトラッパーのメソッド呼び出し用にデータを保存する領域 |
post_methodはEnvironmentパラメタも受け取ります。Environmentパラメタは,メソッド呼び出しの前の手順で起こる可能性のある例外をユーザに通知する際に使えます。