Antes de empezar
Una biblioteca de implementación cargable, o LIL, es el módulo de implementación para un analizador (o nodo) C. Una LIL es un objeto Linux o UNIX compartido o una biblioteca de enlaces dinámicos (DLL) Windows, que no tiene la extensión de archivo .dll sino .lil.
Las funciones de implementación que el desarrollador tiene que escribir se listan en el apartado Funciones de implementación de analizador en C. Las funciones de programa de utilidad que WebSphere Message Broker proporciona para ayudar en este proceso se listan en el apartado Funciones de programa de utilidad de analizador en C.
WebSphere Message Broker proporciona el origen para un analizador definido por el usuario de ejemplo denominado BipSampPluginParser.c. Se trata de un analizador pseudo XML simple que se puede utilizar en su estado actual o que se puede modificar.
Cada LIL que implementa un analizador definido por el usuario debe exportar una función denominada bipGetParserFactory como función de inicialización. La función de inicialización define el nombre de la fábrica que el analizador definido por el usuario soporta y las clases de objetos, u objetos compartidos, soportados por la fábrica.
La función de inicialización también debe crear el objeto de fábrica y define los nombres de todos los analizadores soportados por la LIL. Una fábrica puede soportar cualquier número de clases de objeto (analizadores). Cuando se define un analizador, se pasa al intermediario una lista de punteros a las funciones de implementación para dicho analizador. Si ya existe un analizador con el mismo nombre, se rechaza la petición.
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;
Entonces la función de inicialización debe crear una fábrica de analizador invocando cpiCreateParserFactory. Las clases de analizador soportadas por la fábrica se definen invocando cpiDefineParserClass. La dirección del objeto de fábrica (devuelto por cpiCreateParserFactory) se debe devolver al intermediario como valor de retorno desde la función de inicialización.
factoryObject = cpiCreateParserFactory(&rc, constParserFactory);
if (factoryObject) { cpiDefineParserClass(&rc, factoryObject, constPXML, &vftable); } else { /* Error: No se ha podido crear fábrica de analizador */ }
return(factoryObject); }
Siempre que se crea una instancia de un objeto de analizador definido por el usuario, el intermediario de mensajes invoca la función de implementación de creación de contexto cpiCreateContext. Esto permite al analizador definido por el usuario asignar datos de instancia asociados con el analizador.
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: No se ha podido asignar memoria */ }
return((CciContext*)p); }
void cpiDeleteContext( CciParser* parser, CciContext* context ){ PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ; int rc = 0; return; }