PackageLogger control by SRU opt x-log-anable
[metaproxy-moved-to-github.git] / src / router_flexml.cpp
index 0a019eb..a904d6e 100644 (file)
@@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 #include "config.hpp"
 #include <metaproxy/xmlutil.hpp>
+#include <string.h>
 #include "router_flexml.hpp"
 #include "factory_filter.hpp"
 #include "factory_static.hpp"
@@ -67,9 +68,10 @@ namespace metaproxy_1 {
                                   const char *file_include_path);
 
         void parse_xml_filters(xmlDocPtr doc, const xmlNode *node,
-            bool test_only);
+                               bool test_only, const char *file_include_path);
         void parse_xml_routes(xmlDocPtr doc, const xmlNode *node,
-            bool test_only);
+                              bool test_only, const char *file_include_path);
+        void check_routes_in_filters(const xmlNode *n);
 
         bool m_xinclude;
     private:
@@ -91,10 +93,11 @@ namespace metaproxy_1 {
 
 void mp::RouterFleXML::Rep::parse_xml_filters(xmlDocPtr doc,
                                               const xmlNode *node,
-                                              bool test_only)
+                                              bool test_only,
+                                              const char *file_include_path)
 {
     unsigned int filter_nr = 0;
-    while(node && mp::xml::check_element_mp(node, "filter"))
+    while (node && mp::xml::check_element_mp(node, "filter"))
     {
         filter_nr++;
 
@@ -126,7 +129,7 @@ void mp::RouterFleXML::Rep::parse_xml_filters(xmlDocPtr doc,
         }
         mp::filter::Base* filter_base = m_factory->create(type_value);
 
-        filter_base->configure(node, test_only);
+        filter_base->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");
@@ -140,12 +143,13 @@ void mp::RouterFleXML::Rep::parse_xml_filters(xmlDocPtr doc,
 
 void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc,
                                              const xmlNode *node,
-                                             bool test_only)
+                                             bool test_only,
+                                             const char *file_include_path)
 {
     mp::xml::check_element_mp(node, "route");
 
     unsigned int route_nr = 0;
-    while(mp::xml::is_element_mp(node, "route"))
+    while (mp::xml::is_element_mp(node, "route"))
     {
         route_nr++;
 
@@ -173,7 +177,7 @@ void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc,
         const xmlNode* node3 = mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
 
         unsigned int filter3_nr = 0;
-        while(node3 && mp::xml::check_element_mp(node3, "filter"))
+        while (node3 && mp::xml::check_element_mp(node3, "filter"))
         {
             filter3_nr++;
             
@@ -218,7 +222,7 @@ void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc,
                 }
                 mp::filter::Base* filter_base = m_factory->create(type_value);
 
-                filter_base->configure(node3, test_only);
+                filter_base->configure(node3, test_only, file_include_path);
                 
                 route.m_list.push_back(
                     boost::shared_ptr<mp::filter::Base>(filter_base));
@@ -237,6 +241,43 @@ void mp::RouterFleXML::Rep::parse_xml_routes(xmlDocPtr doc,
     }
 }
 
+void mp::RouterFleXML::Rep::check_routes_in_filters(const xmlNode *node)
+{
+    while (node)
+    {
+        if (mp::xml::is_element_mp(node, "filter"))
+        {
+            const xmlNode *n =
+                mp::xml::jump_to_children(node, XML_ELEMENT_NODE);
+            while (n)
+            {
+                const struct _xmlAttr *attr;
+                // we assume thar that route attribute is only at one level
+                // below filter.. At least that works for multi and virt_db.
+                for (attr = n->properties; attr; attr = attr->next)
+                {
+                    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<std::string,RouterFleXML::Route>::iterator it;
+                        it = m_routes.find(value);
+                        if (it == m_routes.end())
+                        {
+                            throw mp::XMLError("Route '" + value + "' does not exist");
+                        }
+                    }
+                }
+                n = mp::xml::jump_to_next(n, XML_ELEMENT_NODE);
+            }
+        }
+        node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
+    }
+}
+
 void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc,
                                                  bool test_only,
                                                  const char *file_include_path)
@@ -266,7 +307,6 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc,
     if (mp::xml::check_element_mp(node, "start"))
     {
         const struct _xmlAttr *attr;
-        std::string id_value;
         for (attr = node->properties; attr; attr = attr->next)
         {
             std::string name = std::string((const char *) attr->name);
@@ -278,7 +318,7 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc,
             if (name == "route")
                 m_start_route = value;
             else
-                throw mp::XMLError("Only attribute start allowed"
+                throw mp::XMLError("Only attribute route allowed"
                                     " in element 'start'. Got " + name);
         }
         node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
@@ -288,7 +328,7 @@ 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);
+                          test_only, file_include_path);
                       
         node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
     }
@@ -296,7 +336,7 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc,
     mp::xml::check_element_mp(node, "routes");
     
     parse_xml_routes(doc, mp::xml::jump_to_children(node, XML_ELEMENT_NODE),
-        test_only);
+                     test_only, file_include_path);
 
     node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
     if (node)
@@ -304,7 +344,32 @@ void mp::RouterFleXML::Rep::parse_xml_config_dom(xmlDocPtr doc,
         throw mp::XMLError("Unexpected element " 
                             + std::string((const char *)node->name));
     }
-}        
+
+    node = mp::xml::jump_to_children(root, XML_ELEMENT_NODE);
+    while (node)
+    {
+        if (mp::xml::is_element_mp(node, "filters"))
+            check_routes_in_filters(
+                mp::xml::jump_to_children(node,
+                                          XML_ELEMENT_NODE));
+        else if (mp::xml::is_element_mp(node, "routes"))
+        {
+            const xmlNode* n = mp::xml::jump_to_children(node,
+                                                         XML_ELEMENT_NODE);
+            while (n)
+            {
+                if (mp::xml::is_element_mp(n, "route"))
+                {
+                    check_routes_in_filters(
+                        mp::xml::jump_to_children(n, XML_ELEMENT_NODE));
+                    
+                }
+                n = mp::xml::jump_to_next(n, XML_ELEMENT_NODE);
+            }
+        }
+        node = mp::xml::jump_to_next(node, XML_ELEMENT_NODE);
+    }
+}
 
 mp::RouterFleXML::Rep::Rep() : m_xinclude(false)
 {