From acadf47884cbc37d7498633537584e164c998f1c Mon Sep 17 00:00:00 2001 From: "ivan.krivyakov" Date: Wed, 3 Aug 2016 17:52:27 -0400 Subject: [PATCH 1/1] Added better error handing to xml.c --- lasso/xml/xml.c | 66 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c index 8c3df04..4eced58 100644 --- a/lasso/xml/xml.c +++ b/lasso/xml/xml.c @@ -68,6 +68,8 @@ #include "../key.h" +#define LOG_LEVEL_XML_DEBUG G_LOG_LEVEL_DEBUG /* change to G_LOG_LEVEL_WARNING so it shows in Apache log */ + static void lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, xmlNode *xmlnode, struct XmlSnippet *snippets, gboolean lasso_dump); static struct XmlSnippet* find_xml_snippet_by_name(LassoNode *node, char *name, LassoNodeClass **class_p); @@ -1440,19 +1442,28 @@ is_snippet_multiple(struct XmlSnippet *snippet) static inline gboolean node_match_snippet(xmlNode *parent, xmlNode *node, struct XmlSnippet *snippet) { - gboolean rc = TRUE; - /* special case of ArtifactResponse */ if (snippet->type & SNIPPET_ANY) { + message(LOG_LEVEL_XML_DEBUG, "Matching node %s vs SNIPPET_ANY: SUCCESS", node->name); return TRUE; } else { - rc = rc && lasso_strisequal(snippet->name, (char*)node->name); - rc = rc && - ((!snippet->ns_uri && - lasso_equal_namespace(parent->ns, node->ns)) || - (node->ns && - lasso_strisequal((char*)node->ns->href, snippet->ns_uri))); - return rc; + if (!lasso_strisequal(snippet->name, (char*)node->name)) { + message(LOG_LEVEL_XML_DEBUG, "Matching node %s vs snippet %s: FAILURE names don't match", node->name, snippet->name); + return FALSE; + } + + if ((snippet->ns_uri == NULL) && lasso_equal_namespace(parent->ns, node->ns)) { + message(LOG_LEVEL_XML_DEBUG, "Matching node %s vs snippet %s: SUCCESS namespace prefixes match", node->name, snippet->name); + return TRUE; + } + + if ((node->ns != NULL) && lasso_strisequal((char*)node->ns->href, snippet->ns_uri)) { + message(LOG_LEVEL_XML_DEBUG, "Matching node %s vs snippet %s: SUCCESS namespace URIs match", node->name, snippet->name); + return TRUE; + } + + message(LOG_LEVEL_XML_DEBUG, "Matching node %s vs snippet %s: FAILURE", node->name, snippet->name); + return FALSE; } } @@ -1478,6 +1489,8 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) LassoNodeClass *node_class; gint rc = 0; + message(LOG_LEVEL_XML_DEBUG, "lasso_node_impl_init_from_xml <%s>", xmlnode->name); + if (! xmlnode) { rc = 1; goto cleanup; @@ -1521,7 +1534,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) g_type_any = g_type; snippet_any = snippet; } else { - critical("Two any node snippet for class %s", + message(G_LOG_LEVEL_CRITICAL, "Two 'any' node snippet for class %s", g_type_name(G_TYPE_FROM_INSTANCE(node))); } } @@ -1662,9 +1675,11 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) } \ next_node_snippet(&class_iter, &snippet); #define ERROR \ - error("Element %s:%s cannot be parsed", \ - t->ns != NULL ? (char*)t->ns->prefix : "", \ - t->name); \ + message(G_LOG_LEVEL_CRITICAL, "Element <%s:%s> was not expected at this location inside element <%s>. " \ + "Please ensure the XML correctly follows XML schema", \ + (t->ns == NULL) ? "" : ((t->ns->prefix == NULL)? (char*)t->ns->href : (char*)t->ns->prefix), \ + t->name, \ + xmlnode->name); \ rc = 1; \ goto cleanup; /* Find a matching snippet */ @@ -1702,10 +1717,16 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) case SNIPPET_NODE: subnode = lasso_node_new_from_xmlNode_with_type(t, matched_snippet->class_name); - if (is_snippet_type(matched_snippet, SNIPPET_NODE)) { - lasso_assign_new_gobject(*(LassoNode**)value, subnode); - } else { - lasso_list_add_new_gobject(*list, subnode); + if (subnode == NULL) { + message(G_LOG_LEVEL_CRITICAL, "Failed to create LassoNode from XML node"); + } + else { + if (is_snippet_type(matched_snippet, SNIPPET_NODE)) { + lasso_assign_new_gobject(*(LassoNode**)value, subnode); + } + else { + lasso_list_add_new_gobject(*list, subnode); + } } break; case SNIPPET_NODE_IN_CHILD: @@ -1846,6 +1867,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) } cleanup: lasso_release_slist(class_list); + message(LOG_LEVEL_XML_DEBUG, "lasso_node_impl_init_from_xml rc=%d", xmlnode->name, rc); return rc; } #undef trace_snippet @@ -2526,12 +2548,17 @@ lasso_node_new_from_xmlNode_with_type(xmlNode *xmlnode, char *typename) LassoNode *node; int rc = 0; - if (typename == NULL) + message(LOG_LEVEL_XML_DEBUG, "Processing node '%s' with type '%s'", xmlnode->name, typename); + + if (typename == NULL) { return _lasso_node_new_from_xmlNode(xmlnode); /* will auto-detect */ + } gtype = g_type_from_name(typename); - if (gtype == 0) + if (gtype == 0) { + message(G_LOG_LEVEL_CRITICAL, "Unable to get g_type from name '%s'", typename); return NULL; + } node = g_object_new(gtype, NULL); @@ -2540,6 +2567,7 @@ lasso_node_new_from_xmlNode_with_type(xmlNode *xmlnode, char *typename) } rc = lasso_node_init_from_xml(node, xmlnode); if (rc) { + message(G_LOG_LEVEL_CRITICAL, "Lasso node initialization failed for node '%s', type '%s': error %d", xmlnode->name, typename, rc); lasso_node_destroy(node); return NULL; } -- 2.6.2.windows.1