From: Marc Cromme Date: Wed, 26 Oct 2005 14:12:00 +0000 (+0000) Subject: started on RouterFleXML class, still shaky and rudimentary X-Git-Tag: YP2.0.0.2~171 X-Git-Url: http://sru.miketaylor.org.uk/?a=commitdiff_plain;h=c859210e9c315c0f15c93fc6f65477a6c3e65d14;hp=e9420d437bd61c8683058af046a8dd90c859b6bc;p=metaproxy-moved-to-github.git started on RouterFleXML class, still shaky and rudimentary --- diff --git a/src/Makefile.am b/src/Makefile.am index ebbc962..51db6fb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -## $Id: Makefile.am,v 1.27 2005-10-26 10:55:26 marc Exp $ +## $Id: Makefile.am,v 1.28 2005-10-26 14:12:00 marc Exp $ MAINTAINERCLEANFILES = Makefile.in config.in config.hpp @@ -12,6 +12,7 @@ libyp2_la_LDFLAGS = -version-info 0:0:0 libyp2_la_SOURCES = \ session.cpp session.hpp package.hpp filter.hpp\ router.hpp router_chain.hpp router_chain.cpp \ + router_flexml.hpp router_flexml.cpp \ thread_pool_observer.cpp thread_pool_observer.hpp \ filter_frontend_net.cpp filter_frontend_net.hpp \ filter_log.cpp filter_log.hpp \ @@ -25,11 +26,11 @@ libyp2_la_SOURCES = \ LDADD= libyp2.la $(YAZPPLALIB) $(XSLT_LIBS) bin_PROGRAMS = -noinst_PROGRAMS = ex_filter_frontend_net ex_libxml2_conf +noinst_PROGRAMS = ex_filter_frontend_net ex_libxml2_conf ex_router_flexml ex_filter_frontend_net_SOURCES = ex_filter_frontend_net.cpp ex_libxml2_conf_SOURCES = ex_libxml2_conf.cpp - +ex_router_flexml_SOURCES = ex_router_flexml.cpp # Rules for test programs.. check_PROGRAMS = \ @@ -42,7 +43,8 @@ check_PROGRAMS = \ test_filter_log \ test_filter_z3950_client \ test_filter_backend_test \ - test_filter_virt_db + test_filter_virt_db \ + test_router_flexml TESTS=$(check_PROGRAMS) @@ -59,6 +61,8 @@ test_filter_log_SOURCES = test_filter_log.cpp test_filter_z3950_client_SOURCES = test_filter_z3950_client.cpp test_filter_backend_test_SOURCES = test_filter_backend_test.cpp test_filter_virt_db_SOURCES = test_filter_virt_db.cpp +test_router_flexml_SOURCES = test_router_flexml.cpp + TESTLDADD = $(LDADD) -lboost_unit_test_framework @@ -75,6 +79,7 @@ test_filter_log_LDADD = $(TESTLDADD) test_filter_z3950_client_LDADD = $(TESTLDADD) test_filter_backend_test_LDADD = $(TESTLDADD) test_filter_virt_db_LDADD = $(TESTLDADD) +test_router_flexml_LDADD = $(TESTLDADD) # doxygen target dox: diff --git a/src/ex_router_flexml.cpp b/src/ex_router_flexml.cpp new file mode 100644 index 0000000..a1c1a0d --- /dev/null +++ b/src/ex_router_flexml.cpp @@ -0,0 +1,61 @@ +/* $Id: ex_router_flexml.cpp,v 1.1 2005-10-26 14:12:00 marc Exp $ + Copyright (c) 2005, Index Data. + +%LICENSE% + */ + +#include +#include + +#include "config.hpp" +#include "filter.hpp" +#include "router_flexml.hpp" + +int main(int argc, char **argv) +{ + //try + //{ + + std::string xmlconf = "\n" + "\n" + "\n" + "\n" + "\n" + "210\n" + "\n" + "\n" + "mylog.log\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n"; + + yp2::RouterFleXML rflexml(xmlconf); + + + + // } + //catch ( ... ) { + //std::cerr << "Unknown Exception" << std::endl; + //throw(); + //std::exit(1); + //} + std::exit(0); +} + + + + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * c-file-style: "stroustrup" + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ diff --git a/src/router_flexml.cpp b/src/router_flexml.cpp new file mode 100644 index 0000000..914868e --- /dev/null +++ b/src/router_flexml.cpp @@ -0,0 +1,19 @@ +/* $Id: router_flexml.cpp,v 1.1 2005-10-26 14:12:00 marc Exp $ + Copyright (c) 2005, Index Data. + +%LICENSE% + */ + + +#include "router_flexml.hpp" + + + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * c-file-style: "stroustrup" + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ diff --git a/src/router_flexml.hpp b/src/router_flexml.hpp new file mode 100644 index 0000000..0b4ca3a --- /dev/null +++ b/src/router_flexml.hpp @@ -0,0 +1,284 @@ +/* $Id: router_flexml.hpp,v 1.1 2005-10-26 14:12:00 marc Exp $ + Copyright (c) 2005, Index Data. + +%LICENSE% + */ + +#include +#include + +#include +#include +#include +#include +#include +//#include + +namespace yp2 +{ + + +class RouterFleXML +{ +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(); + //parse_xml_config_xmlreader(); + } + ~RouterFleXML() + { + xmlFreeDoc(m_xmlconf_doc); + } + + +private: + std::string m_xmlconf; + bool m_xinclude; + xmlDoc * m_xmlconf_doc; + + void xml_dom_error ( xmlNode* node, std::string msg) + { + std::cerr << "ERROR: " << msg << " " + << node->name << " " + << std::endl; + } + + void parse_xml_config_dom() { + if (m_xmlconf_doc) + { + xmlNode* root = xmlDocGetRootElement(m_xmlconf_doc); + + if (std::string((const char *) root->name) != "yp2") + 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 << "GOT HERE" << 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 + +}; + +}; + + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * c-file-style: "stroustrup" + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ diff --git a/src/test_router_flexml.cpp b/src/test_router_flexml.cpp new file mode 100644 index 0000000..e9eec52 --- /dev/null +++ b/src/test_router_flexml.cpp @@ -0,0 +1,69 @@ +/* $Id: test_router_flexml.cpp,v 1.1 2005-10-26 14:12:00 marc Exp $ + Copyright (c) 2005, Index Data. + +%LICENSE% + */ + +#include "config.hpp" +#include +#include + +#include "filter.hpp" +#include "router_flexml.hpp" + +#define BOOST_AUTO_TEST_MAIN +#include + +using namespace boost::unit_test; + +class TFilter: public yp2::filter::Base { +public: + void process(yp2::Package & package) const {}; +}; + + +BOOST_AUTO_TEST_CASE( test_router_flexml_1 ) +{ + try{ + TFilter filter; + + std::string xmlconf = "" + "" + "" + "" + "" + "210" + "" + "" + "mylog.log" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + + yp2::RouterFleXML rflexml(xmlconf); + + + BOOST_CHECK (true); + + //BOOST_CHECK_EQUAL(filter.name(), std::string("filter1")); + + } + catch ( ... ) { + BOOST_CHECK (false); + } +} + +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * c-file-style: "stroustrup" + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */