metaproxy 1.22.1
Private Types | Private Member Functions | Private Attributes | Friends | List of all members
metaproxy_1::RouterFleXML::Rep Class Reference
Collaboration diagram for metaproxy_1::RouterFleXML::Rep:
Collaboration graph

Private Types

typedef std::map< std::string, boost::shared_ptr< const mp::filter::Base > > IdFilterMap
 

Private Member Functions

 Rep ()
 
void base (xmlDocPtr doc, mp::FactoryFilter &factory, bool test_only, const char *file_include_path)
 
void parse_xml_config_dom (xmlDocPtr doc, bool test_only, const char *file_include_path)
 
void parse_xml_filters (xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path)
 
void parse_xml_filters1 (xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path, Route &route)
 
void parse_xml_routes (xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path)
 
void check_routes_in_filters (const xmlNode *n)
 

Private Attributes

IdFilterMap m_id_filter_map
 
std::map< std::string, RouterFleXML::Routem_routes
 
std::string m_start_route
 
std::string m_dl_path
 
bool m_xinclude
 
FactoryFilterm_factory
 

Friends

class RouterFleXML
 
class RouterFleXML::Pos
 

Detailed Description

Definition at line 47 of file router_flexml.cpp.

Member Typedef Documentation

◆ IdFilterMap

typedef std::map<std::string, boost::shared_ptr<const mp::filter::Base > > metaproxy_1::RouterFleXML::Rep::IdFilterMap
private

Definition at line 57 of file router_flexml.cpp.

Constructor & Destructor Documentation

◆ Rep()

metaproxy_1::RouterFleXML::Rep::Rep ( )
private

Definition at line 415 of file router_flexml.cpp.

415 : m_xinclude(false)
416{
417}

Member Function Documentation

◆ base()

void metaproxy_1::RouterFleXML::Rep::base ( xmlDocPtr  doc,
mp::FactoryFilter factory,
bool  test_only,
const char file_include_path 
)
private

Definition at line 419 of file router_flexml.cpp.

421{
423 m_start_route = "start";
425}
void parse_xml_config_dom(xmlDocPtr doc, bool test_only, const char *file_include_path)

References metaproxy_1::RouterFleXML::start().

Here is the call graph for this function:

◆ check_routes_in_filters()

void metaproxy_1::RouterFleXML::Rep::check_routes_in_filters ( const xmlNode n)
private

Definition at line 272 of file router_flexml.cpp.

273{
274 while (node)
275 {
276 if (mp::xml::is_element_mp(node, "filters"))
277 {
278 const xmlNode *n =
279 mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
281 }
282 else if (mp::xml::is_element_mp(node, "filter"))
283 {
284 const xmlNode *n =
285 mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
286 while (n)
287 {
288 const struct _xmlAttr *attr;
289 // we assume thar that route attribute is only at one level
290 // below filter.. At least that works for multi and virt_db.
291 for (attr = n->properties; attr; attr = attr->next)
292 {
293 if (!strcmp((const char *) attr->name, "route"))
294 {
295 std::string value;
296
297 if (attr->children && attr->children->type == XML_TEXT_NODE)
298 value = std::string((const char *)attr->children->content);
299
300 std::map<std::string,RouterFleXML::Route>::iterator it;
301 it = m_routes.find(value);
302 if (it == m_routes.end())
303 {
304 throw mp::XMLError("Route '" + value + "' does not exist");
305 }
306 }
307 }
308 n = mp::xml::jump_to_next(n, XML_ELEMENT_NODE);
309 }
310 }
311 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
312 }
313}
void check_routes_in_filters(const xmlNode *n)
std::map< std::string, RouterFleXML::Route > m_routes

◆ parse_xml_config_dom()

void metaproxy_1::RouterFleXML::Rep::parse_xml_config_dom ( xmlDocPtr  doc,
bool  test_only,
const char file_include_path 
)
private

Definition at line 315 of file router_flexml.cpp.

