You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sh...@apache.org on 2010/02/02 08:57:55 UTC

svn commit: r905539 - /webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c

Author: shankar
Date: Tue Feb  2 07:57:55 2010
New Revision: 905539

URL: http://svn.apache.org/viewvc?rev=905539&view=rev
Log:
refactoring, adding comments. 

Modified:
    webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c

Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c?rev=905539&r1=905538&r2=905539&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c Tue Feb  2 07:57:55 2010
@@ -62,6 +62,18 @@
     const axutil_env_t *env,
     axiom_node_t *om_node);
 
+static axis2_status_t
+axiom_soap_builder_construct_soap_fault(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node);
+
+static axis2_status_t
+axiom_soap_builder_construct_xop_include(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_element_node);
+
 struct axiom_soap_builder
 {
     axiom_stax_builder_t *om_builder;
@@ -448,88 +460,16 @@
 
     /** a parent node exist , so not soap envelope. Can be either header/body/children of them */
 
-    /* start: handle MTOM stuff */
-    if(axutil_strcmp(ele_localname, AXIS2_XOP_INCLUDE) == 0)
-    {
-        axiom_namespace_t *ns = NULL;
-
-        while(!axiom_node_is_complete(om_element_node, env))
-        {
-            axiom_stax_builder_next_with_token(soap_builder->om_builder, env);
-        }
-
-        ns = axiom_element_get_namespace(om_element, env, om_element_node);
-        if(ns)
-        {
-            axis2_char_t *uri = axiom_namespace_get_uri(ns, env);
-            if(uri)
-            {
-                if(axutil_strcmp(uri, AXIS2_XOP_NAMESPACE_URI) == 0)
-                {
-                    axutil_qname_t *qname = NULL;
-                    qname = axutil_qname_create(env, "href", NULL, NULL);
-                    if(qname)
-                    {
-                        axis2_char_t *id = NULL;
-                        id = axiom_element_get_attribute_value(om_element, env, qname);
-                        if(id)
-                        {
-                            axis2_char_t *pos = NULL;
-                            pos = axutil_strstr(id, "cid:");
-                            if(pos)
-                            {
-                                axiom_data_handler_t *data_handler = NULL;
-                                id += 4;
-
-                                if(soap_builder->mime_body_parts)
-                                {
-
-                                    axis2_char_t *id_decoded = NULL;
-
-                                    id_decoded = axutil_strdup(env, id);
-
-                                    axutil_url_decode(env, id_decoded, id_decoded);
-
-                                    data_handler = (axiom_data_handler_t *)axutil_hash_get(
-                                    soap_builder-> mime_body_parts, (void *)id_decoded,
-                                    AXIS2_HASH_KEY_STRING);
-                                    if(data_handler)
-                                    {
-                                        axiom_text_t *data_text = NULL;
-                                        axiom_node_t *data_om_node = NULL;
-
-                                        /*remove the <xop:Include> element */
-                                        axiom_node_free_tree(om_element_node, env);
-
-                                        data_text = axiom_text_create_with_data_handler(env,
-                                        parent, data_handler, &data_om_node);
-
-                                        axiom_text_set_content_id(data_text, env, id_decoded);
-                                        axiom_stax_builder_set_lastnode(soap_builder->om_builder,
-                                        env, parent);
-                                    }
-                                    if(id_decoded)
-                                    {
-                                        AXIS2_FREE(env->allocator, id_decoded);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                    axutil_qname_free(qname, env);
-                }
-            }
-        }
-    }
-    /* end: handle MTOM stuff */
-
-    /** get element level of this OM element */
+    /* get element level of this OM element. Envelope will be in element_level 1. Body and Header
+     * will be in element level 2. SOAP fault will be child of Body, so it will be in level 3*/
     element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
     if(axiom_stax_builder_get_current_event(soap_builder->om_builder, env)
         == AXIOM_XML_READER_EMPTY_ELEMENT)
     {
-        /* if it is an empty element, increase the element level to ensure processing header
-         * block logic, as the following logic assumes empty elements to be full elements. */
+        /* if it is an empty element, increase the element level. This is because the element level
+         * is incremented by STAX builder only if <element> tag is identified. It will not be
+         * incremented if <element/> tag is seen. But for our logic, even empty element should be
+         * considered as full element. so, <element/> = <element> </element>. */
         ++element_level;
     }
 
@@ -559,9 +499,8 @@
                 AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
             AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
                 "SOAP builder found a child element other than header or body in envelope element");
-            status = AXIS2_FAILURE;
+            return AXIS2_FAILURE;
         }
-        return status;
     }
     else if(element_level == 3)
     {
@@ -602,7 +541,6 @@
             axiom_soap_header_block_set_base_node(header_block, env, om_element_node);
             axiom_soap_header_set_header_block(soap_header, env, header_block);
             axiom_soap_header_block_set_soap_version(header_block, env, soap_builder->soap_version);
-            return AXIS2_SUCCESS;
         }
         else if(axutil_strcasecmp(parent_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
         {
@@ -610,57 +548,18 @@
             axiom_soap_fault_t *soap_fault = NULL;
             axiom_namespace_t *env_ns = NULL;
 
-            if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_BODY_FAULT_LOCAL_NAME) != 0)
-            {
-                /* We don't need to process any children of SOAP Body, which is not a soap fault. */
-                return AXIS2_SUCCESS;
-            }
-
-            env_ns = axiom_soap_envelope_get_namespace(soap_builder->soap_envelope, env);
-            if(!env_ns)
+            /* if the node is <xop:Include> or MTOM message */
+            if(axutil_strcmp(ele_localname, AXIS2_XOP_INCLUDE) == 0)
             {
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap envelope namespace");
-                return AXIS2_FAILURE;
+                return axiom_soap_builder_construct_xop_include(soap_builder, env, om_element_node);
             }
 
-            soap_body = axiom_soap_envelope_get_body(soap_builder->soap_envelope, env);
-            if(!soap_body)
+            if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_BODY_FAULT_LOCAL_NAME) == 0)
             {
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap body from OM Envelope");
-                return AXIS2_FAILURE;
+                return axiom_soap_builder_construct_soap_fault(soap_builder, env, om_element_node);
             }
 
-            soap_fault = axiom_soap_fault_create(env);
-            if(!soap_fault)
-            {
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create SOAP Fault structure");
-                return AXIS2_FAILURE;
-            }
-
-            axiom_soap_fault_set_base_node(soap_fault, env, om_element_node);
-            axiom_soap_body_set_fault(soap_body, env, soap_fault);
-            axiom_soap_fault_set_builder(soap_fault, env, soap_builder);
-            soap_builder->processing_fault = AXIS2_TRUE;
-            soap_builder->processing_mandatory_fault_elements = AXIS2_TRUE;
-
-            if(axutil_strcmp(AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI,
-                axiom_namespace_get_uri(env_ns, env)) == 0)
-            {
-                soap_builder->builder_helper = axiom_soap12_builder_helper_create(env, soap_builder);
-            }
-            else if(axutil_strcmp(AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI,
-                axiom_namespace_get_uri(env_ns, env)) == 0)
-            {
-                soap_builder->builder_helper = axiom_soap11_builder_helper_create(
-                    env, soap_builder,soap_builder->om_builder);
-            }
-
-            if(!soap_builder->builder_helper)
-            {
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create soap builder helper");
-                return AXIS2_FAILURE;
-            }
-            return AXIS2_SUCCESS;
+            /* We don't need to process any other children of SOAP Body. */
         }
         else
         {
@@ -670,24 +569,37 @@
                 "SOAP builder found a child element other than header or body in envelope element");
             return AXIS2_FAILURE;
         }
