started on RouterFleXML class, still shaky and rudimentary
authorMarc Cromme <marc@indexdata.dk>
Wed, 26 Oct 2005 14:12:00 +0000 (14:12 +0000)
committerMarc Cromme <marc@indexdata.dk>
Wed, 26 Oct 2005 14:12:00 +0000 (14:12 +0000)
src/Makefile.am
src/ex_router_flexml.cpp [new file with mode: 0644]
src/router_flexml.cpp [new file with mode: 0644]
src/router_flexml.hpp [new file with mode: 0644]
src/test_router_flexml.cpp [new file with mode: 0644]

index ebbc962..51db6fb 100644 (file)
@@ -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 (file)
index 0000000..a1c1a0d
--- /dev/null
@@ -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 <iostream>
+#include <stdexcept>
+
+#include "config.hpp"
+#include "filter.hpp"
+#include "router_flexml.hpp"
+
+int main(int argc, char **argv)
+{
+   //try 
+   //{
+   
+        std::string xmlconf = "<?xml version=\"1.0\"?>\n"
+            "<yp2 xmlns=\"http://indexdata.dk/yp2/config/1\">\n"
+            "<start route=\"start\"/>\n"
+            "<filters>\n"
+            "<filter id=\"front_default\" type=\"frontend-net\">\n"
+            "<port>210</port>\n"
+            "</filter>\n"
+            "<filter id=\"log_cout\" type=\"log\">\n"
+            "<logfile>mylog.log</logfile>\n"
+            "</filter>\n"
+            "</filters>\n"
+            "<routes>\n"  
+            "<route id=\"start\">\n"
+            "<filter refid=\"front_default\"/>\n"
+            "<filter refid=\"log_cout\"/>\n"
+            "</route>\n"
+            "</routes>\n"
+            "</yp2>\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 (file)
index 0000000..914868e
--- /dev/null
@@ -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 (file)
index 0000000..0b4ca3a
--- /dev/null
@@ -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 <iostream>
+#include <stdexcept>
+
+#include <libxml/xmlversion.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlIO.h>
+#include <libxml/xmlreader.h>
+//#include <libxslt/transform.h>
+
+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 <yp2>, 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 <yp2>");
+
+        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 <yp2> 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 <start route=\"route_id\"/> expected");
+
+        std::cout << "<start " << xmlTextReaderConstName(reader) <<  "=\"" 
+                  <<  xmlTextReaderConstValue(reader) << "\"/>" << 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 <filters> expected");
+
+        std::cout << "<filters>" << std::endl;
+                  
+
+        // filter element processing
+        xml_progress_deep_to_element(reader);
+        if (std::string("filter") != (const char*)xmlTextReaderConstName(reader)
+            )
+            xml_error(reader, "filter element <filter id=\"some_id\" "
+                      "type=\"some_type\"/> 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 <filter id=\"some_id\" "
+                          "type=\"some_type\"/> expected");
+            filter_id = (const char*)xmlTextReaderConstValue(reader);
+            if (!xmlTextReaderMoveToNextAttribute(reader)
+                || std::string("type") != (const char*)xmlTextReaderConstName(reader))
+                xml_error(reader, "filter element <filter id=\"some_id\" "
+                          "type=\"some_type\"/> expected");
+            filter_type = (const char*)xmlTextReaderConstValue(reader);
+            std::cout << "<filter id=\"" << filter_id 
+                      << "\" type=\"" << filter_type << "\"/>" 
+                      << std::endl;
+            xml_progress_flat_to_element(reader);
+        }
+
+        std::cout << "</filters>" << std::endl;
+
+
+        // routes element processing
+        // xml_progress_flat_to_element(reader);
+        if (std::string("routes") != (const char*)xmlTextReaderConstName(reader)
+            )
+            xml_error(reader, "routes element <routes> expected");
+
+        std::cout << "<routes>" << std::endl;
+        // route element processing
+        xml_progress_deep_to_element(reader);
+        if (std::string("route") != (const char*)xmlTextReaderConstName(reader)
+            )
+            xml_error(reader, "route element <route id=\"some_id\" "
+                      "type=\"some_type\"/> 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 <route id=\"some_id\"/> expected");
+            route_id = (const char*)xmlTextReaderConstValue(reader);
+
+
+            std::cout << "<route id=\"" << route_id << "\">" << std::endl;
+            std::cout << "</route>" << std::endl;
+            xml_progress_flat_to_element(reader);
+        }
+
+        std::cout << "</routes>" << std::endl;
+
+        std::cout << "</yp2>" << 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 (file)
index 0000000..e9eec52
--- /dev/null
@@ -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 <iostream>
+#include <stdexcept>
+
+#include "filter.hpp"
+#include "router_flexml.hpp"
+
+#define BOOST_AUTO_TEST_MAIN
+#include <boost/test/auto_unit_test.hpp>
+
+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 = "<?xml version=\"1.0\"?>"
+            "<yp2 xmlns=\"http://indexdata.dk/yp2/config/1\">"
+            "<start route=\"start\"/>"
+            "<filters>"
+            "<filter id=\"front_default\" type=\"frontend-net\">"
+            "<port>210</port>"
+            "</filter>"
+            "<filter id=\"log_cout\" type=\"log\">"
+            "<logfile>mylog.log</logfile>"
+            "</filter>"
+            "</filters>"
+            "<routes>"  
+            "<route id=\"start\">"
+            "<filter refid=\"front_default\"/>"
+            "<filter refid=\"log_cout\"/>"
+            "</route>"
+            "</routes>"
+            "</yp2>";
+        
+        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
+ */