318{
319 if (!doc)
320 throw mp::XMLError("Empty XML Document");
321
323
325 {
328 if (r)
329 throw mp::XMLError("YAZ XML Include failed");
330 }
331
332 mp::xml::check_element_mp(root, "metaproxy");
333
334 const xmlNode* node = mp::xml::jump_to_children(root, XML_ELEMENT_NODE);
335
336 if (mp::xml::is_element_mp(node, "dlpath"))
337 {
338 m_dl_path = mp::xml::get_text(node);
339 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
340 }
341 // process <start> node which is expected first element node
342 if (mp::xml::check_element_mp(node, "start"))
343 {
344 const struct _xmlAttr *attr;
345 for (attr = node->properties; attr; attr = attr->next)
346 {
347 std::string name = std::string((const char *) attr->name);
348 std::string value;
349
350 if (attr->children && attr->children->type == XML_TEXT_NODE)
351 value = std::string((const char *)attr->children->content);
352
353 if (name == "route")
354 m_start_route = value;
355 else if (name == "base")
356 ;// Ignore XInclude base attribute.
357 else
358 throw mp::XMLError("Only attribute route allowed"
359 " in element 'start'. Got " + name);
360 }
361 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
362 }
363 // process <filters> node if given
364 if (mp::xml::is_element_mp(node, "filters"))
365 {
366 parse_xml_filters(doc, mp::xml::jump_to_children(node,
369
370 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
371 }
372 // process <routes> node which is expected third element node
373 mp::xml::check_element_mp(node, "routes");
374
375 parse_xml_routes(doc, mp::xml::jump_to_children(node, XML_ELEMENT_NODE),
377
378 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
379 if (node)
380 {
381 throw mp::XMLError("Unexpected element "
382 + std::string((const char *)node->name));
383 }
384
385 node = mp::xml::jump_to_children(root, XML_ELEMENT_NODE);
386 while (node)
387 {
388 if (mp::xml::is_element_mp(node, "filters"))
390 mp::xml::jump_to_children(node,
392 else if (mp::xml::is_element_mp(node, "routes"))
393 {
394 const xmlNode* n = mp::xml::jump_to_children(node,
396 while (n)
397 {
398 if (mp::xml::is_element_mp(n, "route"))
399 {
401 mp::xml::jump_to_children(n, XML_ELEMENT_NODE));
402
403 }
404 n = mp::xml::jump_to_next(n, XML_ELEMENT_NODE);
405 }
406 }
407 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
408 }
409 std::map<std::string,RouterFleXML::Route>::iterator it;
410 it = m_routes.find(m_start_route);
411 if (it == m_routes.end())
412 throw mp::XMLError("Start route '" + m_start_route + "' not found");
413}
void parse_xml_filters(xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path)
void parse_xml_routes(xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path)

◆ parse_xml_filters()

void metaproxy_1::RouterFleXML::Rep::parse_xml_filters ( xmlDocPtr  doc,
const xmlNode node,
bool  test_only,
const char file_include_path 
)
private

Definition at line 97 of file router_flexml.cpp.

101{
102 unsigned int filter_nr = 0;
103 while (node && mp::xml::check_element_mp(node, "filter"))
104 {
105 filter_nr++;
106
107 const struct _xmlAttr *attr;
108 std::string id_value;
109 std::string type_value;
110 for (attr = node->properties; attr; attr = attr->next)
111 {
112 std::string name = std::string((const char *) attr->name);
113 std::string value;
114
115 if (attr->children && attr->children->type == XML_TEXT_NODE)
116 value = std::string((const char *)attr->children->content);
117
118 if (name == "id")
119 id_value = value;
120 else if (name == "type")
121 type_value = value;
122 else if (name == "base")
123 ;// Ignore XInclude base attribute.
124 else
125 throw mp::XMLError("Only attribute id or type allowed"
126 " in filter element. Got " + name);
127 }
128
130 {
131 yaz_log(YLOG_LOG, "Loading %s (dlpath %s)",
132 type_value.c_str(), m_dl_path.c_str());
134 }
135 boost::shared_ptr<mp::filter::Base> fb(m_factory->create(type_value));
136
137 fb->configure(node, test_only, file_include_path);
138
139 if (m_id_filter_map.find(id_value) != m_id_filter_map.end())
140 throw mp::XMLError("Filter " + id_value + " already defined");
141
143
144 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
145 }
146}
metaproxy_1::filter::Base * create(std::string fi)
bool add_creator_dl(const std::string &fi, const std::string &path)
bool exist(std::string fi)

◆ parse_xml_filters1()

void metaproxy_1::RouterFleXML::Rep::parse_xml_filters1 ( xmlDocPtr  doc,
const xmlNode node,
bool  test_only,
const char file_include_path,
Route route 
)
private

Definition at line 148 of file router_flexml.cpp.

153{
154 while (node)
155 {
156 if (mp::xml::is_element_mp(node, "filters"))
157 {
158 const xmlNode* node1 =
159 mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
160
162 }
163 else if (mp::xml::check_element_mp(node, "filter"))
164 {
165 const struct _xmlAttr *attr;
166 std::string refid_value;
167 std::string type_value;
168 for (attr = node->properties; attr; attr = attr->next)
169 {
170 std::string name = std::string((const char *) attr->name);
171 std::string value;
172
173 if (attr->children && attr->children->type == XML_TEXT_NODE)
174 value = std::string((const char *)attr->children->content);
175
176 if (name == "refid")
177 refid_value = value;
178 else if (name == "type")
179 type_value = value;
180 else if (name == "base")
181 ;// Ignore XInclude base attribute.
182 else
183 throw mp::XMLError("Only attribute 'refid' or 'type'"
184 " allowed for element 'filter'."
185 " Got " + name);
186 }
187 if (refid_value.length())
188 {
189 std::map<std::string,
190 boost::shared_ptr<const mp::filter::Base > >::iterator it;
191 it = m_id_filter_map.find(refid_value);
192 if (it == m_id_filter_map.end())
193 throw mp::XMLError("Unknown filter refid "
194 + refid_value);
195 else
196 route.m_list.push_back(it->second);
197 }
198 else if (type_value.length())
199 {
201 {
202 yaz_log(YLOG_LOG, "Loading %s (dlpath %s)",
203 type_value.c_str(), m_dl_path.c_str());
205 }
206 boost::shared_ptr<mp::filter::Base>
208
210
211 route.m_list.push_back(filter_base);
212 }
213
214 }
215 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
216 }
217}
void parse_xml_filters1(xmlDocPtr doc, const xmlNode *node, bool test_only, const char *file_include_path, Route &route)

References metaproxy_1::RouterFleXML::Route::m_list.

◆ parse_xml_routes()

void metaproxy_1::RouterFleXML::Rep::parse_xml_routes ( xmlDocPtr  doc,
const xmlNode node,
bool  test_only,
const char file_include_path 
)
private

Definition at line 220 of file router_flexml.cpp.

224{
225 mp::xml::check_element_mp(node, "route");
226
227 unsigned int route_nr = 0;
228 while (mp::xml::is_element_mp(node, "route"))
229 {
230 route_nr++;
231
232 const struct _xmlAttr *attr;
233 std::string id_value;
234 for (attr = node->properties; attr; attr = attr->next)
235 {
236 std::string name = std::string((const char *) attr->name);
237 std::string value;
238
239 if (attr->children && attr->children->type == XML_TEXT_NODE)
240 value = std::string((const char *)attr->children->content);
241
242 if (name == "id")
243 id_value = value;
244 else if (name == "base")
245 ;// Ignore XInclude base attribute.
246 else
247 throw mp::XMLError("Only attribute 'id' allowed for"
248 " element 'route'."
249 " Got " + name);
250 }
251
252 Route route;
253
254 // process <filter> / <filters> nodes in third level
255 const xmlNode* node3 = mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
256
257
258
260
261 std::map<std::string,RouterFleXML::Route>::iterator it;
262 it = m_routes.find(id_value);
263 if (it != m_routes.end())
264 throw mp::XMLError("Route id='" + id_value
265 + "' already exist");
266 else
267 m_routes[id_value] = route;
268 node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
269 }
270}

Friends And Related Symbol Documentation

◆ RouterFleXML

Definition at line 48 of file router_flexml.cpp.

◆ RouterFleXML::Pos

Definition at line 49 of file router_flexml.cpp.

Member Data Documentation

◆ m_dl_path

std::string metaproxy_1::RouterFleXML::Rep::m_dl_path
private

Definition at line 65 of file router_flexml.cpp.

◆ m_factory

FactoryFilter* metaproxy_1::RouterFleXML::Rep::m_factory
private

Definition at line 81 of file router_flexml.cpp.

◆ m_id_filter_map

IdFilterMap metaproxy_1::RouterFleXML::Rep::m_id_filter_map
private

Definition at line 59 of file router_flexml.cpp.

◆ m_routes

std::map<std::string,RouterFleXML::Route> metaproxy_1::RouterFleXML::Rep::m_routes
private

Definition at line 61 of file router_flexml.cpp.

◆ m_start_route

std::string metaproxy_1::RouterFleXML::Rep::m_start_route
private

Definition at line 63 of file router_flexml.cpp.

◆ m_xinclude

bool metaproxy_1::RouterFleXML::Rep::m_xinclude
private

Definition at line 79 of file router_flexml.cpp.


The documentation for this class was generated from the following file: