X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frouter_flexml.cpp;h=54232de4682896b5563e3bed92b54f47094914cc;hb=9fcdfa67cc281509e0f11e1f2aba255718a80cbd;hp=7e5bbbbaf10f8766e36f880900890c2d395e5b59;hpb=50597d2f7d3607e91c94601eb8eb495d73be3eae;p=metaproxy-moved-to-github.git diff --git a/src/router_flexml.cpp b/src/router_flexml.cpp index 7e5bbbb..54232de 100644 --- a/src/router_flexml.cpp +++ b/src/router_flexml.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2012 Index Data + Copyright (C) Index Data Metaproxy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -88,7 +88,7 @@ namespace metaproxy_1 { virtual ~Pos(); mp::RouterFleXML::Rep *m_p; - std::map::iterator m_route_it; std::list >::iterator m_filter_it; }; @@ -119,6 +119,8 @@ void mp::RouterFleXML::Rep::parse_xml_filters(xmlDocPtr doc, id_value = value; else if (name == "type") type_value = value; + else if (name == "base") + ;// Ignore XInclude base attribute. else throw mp::XMLError("Only attribute id or type allowed" " in filter element. Got " + name); @@ -130,15 +132,14 @@ void mp::RouterFleXML::Rep::parse_xml_filters(xmlDocPtr doc, type_value.c_str(), m_dl_path.c_str()); m_factory->add_creator_dl(type_value, m_dl_path); } - mp::filter::Base* filter_base = m_factory->create(type_value); + boost::shared_ptr fb(m_factory->create(type_value)); - filter_base->configure(node, test_only, file_include_path); + fb->configure(node, test_only, file_include_path); if (m_id_filter_map.find(id_value) != m_id_filter_map.end()) throw mp::XMLError("Filter " + id_value + " already defined"); - m_id_filter_map[id_value] = - boost::shared_ptr(filter_base); + m_id_filter_map[id_value] = fb; node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE); } @@ -168,14 +169,16 @@ void mp::RouterFleXML::Rep::parse_xml_filters1(xmlDocPtr doc, { std::string name = std::string((const char *) attr->name); std::string value; - + if (attr->children && attr->children->type == XML_TEXT_NODE) value = std::string((const char *)attr->children->content); - + if (name == "refid") refid_value = value; else if (name == "type") type_value = value; + else if (name == "base") + ;// Ignore XInclude base attribute. else throw mp::XMLError("Only attribute 'refid' or 'type'" " allowed for element 'filter'." @@ -201,13 +204,13 @@ void mp::RouterFleXML::Rep::parse_xml_filters1(xmlDocPtr doc, m_factory->add_creator_dl(type_value, m_dl_path); } mp::filter::Base* filter_base = m_factory->create(type_value); - + filter_base->configure(node, test_only, file_include_path); - + route.m_list.push_back( boost::shared_ptr(filter_base)); } - + } node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE); } @@ -232,12 +235,14 @@ void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc, { std::string name = std::string((const char *) attr->name); std::string value; - + if (attr->children && attr->children->type == XML_TEXT_NODE) value = std::string((const char *)attr->children->content); - + if (name == "id") id_value = value; + else if (name == "base") + ;// Ignore XInclude base attribute. else throw mp::XMLError("Only attribute 'id' allowed for" " element 'route'." @@ -248,6 +253,9 @@ void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc, // process / nodes in third level const xmlNode* node3 = mp::xml::jump_to_children(node, XML_ELEMENT_NODE); + + + parse_xml_filters1(doc, node3, test_only, file_include_path, route); std::map::iterator it; @@ -285,10 +293,10 @@ void mp::RouterFleXML::Rep::check_routes_in_filters(const xmlNode *node) if (!strcmp((const char *) attr->name, "route")) { std::string value; - + if (attr->children && attr->children->type == XML_TEXT_NODE) value = std::string((const char *)attr->children->content); - + std::map::iterator it; it = m_routes.find(value); if (it == m_routes.end()) @@ -310,16 +318,17 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc, { if (!doc) throw mp::XMLError("Empty XML Document"); - + const xmlNode* root = xmlDocGetRootElement(doc); if (file_include_path) { - int r = yaz_xml_include_simple((xmlNode *) root, file_include_path); + int r = yaz_xml_include_glob((xmlNode *) root, file_include_path, + YAZ_FILE_GLOB_FAIL_NOTEXIST); if (r) throw mp::XMLError("YAZ XML Include failed"); } - + mp::xml::check_element_mp(root, "metaproxy"); const xmlNode* node = mp::xml::jump_to_children(root, XML_ELEMENT_NODE); @@ -343,6 +352,8 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc, if (name == "route") m_start_route = value; + else if (name == "base") + ;// Ignore XInclude base attribute. else throw mp::XMLError("Only attribute route allowed" " in element 'start'. Got " + name); @@ -355,19 +366,19 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc, parse_xml_filters(doc, mp::xml::jump_to_children(node, XML_ELEMENT_NODE), test_only, file_include_path); - + node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE); } // process node which is expected third element node mp::xml::check_element_mp(node, "routes"); - + parse_xml_routes(doc, mp::xml::jump_to_children(node, XML_ELEMENT_NODE), test_only, file_include_path); node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE); if (node) { - throw mp::XMLError("Unexpected element " + throw mp::XMLError("Unexpected element " + std::string((const char *)node->name)); } @@ -388,7 +399,7 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc, { check_routes_in_filters( mp::xml::jump_to_children(n, XML_ELEMENT_NODE)); - + } n = mp::xml::jump_to_next(n, XML_ELEMENT_NODE); } @@ -417,11 +428,9 @@ mp::RouterFleXML::RouterFleXML(xmlDocPtr doc, mp::FactoryFilter &factory, } mp::RouterFleXML::RouterFleXML(std::string xmlconf, mp::FactoryFilter &factory, - bool test_only) + bool test_only) : m_p(new Rep) -{ - LIBXML_TEST_VERSION; - +{ xmlDocPtr doc = xmlParseMemory(xmlconf.c_str(), xmlconf.size()); if (!doc) @@ -503,6 +512,24 @@ void mp::RouterFleXML::start() } } +void mp::RouterFleXML::stop(int signo) +{ + std::map::iterator route_it; + + route_it = m_p->m_routes.begin(); + while (route_it != m_p->m_routes.end()) + { + RouterFleXML::Route route = route_it->second; + + std::list >::iterator it; + + for (it = route.m_list.begin(); it != route.m_list.end(); it++) + (*it)->stop(signo); + route_it++; + } +} + + /* * Local variables: * c-basic-offset: 4