+
+        return AXIS2_SUCCESS;
     }
-    else if(element_level > 3 && soap_builder->processing_fault)
+    else if(element_level > 3)
     {
-        if(soap_builder->soap_version == AXIOM_SOAP11)
-        {
-            status = axiom_soap11_builder_helper_handle_event((axiom_soap11_builder_helper_t *)
-                soap_builder->builder_helper, env, om_element_node, element_level);
-        }
-        else if(soap_builder->soap_version == AXIOM_SOAP12)
+        if(soap_builder->processing_fault)
         {
-            status = axiom_soap12_builder_helper_handle_event((axiom_soap12_builder_helper_t *)
-                soap_builder->builder_helper, env, om_element_node, element_level);
+            if(soap_builder->soap_version == AXIOM_SOAP11)
+            {
+                status = axiom_soap11_builder_helper_handle_event((axiom_soap11_builder_helper_t *)
+                    soap_builder->builder_helper, env, om_element_node, element_level);
+            }
+            else if(soap_builder->soap_version == AXIOM_SOAP12)
+            {
+                status = axiom_soap12_builder_helper_handle_event((axiom_soap12_builder_helper_t *)
+                    soap_builder->builder_helper, env, om_element_node, element_level);
+            }
+            else
+            {
+                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown SOAP Version");
+                status = AXIS2_FAILURE;
+            }
         }
-        else
+
+        /* if the node is <xop:Include> or MTOM message */
+        else if(axutil_strcmp(ele_localname, AXIS2_XOP_INCLUDE) == 0)
         {
-            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown SOAP Version");
-            status = AXIS2_FAILURE;
+            return axiom_soap_builder_construct_xop_include(soap_builder, env, om_element_node);
         }
+
+        /* we don't need to consider any other elements at this level. */
     }
     return status;
 }
@@ -761,6 +673,160 @@
 
     return AXIS2_SUCCESS;
 }
