시작하기 전에
LIL(loadable implementation library)는 C 구문 분석기(또는 노드)용 구현 모듈입니다. LIL은 Linux 또는 UNIX 공유 오브젝트 또는 Windows DLL(Dynamic Link Library)로서, 파일 확장자가 .dll이 아닌 .lil을 가집니다.
개발자가 작성해야 하는 구현 함수는 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); }