Vorbereitungen
Eine ladbare Implementierungsbibliothek (Loadable Implementation Library, LIL) ist das Implementierungsmodul für einen C-Parser (oder -Knoten). Eine LIL-Datei ist ein gemeinsam genutztes Linux- oder UNIX-Objekt oder eine Windows-DLL-Datei, die nicht die Dateierweiterung .dll, sondern .lil hat.
Die Implementierungsfunktionen, die vom Entwickler geschrieben werden müssen, sind unter C-Parser-Implementierungsfunktionen aufgelistet. Die Dienstprogrammfunktionen, die von WebSphere Message Broker bereitgestellt werden, um diesen Prozess zu unterstützen, sind unter C-Parser-Dienstprogrammfunktionen aufgelistet.
WebSphere Message Broker stellt den Quellcode für einen benutzerdefinierten Beispiel-Parser mit dem Namen 'BipSampPluginParser.c' bereit. Dies ist ein einfacher Pseudo-XML-Parser, den Sie in seinem aktuellen Zustand verwenden oder ändern können.
Jede LIL, die einen benutzerdefinierten Parser implementiert, muss eine Funktion mit dem Namen bipGetParserFactory als Initialisierungsfunktion exportieren. Die Initialisierungsfunktion definiert den Namen der Factory, die der benutzerdefinierte Parser unterstützt, und die Objektklassen oder Klassen von gemeinsam genutzten Objekten, die von der Factory unterstützt werden.
Die Initialisierungsfunktion muss auch das Factory-Objekt erstellen und die Namen aller Parser definieren, die von der LIL unterstützt werden. Eine Factory kann eine beliebige Anzahl von Objektklassen (Parsern) unterstützen. Wenn ein Parser definiert wird, wird eine Liste mit Zeigern auf die Implementierungsfunktionen für diesen Parser an de Broker übermittelt. Wenn bereits ein Parser mit demselben Namen vorhanden ist, wird die Anforderung zurückgewiesen.
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;
Die Initialisierungsfunktion muss anschließend durch den Aufruf von cpiCreateParserFactory eine Parser-Factory erstellen. Die von der Factory unterstützten Parser-Klasse werden durch den Aufruf von cpiDefineParserClass definiert. Die Adresse des Factory-Objekts (von cpiCreateParserFactory zurückgegeben) muss als Rückgabewert aus der Initialisierungsfunktion an den Broker zurückgegeben werden.
factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
if (factoryObject) { cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable); } else { /* Error: Unable to create parser factory */ }
return(factoryObject); }
Wenn eine Instanz eines benutzerdefinierten Parser-Objekts erstellt wird, wird die Implementierungsfunktion zur Kontexterstellung, cpiCreateContext, vom Nachrichtenbroker aufgerufen. Dies ermöglicht dem benutzerdefinierten Parser die Zuordnung von Instanzdaten, die dem Parser zugeordnet sind.
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); }
void cpiDeleteContext( CciParser* parser, CciContext* context ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc = 0; return; }