5 #include <libxml/globals.h>
6 #include <libxml/xmlerror.h>
7 #include <libxml/parser.h>
8 #include <libxml/tree.h>
9 #include <libxml/debugXML.h>
10 #include <libxml/xmlmemory.h>
12 #define PERSIST_NS "http://open-ils.org/spec/opensrf/IDL/persistance/v1"
13 #define OBJECT_NS "http://open-ils.org/spec/opensrf/IDL/objects/v1"
14 #define BASE_NS "http://opensrf.org/spec/IDL/base/v1"
16 xmlDocPtr idlDoc = NULL; // parse and store the IDL here
18 /* parse and store the IDL here */
21 osrfHash* oilsIDL() { return idlHash; }
22 osrfHash* oilsIDLInit( char* idl_filename ) {
24 if (idlHash) return idlHash;
26 char* string_tmp = NULL;
28 idlHash = osrfNewHash();
29 osrfHash* usrData = NULL;
31 osrfLogInfo(OSRF_LOG_MARK, "Parsing the IDL XML...");
32 idlDoc = xmlReadFile( idl_filename, NULL, XML_PARSE_XINCLUDE );
35 osrfLogError(OSRF_LOG_MARK, "Could not load or parse the IDL XML file!");
39 osrfLogInfo(OSRF_LOG_MARK, "Initializing the Fieldmapper IDL...");
41 xmlNodePtr docRoot = xmlDocGetRootElement(idlDoc);
42 xmlNodePtr kid = docRoot->children;
44 if (!strcmp( (char*)kid->name, "class" )) {
46 usrData = osrfNewHash();
47 osrfHashSet( usrData, xmlGetProp(kid, "id"), "classname");
48 osrfHashSet( usrData, xmlGetNsProp(kid, "fieldmapper", OBJECT_NS), "fieldmapper");
50 osrfHashSet( idlHash, usrData, (char*)osrfHashGet(usrData, "classname") );
53 if ((string_tmp = (char*)xmlGetNsProp(kid, "tablename", PERSIST_NS))) {
62 if ((string_tmp = (char*)xmlGetNsProp(kid, "virtual", PERSIST_NS))) {
70 osrfStringArray* controller = osrfNewStringArray(0);
72 if( (string_tmp = (char*)xmlGetProp(kid, "controller") )) {
73 char* controller_list = strdup( string_tmp );
74 osrfLogInfo(OSRF_LOG_MARK, "Controller list is %s", string_tmp );
76 if (strlen( controller_list ) > 0) {
78 char* _controller_class = strtok_r(controller_list, " ", &st_tmp);
79 osrfStringArrayAdd(controller, strdup(_controller_class));
81 while ((_controller_class = strtok_r(NULL, " ", &st_tmp))) {
82 osrfStringArrayAdd(controller, strdup(_controller_class));
86 osrfHashSet( usrData, controller, "controller");
90 osrfHash* links = osrfNewHash();
91 osrfHash* fields = osrfNewHash();
93 osrfHashSet( usrData, fields, "fields" );
94 osrfHashSet( usrData, links, "links" );
96 xmlNodePtr _cur = kid->children;
100 if (!strcmp( (char*)_cur->name, "fields" )) {
103 if( (string_tmp = (char*)xmlGetNsProp(_cur, "primary", PERSIST_NS)) ) {
106 strdup( string_tmp ),
112 if( (string_tmp = (char*)xmlGetNsProp(_cur, "sequence", PERSIST_NS)) ) {
115 strdup( string_tmp ),
120 xmlNodePtr _f = _cur->children;
123 if (strcmp( (char*)_f->name, "field" )) {
128 _tmp = osrfNewHash();
131 if( (string_tmp = (char*)xmlGetNsProp(_f, "array_position", OBJECT_NS)) ) {
134 strdup( string_tmp ),
140 if( (string_tmp = (char*)xmlGetNsProp(_f, "virtual", PERSIST_NS)) ) {
143 strdup( string_tmp ),
149 if( (string_tmp = (char*)xmlGetNsProp(_f, "primitive", PERSIST_NS)) ) {
152 strdup( string_tmp ),
158 if( (string_tmp = (char*)xmlGetProp(_f, "name")) ) {
161 strdup( string_tmp ),
166 osrfLogInfo(OSRF_LOG_MARK, "Found field %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
177 if (!strcmp( (char*)_cur->name, "links" )) {
178 xmlNodePtr _l = _cur->children;
181 if (strcmp( (char*)_l->name, "link" )) {
186 _tmp = osrfNewHash();
189 if( (string_tmp = (char*)xmlGetProp(_l, "reltype")) ) {
192 strdup( string_tmp ),
196 osrfLogInfo(OSRF_LOG_MARK, "Adding link with reltype %s", string_tmp );
199 if( (string_tmp = (char*)xmlGetProp(_l, "key")) ) {
202 strdup( string_tmp ),
206 osrfLogInfo(OSRF_LOG_MARK, "Link fkey is %s", string_tmp );
209 if( (string_tmp = (char*)xmlGetProp(_l, "class")) ) {
212 strdup( string_tmp ),
216 osrfLogInfo(OSRF_LOG_MARK, "Link fclass is %s", string_tmp );
218 osrfStringArray* map = osrfNewStringArray(0);
221 if( (string_tmp = (char*)xmlGetProp(_l, "map") )) {
222 char* map_list = strdup( string_tmp );
223 osrfLogInfo(OSRF_LOG_MARK, "Link mapping list is %s", string_tmp );
225 if (strlen( map_list ) > 0) {
227 char* _map_class = strtok_r(map_list, " ", &st_tmp);
228 osrfStringArrayAdd(map, strdup(_map_class));
230 while ((_map_class = strtok_r(NULL, " ", &st_tmp))) {
231 osrfStringArrayAdd(map, strdup(_map_class));
235 osrfHashSet( _tmp, map, "map");
238 if( (string_tmp = (char*)xmlGetProp(_l, "field")) ) {
241 strdup( string_tmp ),
252 osrfLogInfo(OSRF_LOG_MARK, "Found link %s for class %s", string_tmp, osrfHashGet(usrData, "classname") );
265 osrfLogInfo(OSRF_LOG_MARK, "...IDL XML parsed");
270 osrfHash* oilsIDLFindPath( char* path, ... ) {
271 if(!path || strlen(path) < 1) return NULL;
273 osrfHash* obj = idlHash;
275 VA_LIST_TO_STRING(path);
282 token = strtok_r(t, "/", &tt);
283 if(!token) return NULL;
286 obj = osrfHashGet(obj, token);
287 } while( (token = strtok_r(NULL, "/", &tt)) && obj);