X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frouter_flexml.hpp;h=9b5d890361a0fdf5550361d08897b62778f84815;hb=HEAD;hp=08744e36c2a72db3e6a5731bb0298b0072710597;hpb=35f51b468b01c18772b50d15a4586a15fe4f6b50;p=metaproxy-moved-to-github.git diff --git a/src/router_flexml.hpp b/src/router_flexml.hpp index 08744e3..9b5d890 100644 --- a/src/router_flexml.hpp +++ b/src/router_flexml.hpp @@ -1,402 +1,63 @@ -/* $Id: router_flexml.hpp,v 1.5 2005-10-31 11:59:08 marc Exp $ - Copyright (c) 2005, Index Data. - - %LICENSE% +/* This file is part of Metaproxy. + 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 +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "router.hpp" +#ifndef ROUTER_FLEXML_HPP +#define ROUTER_FLEXML_HPP -#include -#include -#include -#include +#include -#include -#include -#include +#include "factory_filter.hpp" -#include +#include +#include -namespace yp2 +namespace metaproxy_1 { - - - class RouterFleXML : public yp2::Router + class RouterFleXML : public metaproxy_1::Router { + class Rep; + class Route; + class Pos; public: - RouterFleXML(std::string xmlconf) - : m_xmlconf(""), m_xinclude(false), m_xmlconf_doc(0) - { - LIBXML_TEST_VERSION; - - m_xmlconf = xmlconf; - m_xinclude = false; - - m_xmlconf_doc - = xmlParseMemory(m_xmlconf.c_str(), m_xmlconf.size()); - - parse_xml_config_dom(); - } + RouterFleXML(std::string xmlconf, metaproxy_1::FactoryFilter &factory, + bool test_only); + RouterFleXML(xmlDocPtr doc, metaproxy_1::FactoryFilter &factory, + bool test_only, const char *file_include_path); - ~RouterFleXML() - { - xmlFreeDoc(m_xmlconf_doc); - } - - - private: - typedef std::map > - IdFilterMap ; - typedef std::list FilterIdList; - typedef std::map IdRouteMap ; + ~RouterFleXML(); + virtual RoutePos *createpos() const; + void start(); + void stop(int signo); private: - - std::string m_xmlconf; - bool m_xinclude; - xmlDoc * m_xmlconf_doc; - IdFilterMap m_id_filter_map; - FilterIdList m_filter_id_list; - IdRouteMap m_id_route_map; - - //boost::shared_ptr s_ptr(new T(t)); - - - void xml_dom_error (const xmlNode* node, std::string msg) - { - std::cerr << "ERROR: " << msg << " <" - << node->name << ">" - << std::endl; - } - - void create_filter(std::string type, - const xmlDoc * xmldoc, - std::string id = "") - { - std::cout << "Created Filter type='" << type - << "' id='" << id << "'" << std::endl; - } - - - void parse_xml_config_dom() { - - if (!m_xmlconf_doc){ - std::cerr << "XML configuration DOM pointer empty" << std::endl; - } - - const xmlNode* root = xmlDocGetRootElement(m_xmlconf_doc); - - if ((std::string((const char *) root->name) != "yp2") - || (std::string((const char *)(root->ns->href)) - != "http://indexdata.dk/yp2/config/1") - ) - xml_dom_error(root, - "expected , got "); - - - for (const struct _xmlAttr *attr = root->properties; attr; attr = attr->next) - { - if (std::string((const char *)attr->name) == "xmlns") - { - const xmlNode *val = attr->children; - if (std::string((const char *)val->content) - != "http://indexdata.dk/yp2/config/1") - xml_dom_error(root, - "expected xmlns=\"http://indexdata.dk/yp2/config/1\", got "); - } - } - std::cout << "processing /yp2" << std::endl; - - // process node which is expected first element node - const xmlNode* node = jump_to_children(root, XML_ELEMENT_NODE); - //for (; node && node->type != XML_ELEMENT_NODE; node = node->next) - // ; - - check_node_name(node, "start"); - std::cout << "processing /yp2/start" << std::endl; - - // process node which is expected second element node - node = jump_to_next(node, XML_ELEMENT_NODE); - check_node_name(node, "filters"); - std::cout << "processing /yp2/filters" << std::endl; - - // process nodes in next level - const xmlNode* node2 = jump_to_children(node, XML_ELEMENT_NODE); - check_node_name(node2, "filter"); - - unsigned int filter_nr = 0; - while(node2 && std::string((const char *)node2->name) == "filter"){ - filter_nr++; - std::cout << "processing /yp2/filters/filter[" - << filter_nr << "]" << std::endl; - node2 = jump_to_next(node2, XML_ELEMENT_NODE); - } - - // process node which is expected third element node - node = jump_to_next(node, XML_ELEMENT_NODE); - check_node_name(node, "routes"); - std::cout << "processing /yp2/routes" << std::endl; - - // process nodes in next level - node2 = jump_to_children(node, XML_ELEMENT_NODE); - check_node_name(node2, "route"); - - unsigned int route_nr = 0; - while(node2 && std::string((const char *)node2->name) == "route"){ - route_nr++; - std::cout << "processing /yp2/routes/route[" - << route_nr << "]" << std::endl; - - // process nodes in third level - const xmlNode* node3 - = jump_to_children(node2, XML_ELEMENT_NODE); - check_node_name(node3, "filter"); - - unsigned int filter3_nr = 0; - while(node3 && std::string((const char *)node3->name) == "filter"){ - filter3_nr++; - - std::cout << "processing /yp2/routes/route[" - << route_nr << "]/filter[" - << filter3_nr << "]" << std::endl; - - node3 = jump_to_next(node3, XML_ELEMENT_NODE); - - } - node2 = jump_to_next(node2, XML_ELEMENT_NODE); - } - - - } - - - const xmlNode* jump_to(const xmlNode* node, int xml_node_type){ - for (; node && node->type != xml_node_type; node = node->next) - ; - return node; - } - - const xmlNode* jump_to_next(const xmlNode* node, int xml_node_type){ - node = node->next; - for (; node && node->type != xml_node_type; node = node->next) - ; - return node; - } - - const xmlNode* jump_to_children(const xmlNode* node, int xml_node_type){ - node = node->children; - for (; node && node->type != xml_node_type; node = node->next) - ; - return node; - } - - void check_node_name(const xmlNode* node, std::string name){ - if (std::string((const char *)node->name) - != name) - xml_dom_error(node, "expected <" + name + ">, got "); - } - - -#if 0 - - void parse_xml_config_xmlreader() { - - xmlTextReader* reader; - //reader->SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1); - int ret; - //reader = xmlReaderForFile(m_xmlconf.c_str(), NULL, 0); - reader = xmlReaderWalker(m_xmlconf_doc); - - if (reader == NULL) { - std::cerr << "failed to read XML config file " - << std::endl - << m_xmlconf << std::endl; - std::exit(1); - } - - - // root element processing - xml_progress_deep_to_element(reader); - if (std::string("yp2") != (const char*)xmlTextReaderConstName(reader)) - xml_error(reader, "root element must be named "); - - std::cout << "<" << xmlTextReaderConstName(reader); - - //if (xmlTextReaderHasAttributes(reader)) - //if ((!xmlTextReaderMoveToAttributeNs(reader, NULL, - // (const xmlChar*)"http://indexdata.dk/yp2/config/1" ))) - if ((!xmlTextReaderMoveToFirstAttribute(reader)) - || (! xmlTextReaderIsNamespaceDecl(reader)) - || (std::string("http://indexdata.dk/yp2/config/1") - != (const char*)xmlTextReaderConstValue(reader))) - xml_error(reader, "expected root element in namespace " - "'http://indexdata.dk/yp2/config/1'"); - - std::cout << " " << xmlTextReaderConstName(reader) << "=\"" - << xmlTextReaderConstValue(reader) << "\">" - //<< xmlTextReaderIsNamespaceDecl(reader) - << std::endl; - - - // start element processing - xml_progress_deep_to_element(reader); - if (std::string("start") != (const char*)xmlTextReaderConstName(reader) - || !xmlTextReaderMoveToFirstAttribute(reader) - || std::string("route") != (const char*)xmlTextReaderConstName(reader) - ) - xml_error(reader, "start element expected"); - std::cout << "" << std::endl; - //<< xmlTextReaderGetAttribute(reader, (const xmlChar *)"route") - - - // filters element processing - xml_progress_flat_to_element(reader); - - if (std::string("filters") != (const char*)xmlTextReaderConstName(reader) - ) - xml_error(reader, "filters element expected"); - - std::cout << "" << std::endl; - - - // filter element processing - xml_progress_deep_to_element(reader); - if (std::string("filter") != (const char*)xmlTextReaderConstName(reader) - ) - xml_error(reader, "filter element expected"); - - while (std::string("filter") == (const char*)xmlTextReaderConstName(reader)){ - std::string filter_id; - std::string filter_type; - if (!xmlTextReaderMoveToFirstAttribute(reader) - || std::string("id") != (const char*)xmlTextReaderConstName(reader)) - xml_error(reader, "filter element expected"); - filter_id = (const char*)xmlTextReaderConstValue(reader); - if (!xmlTextReaderMoveToNextAttribute(reader) - || std::string("type") != (const char*)xmlTextReaderConstName(reader)) - xml_error(reader, "filter element expected"); - filter_type = (const char*)xmlTextReaderConstValue(reader); - std::cout << "" - << std::endl; - xml_progress_flat_to_element(reader); - } - - std::cout << "" << std::endl; - - - // routes element processing - // xml_progress_flat_to_element(reader); - if (std::string("routes") != (const char*)xmlTextReaderConstName(reader) - ) - xml_error(reader, "routes element expected"); - - std::cout << "" << std::endl; - // route element processing - xml_progress_deep_to_element(reader); - if (std::string("route") != (const char*)xmlTextReaderConstName(reader) - ) - xml_error(reader, "route element expected"); - while (std::string("route") == (const char*)xmlTextReaderConstName(reader)){ - std::string route_id; - if (!xmlTextReaderMoveToFirstAttribute(reader) - || std::string("id") != (const char*)xmlTextReaderConstName(reader)) - xml_error(reader, "route element expected"); - route_id = (const char*)xmlTextReaderConstValue(reader); - - - std::cout << "" << std::endl; - std::cout << "" << std::endl; - xml_progress_flat_to_element(reader); - } - - std::cout << "" << std::endl; - - std::cout << "" << std::endl; - - xml_debug_print(reader); - - - // freeing C xml reader libs - xmlFreeTextReader(reader); - if (ret != 0) { - std::cerr << "Parsing failed of XML configuration" - << std::endl - << m_xmlconf << std::endl; - std::exit(1); - } - } - - void xml_error ( xmlTextReader* reader, std::string msg) - { - std::cerr << "ERROR: " << msg << " " - << xmlTextReaderGetParserLineNumber(reader) << ":" - << xmlTextReaderGetParserColumnNumber(reader) << " " - << xmlTextReaderConstName(reader) << " " - << xmlTextReaderDepth(reader) << " " - << xmlTextReaderNodeType(reader) << std::endl; - } - - void xml_debug_print ( xmlTextReader* reader) - { - // processing all other elements - //while (xmlTextReaderMoveToElement(reader)) // reads next element ?? - //while (xmlTextReaderNext(reader)) //does not descend, keeps level - while (xmlTextReaderRead(reader)) // descends into all subtree nodes - std::cout << xmlTextReaderGetParserLineNumber(reader) << ":" - << xmlTextReaderGetParserColumnNumber(reader) << " " - << xmlTextReaderDepth(reader) << " " - << xmlTextReaderNodeType(reader) << " " - << "ConstName " << xmlTextReaderConstName(reader) << " " - << std::endl; - } - - bool xml_progress_deep_to_element(xmlTextReader* reader) - { - bool ret = false; - while(xmlTextReaderRead(reader) - && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE - && !( xmlTextReaderNodeType(reader) - == XML_READER_TYPE_END_ELEMENT - && 0 == xmlTextReaderDepth(reader)) - ) - ret = true; - return ret; - } - - bool xml_progress_flat_to_element(xmlTextReader* reader) - { - bool ret = false; - - while(xmlTextReaderNext(reader) - && xmlTextReaderNodeType(reader) != XML_ELEMENT_NODE - && !( xmlTextReaderNodeType(reader) - == XML_READER_TYPE_END_ELEMENT - && 0 == xmlTextReaderDepth(reader)) - ) { - ret = true; - } - return ret; - } - -#endif - + boost::scoped_ptr m_p; }; - -}; +}; +#endif /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil - * c-file-style: "stroustrup" * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +