21.3.2 アンタイプドオブジェクトラッパーのインプリメント
(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のパラメタを受け取ります。
パラメタ |
説明 |
---|---|
operation |
目的のオブジェクトでリクエストしたオペレーションの名前 |
target |
目的のオブジェクト |
closure |
このオブジェクトラッパーのメソッド呼び出し用にデータを保存する領域 |
post_methodはEnvironmentパラメタも受け取ります。Environmentパラメタは,メソッド呼び出しの前の手順で起こる可能性のある例外をユーザに通知する際に使えます。