+
+static axis2_status_t
+axiom_soap_builder_construct_soap_fault(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node)
+{
+    axiom_soap_body_t *soap_body = NULL;
+    axiom_soap_fault_t *soap_fault = NULL;
+    axiom_namespace_t *env_ns = NULL;
+
+    env_ns = axiom_soap_envelope_get_namespace(soap_builder->soap_envelope, env);
+    if(!env_ns)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap envelope namespace");
+        return AXIS2_FAILURE;
+    }
+
+    soap_body = axiom_soap_envelope_get_body(soap_builder->soap_envelope, env);
+    if(!soap_body)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap body from OM Envelope");
+        return AXIS2_FAILURE;
+    }
+
+    soap_fault = axiom_soap_fault_create(env);
+    if(!soap_fault)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create SOAP Fault structure");
+        return AXIS2_FAILURE;
+    }
+
+    axiom_soap_fault_set_base_node(soap_fault, env, om_node);
+    axiom_soap_body_set_fault(soap_body, env, soap_fault);
+    axiom_soap_fault_set_builder(soap_fault, env, soap_builder);
+    soap_builder->processing_fault = AXIS2_TRUE;
+    soap_builder->processing_mandatory_fault_elements = AXIS2_TRUE;
+
+    if(axutil_strcmp(AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI,
+        axiom_namespace_get_uri(env_ns, env)) == 0)
+    {
+        soap_builder->builder_helper = axiom_soap12_builder_helper_create(env, soap_builder);
+    }
+    else if(axutil_strcmp(AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI,
+        axiom_namespace_get_uri(env_ns, env)) == 0)
+    {
+        soap_builder->builder_helper = axiom_soap11_builder_helper_create(
+            env, soap_builder,soap_builder->om_builder);
+    }
+
+    if(!soap_builder->builder_helper)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create soap builder helper");
+        return AXIS2_FAILURE;
+    }
+    return AXIS2_SUCCESS;
+}
+
+static axis2_status_t
+axiom_soap_builder_construct_xop_include(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_element_node)
+{
+    axiom_namespace_t *ns = NULL;
+    axis2_char_t *uri = NULL;
+    axiom_element_t *om_element = NULL;
+    axutil_qname_t *qname = NULL;
+    axis2_char_t *id = NULL;
+
+    om_element = (axiom_element_t *)axiom_node_get_data_element(om_element_node, env);
+    ns = axiom_element_get_namespace(om_element, env, om_element_node);
+    if(!ns)
+    {
+        /* this is not a xop:include element. so, we can safely return success */
+        return AXIS2_SUCCESS;
+    }
+
+    uri = axiom_namespace_get_uri(ns, env);
+    if((!uri) || (axutil_strcmp(uri, AXIS2_XOP_NAMESPACE_URI) != 0))
+    {
+        /* this is not a xop:include element. so, we can safely return success */
+        return AXIS2_SUCCESS;
+    }
+
+    qname = axutil_qname_create(env, "href", NULL, NULL);
+    if(!qname)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create qname with value href");
+        return AXIS2_FAILURE;
+    }
+
+    id = axiom_element_get_attribute_value(om_element, env, qname);
+    axutil_qname_free(qname, env);
+    if(!id)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get href ID of the xop:include element");
+        return AXIS2_FAILURE;
+    }
+
+    if(!axutil_strstr(id, "cid:"))
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "ID of xop:include doesn't include 'cid:' part");
+        return AXIS2_FAILURE;
+    }
+
+    /* everything looks fine, so recursively build the OM tree, so that we can get data handlers */
+    while(!axiom_node_is_complete(om_element_node, env))
+    {
+        axiom_stax_builder_next_with_token(soap_builder->om_builder, env);
+    }
+
+    if(soap_builder->mime_body_parts)
+    {
+        axiom_data_handler_t *data_handler = NULL;
+        axis2_char_t *id_decoded = NULL;
+        axiom_text_t *data_text = NULL;
+        axiom_node_t *data_om_node = NULL;
+        axiom_node_t *parent = NULL;
+
+        /* Get the value of href id, after "cid:" */
+        id += 4;
+        id_decoded = axutil_strdup(env, id);
+        axutil_url_decode(env, id_decoded, id_decoded);
+
+        /* Find the data handler of given xop:include */
+        data_handler = (axiom_data_handler_t *)axutil_hash_get(
+            soap_builder-> mime_body_parts, (void *)id_decoded, AXIS2_HASH_KEY_STRING);
+        if(!data_handler)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                "Cannot find data handler corresponding to id %s", id_decoded);
+            AXIS2_FREE(env->allocator, id_decoded);
+            return AXIS2_FAILURE;
+        }
+
+        /* remove the <xop:Include> element, and add the data handler as the child of
+         * xop:include's parent */
+        parent = axiom_node_get_parent(om_element_node, env);
+        axiom_node_free_tree(om_element_node, env);
+        data_text = axiom_text_create_with_data_handler(env, parent, data_handler, &data_om_node);
+        axiom_text_set_content_id(data_text, env, id_decoded);
+        axiom_stax_builder_set_lastnode(soap_builder->om_builder,env, parent);
+        AXIS2_FREE(env->allocator, id_decoded);
+    }
+    else
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot find mime_body_part in soap builder");
+        return AXIS2_FAILURE;
+    }
+
+    return AXIS2_SUCCESS;
+}
+
 /* check whether the namespace of given node is either SOAP11 or SOAP12 namespace */
 static axis2_status_t
 axiom_soap_builder_process_namespace_data(