始める前に
ロード可能インプリメンテーション・ライブラリー、または LIL、 は C パーサー (またはノード) のインプリメンテーション・モジュールです。 LIL は、ファイル拡張子が .dll ではなく .lil である、Linux または UNIX 共有オブジェクトまたは Windows ダイナミック・リンク・ライブラリー (DLL) です。
開発者が作成する必要のあるインプリメンテーション関数は、C パーサー・インプリメンテーション関数でリストしています。このプロセスに役立てるために WebSphere Message Broker によって提供されるユーティリティー関数は、C パーサー・ユーティリティー関数でリストしています。
WebSphere Message Broker には、 BipSampPluginParser.c というサンプル・ユーザー定義パーサーのソースが備えられています。これは、単純な擬似 XML パーサーで、現状のまま使用することもできますし、変更を加えることもできます。
ユーザー定義パーサーをインプリメントするそれぞれの LIL は、 bipGetParserFactory と呼ばれる関数を、その初期化関数としてエクスポートする必要があります。 初期化関数は、ユーザー定義パーサーがサポートするファクトリーの名前、 およびファクトリーがサポートするオブジェクトのクラスまたは共用オブジェクトを定義します。
初期化関数はまた、ファクトリー・オブジェクトを作成し、 LIL がサポートするすべてのパーサーの名前を定義する必要があります。 ファクトリーは、任意の数のオブジェクト・クラス (パーサー) をサポートできます。 パーサーの定義時には、そのパーサー用のインプリメンテーション関数へのポインターのリストが、 ブローカーに渡されます。 同じ名前のパーサーがすでに存在する場合、要求は拒否されます。
void LilFactoryExportPrefix * LilFactoryExportSuffix bipGetParserFactory() {
CciFactory* factoryObject; int rc; static CPI_VFT vftable = {CPI_VFT_DEFAULT};
initParserConstants();
vftable.iFpCreateContext = cpiCreateContext; vftable.iFpParseBufferEncoded = cpiParseBufferEncoded; vftable.iFpParseFirstChild = cpiParseFirstChild; vftable.iFpParseLastChild = cpiParseLastChild; vftable.iFpParsePreviousSibling = cpiParsePreviousSibling; vftable.iFpParseNextSibling = cpiParseNextSibling; vftable.iFpWriteBufferEncoded = cpiWriteBufferEncoded; vftable.iFpDeleteContext = cpiDeleteContext; vftable.iFpSetElementValue = cpiSetElementValue; vftable.iFpElementValue = cpiElementValue; vftable.iFpNextParserClassName = cpiNextParserClassName; vftable.iFpSetNextParserClassName = cpiSetNextParserClassName; vftable.iFpNextParserEncoding = cpiNextParserEncoding; vftable.iFpNextParserCodedCharSetId = cpiNextParserCodedCharSetId;
初期化関数は、cpiCreateParserFactory を呼び出すことによってパーサー・ファクトリーを作成する必要があります。 ファクトリーがサポートするパーサー・クラスは、cpiDefineParserClass を呼び出すことによって定義されます。ファクトリー・オブジェクトのアドレス (cpiCreateParserFactory によって戻される) は、 初期化関数からの戻り値としてブローカーに戻される必要があります。
factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
if (factoryObject) { cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable); } else { /* Error: Unable to create parser factory */ }
return(factoryObject); }
ユーザー定義パーサー・オブジェクトのインスタンスが作成されるときはいつでも、 コンテキスト作成インプリメンテーション関数 cpiCreateContext が、 メッセージ・ブローカーによって呼び出されます。 これによって、ユーザー定義パーサーは、属性用のデータ域など、 パーサーと関連付けられたインスタンス・データを割り振ることができます。
CciContext* cpiCreateContext( CciParser* parser ){ PARSER_CONTEXT_ST *p;
p = (PARSER_CONTEXT_ST *)malloc(sizeof(PARSER_CONTEXT_ST));
if (p) { memset(p, 0, sizeof(PARSER_CONTEXT_ST)); } else { /* Error: Unable to allocate memory */ }
return((CciContext*)p); }