X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Frouter_flexml.hpp;h=9b5d890361a0fdf5550361d08897b62778f84815;hb=6692b8d5ffb2da3cd727a66c479d91a0218dba4e;hp=f3d4e6fd43bdfadbbb36196b6e43c61f35600c22;hpb=85ecf2d319600d7354283f75ec48eea91fca43a6;p=metaproxy-moved-to-github.git diff --git a/src/router_flexml.hpp b/src/router_flexml.hpp index f3d4e6f..9b5d890 100644 --- a/src/router_flexml.hpp +++ b/src/router_flexml.hpp @@ -1,389 +1,63 @@ -/* $Id: router_flexml.hpp,v 1.3 2005-10-27 11:36:21 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 -//#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; + 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); - m_xmlconf_doc - = xmlParseMemory(m_xmlconf.c_str(), m_xmlconf.size()); + ~RouterFleXML(); - parse_xml_config_dom(); - //parse_xml_config_xmlreader(); - } - - ~RouterFleXML() - { - xmlFreeDoc(m_xmlconf_doc); - } - - + virtual RoutePos *createpos() const; + void start(); + void stop(int signo); private: - typedef std::map > - IdFilterMap ; - typedef std::list FilterIdList; - typedef std::map IdRouteMap ; - - 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() { - //xmlNs *yp2_ns = xmlNewNs(pptr, BAD_CAST - // "http://indexdata.dk/yp2/config/1", 0); - - - - if (m_xmlconf_doc) - { - 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; - //BOOST_CHECK_EQUAL(val->type, XML_TEXT_NODE); - 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 = root->children; - for (; node && node->type != XML_ELEMENT_NODE; node = node->next) - ; - if (std::string((const char *)node->name) - != "start") - xml_dom_error(root, "expected , got "); - - std::cout << "processing /yp2/start" << std::endl; - - // process node which is expected second element node - node = node->next; - for (; node && node->type != XML_ELEMENT_NODE; node = node->next) - ; - if (std::string((const char *)node->name) - != "filters") - xml_dom_error(root, "expected , got "); - - std::cout << "processing /yp2/filters" << std::endl; - - // process nodes in next level - const xmlNode* node2 = node->children; - for (; node2 && node2->type != XML_ELEMENT_NODE; node2 = node2->next) - ; - if (std::string((const char *)node2->name) - != "filter") - xml_dom_error(root, "expected , got "); - - while(node2 && std::string((const char *)node2->name) == "filter"){ - std::cout << "processing /yp2/filters/filter" << std::endl; - for (; node2 && node2->type != XML_ELEMENT_NODE; node2 = node2->next) - std::cout << (const char *) root->name << std::endl; - if(node2->type != XML_ELEMENT_NODE) - break; - } - - // process node which is expected third element node - node = node->next; - for (; node && node->type != XML_ELEMENT_NODE; node = node->next) - ; - if (std::string((const char *)node->name) - != "routes") - xml_dom_error(root, "expected , got "); - - std::cout << "processing /yp2/routes" << std::endl; - - // process nodes in next level - node2 = node->children; - for (; node2 && node2->type != XML_ELEMENT_NODE; node2 = node2->next) - ; - if (std::string((const char *)node2->name) - != "route") - xml_dom_error(root, "expected , got "); - - std::cout << "processing /yp2/routes/route" << std::endl; - - // process nodes in third level - const xmlNode* node3 = node2->children; - for (; node3 && node3->type != XML_ELEMENT_NODE; node3 = node3->next) - ; - if (std::string((const char *)node3->name) - != "filter") - xml_dom_error(root, "expected , got "); - - std::cout << "processing /yp2/routes/route/filter" << std::endl; - } - } - - - -#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 */ +