You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sh...@apache.org on 2010/02/02 07:50:24 UTC

svn commit: r905530 - in /webservices/axis2/trunk/c/axiom: include/ src/om/ src/parser/libxml2/ src/soap/

Author: shankar
Date: Tue Feb  2 06:49:42 2010
New Revision: 905530

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

Modified:
    webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
    webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h
    webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h
    webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h
    webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c
    webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c
    webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c
    webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
    webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c

Modified: webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h Tue Feb  2 06:49:42 2010
@@ -89,10 +89,9 @@
         const axutil_env_t * env);
 
     /**
-     *
+     * Builds next element of the OM structure
      * @param builder pointer to the SOAP Builder struct
      * @param env Environment. MUST NOT be NULL
-     *
      * @return AXIS2_SUCCESS if the next element is present else AXIS2_FAILURE
      */
     AXIS2_EXTERN axis2_status_t AXIS2_CALL
@@ -163,20 +162,6 @@
         const axutil_env_t * env);
 
     /**
-     * Process and verifies namespace data of @param om_node
-     * @param builder pointer to the SOAP Builder struct
-     * @param env Environment. MUST NOT be NULL
-     *
-     * @return AXIS2_SUCCESS on success else AXIS2_FAILURE
-     */
-    AXIS2_EXTERN axis2_status_t AXIS2_CALL
-    axiom_soap_builder_process_namespace_data(
-        axiom_soap_builder_t * builder,
-        const axutil_env_t * env,
-        axiom_node_t * om_node,
-        axis2_bool_t is_soap_element);
-
-    /**
      * Set the MIME body parts
      * @param builder pointer to the SOAP Builder struct
      * @param env Environment. MUST NOT be NULL

Modified: webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_stax_builder.h Tue Feb  2 06:49:42 2010
@@ -124,10 +124,10 @@
         const axutil_env_t * env);
 
     /**
-      * moves the reader to next event and returns the token returned
-      * by the xml_reader , returns -1 on error 
-      * @param builder pointer to stax builder struct to be used
+      * moves the reader to next event and returns the token returned by the xml_reader ,
+      * @param builder pointer to STAX builder struct to be used
       * @param environment Environment. MUST NOT be NULL.
+      * @return next event axiom_xml_reader_event_types. Returns -1 on error
       */
     AXIS2_EXTERN int AXIS2_CALL
     axiom_stax_builder_next_with_token(

Modified: webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_xml_reader.h Tue Feb  2 06:49:42 2010
@@ -51,14 +51,14 @@
 
     typedef enum axiom_xml_reader_event_types
     {
-        AXIOM_XML_READER_START_DOCUMENT = 0,
-        AXIOM_XML_READER_START_ELEMENT,
-        AXIOM_XML_READER_END_ELEMENT,
-        AXIOM_XML_READER_SPACE,
-        AXIOM_XML_READER_EMPTY_ELEMENT,
-        AXIOM_XML_READER_CHARACTER,
+        AXIOM_XML_READER_START_DOCUMENT = 0,        /* <?xml version="1.0" encoding="utf-8"?> */
+        AXIOM_XML_READER_START_ELEMENT,             /* <element>  */
+        AXIOM_XML_READER_END_ELEMENT,               /* </element> */
+        AXIOM_XML_READER_SPACE,                     /* <x>  </x>*//*event is for value, not for x*/
+        AXIOM_XML_READER_EMPTY_ELEMENT,             /* <element/> */
+        AXIOM_XML_READER_CHARACTER,                 /* <x>text</x>*//*event is for text, not for x*/
         AXIOM_XML_READER_ENTITY_REFERENCE,
-        AXIOM_XML_READER_COMMENT,
+        AXIOM_XML_READER_COMMENT,                   /* <!--comment--> */
         AXIOM_XML_READER_PROCESSING_INSTRUCTION,
         AXIOM_XML_READER_CDATA,
         AXIOM_XML_READER_DOCUMENT_TYPE

Modified: webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h (original)
+++ webservices/axis2/trunk/c/axiom/src/om/axiom_stax_builder_internal.h Tue Feb  2 06:49:42 2010
@@ -50,21 +50,21 @@
         const axutil_env_t * env,
         axiom_node_t * om_node);
 
-    AXIS2_EXTERN int AXIS2_CALL
-    axiom_stax_builder_get_element_level(
-        axiom_stax_builder_t * builder,
-        const axutil_env_t * env);
+    AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+        axiom_stax_builder_get_lastnode(
+            axiom_stax_builder_t * builder,
+            const axutil_env_t * env);
 
     AXIS2_EXTERN axis2_status_t AXIS2_CALL
-
     axiom_stax_builder_set_element_level(
         axiom_stax_builder_t * builder,
         const axutil_env_t * env,
         int element_level);
-    AXIS2_EXTERN axiom_node_t *AXIS2_CALL
-    axiom_stax_builder_get_lastnode(
-        axiom_stax_builder_t * builder,
-        const axutil_env_t * env);
+
+    AXIS2_EXTERN int AXIS2_CALL
+        axiom_stax_builder_get_element_level(
+            axiom_stax_builder_t * builder,
+            const axutil_env_t * env);
 
     /** @} */
 

Modified: webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c (original)
+++ webservices/axis2/trunk/c/axiom/src/om/om_stax_builder.c Tue Feb  2 06:49:42 2010
@@ -62,11 +62,9 @@
     axiom_xml_reader_t * parser)
 {
     axiom_stax_builder_t *om_builder = NULL;
-    AXIS2_ENV_CHECK(env, NULL);
     AXIS2_PARAM_CHECK(env->error, parser, NULL);
 
     om_builder = (axiom_stax_builder_t *)AXIS2_MALLOC(env->allocator, sizeof(axiom_stax_builder_t));
-
     if(!om_builder)
     {
         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
@@ -82,9 +80,7 @@
     om_builder->current_event = -1;
     om_builder->root_node = NULL;
     om_builder->element_level = 0;
-
     om_builder->declared_namespaces = axutil_hash_make(env);
-
     om_builder->document = axiom_document_create(env, NULL, om_builder);
     if(!om_builder->document)
     {
@@ -95,7 +91,7 @@
     return om_builder;
 }
 
-axis2_status_t
+static axis2_status_t
 axiom_stax_builder_process_attributes(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env,
@@ -205,7 +201,7 @@
     return status;
 }
 
-axiom_node_t *
+static axiom_node_t *
 axiom_stax_builder_create_om_text(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
@@ -259,54 +255,7 @@
     return node;
 }
 
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_stax_builder_discard_current_element(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env)
-{
-    axiom_node_t *element = NULL;
-    axiom_node_t *prev_node = NULL;
-    axiom_node_t *parent = NULL;
-
-    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-
-    element = om_builder->lastnode;
-
-    if(axiom_node_is_complete(element, env) || !(om_builder->cache))
-    {
-        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_BUILDER_STATE_CANNOT_DISCARD, AXIS2_FAILURE);
-        return AXIS2_FAILURE;
-    }
-
-    om_builder->cache = AXIS2_FALSE;
-    do
-    {
-        while(axiom_xml_reader_next(om_builder->parser, env) != AXIOM_XML_READER_END_ELEMENT)
-            ;
-    }
-    while(!(axiom_node_is_complete(element, env)));
-
-    /*All children of this element is pulled now */
-
-    prev_node = axiom_node_get_previous_sibling(element, env);
-    if(prev_node)
-    {
-        axiom_node_free_tree(axiom_node_get_next_sibling(prev_node, env), env);
-        axiom_node_set_next_sibling(prev_node, env, NULL);
-    }
-    else
-    {
-        parent = axiom_node_get_parent(element, env);
-        axiom_node_free_tree(axiom_node_get_first_child(parent, env), env);
-        axiom_node_set_first_child(parent, env, NULL);
-        om_builder->lastnode = parent;
-    }
-    om_builder->cache = AXIS2_TRUE;
-
-    return AXIS2_SUCCESS;
-}
-
-axis2_status_t
+static axis2_status_t
 axiom_stax_builder_process_namespaces(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env,
@@ -439,7 +388,7 @@
     return status;
 }
 
-axiom_node_t *
+static axiom_node_t *
 axiom_stax_builder_create_om_element(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env,
@@ -533,7 +482,7 @@
     return element_node;
 }
 
-axiom_node_t *
+static axiom_node_t *
 axiom_stax_builder_create_om_comment(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
@@ -592,7 +541,7 @@
     return comment_node;
 }
 
-axiom_node_t *
+static axiom_node_t *
 axiom_stax_builder_create_om_doctype(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
@@ -620,7 +569,7 @@
     return doctype_node;
 }
 
-axiom_node_t *
+static axiom_node_t *
 axiom_stax_builder_create_om_processing_instruction(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
@@ -675,7 +624,7 @@
     return pi_node;
 }
 
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
+static axis2_status_t
 axiom_stax_builder_end_element(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
@@ -933,125 +882,48 @@
 }
 
 /**
- This is an internal function
- */
-
-AXIS2_EXTERN int AXIS2_CALL
-axiom_stax_builder_get_current_event(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env)
-{
-    AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
-    return om_builder->current_event;
-}
-
-/**
- This is an internal function
- */
-AXIS2_EXTERN axiom_node_t *AXIS2_CALL
-axiom_stax_builder_get_lastnode(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env)
-{
-    AXIS2_PARAM_CHECK(env->error, om_builder, NULL);
-    return om_builder->lastnode;
-}
-
-/**
- This is an internal function
- */
-AXIS2_EXTERN axis2_bool_t AXIS2_CALL
-axiom_stax_builder_is_complete(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env)
-{
-    AXIS2_ENV_CHECK(env, AXIS2_FALSE);
-    return om_builder->done;
-}
-
-/**
- This is an internal function to be used by soap om_builder only
- */
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_stax_builder_set_lastnode(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env,
-    axiom_node_t * om_node)
-{
-    AXIS2_PARAM_CHECK(env->error, om_node, AXIS2_FAILURE);
-    AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
-
-    om_builder->lastnode = om_node;
-    return AXIS2_SUCCESS;
-}
-
-/**
- internal function for soap om_builder only
- */
+  * moves the reader to next event and returns the token returned by the xml_reader ,
+  * @param builder pointer to STAX builder struct to be used
+  * @param environment Environment. MUST NOT be NULL.
+  * @return next event axiom_xml_reader_event_types. Returns -1 on error
+  */
 AXIS2_EXTERN int AXIS2_CALL
-axiom_stax_builder_get_element_level(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env)
-{
-    AXIS2_PARAM_CHECK(env->error, om_builder, -1);
-    return om_builder->element_level;
-}
-
-/**
- internal function for soap om_builder only
- */
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_stax_builder_set_element_level(
-    axiom_stax_builder_t * om_builder,
-    const axutil_env_t * env,
-    int element_level)
-{
-    AXIS2_PARAM_CHECK(env->error, om_builder, AXIS2_FAILURE);
-    om_builder->element_level = element_level;
-    return AXIS2_SUCCESS;
-}
-
-int AXIS2_CALL
 axiom_stax_builder_next_with_token(
     axiom_stax_builder_t * om_builder,
     const axutil_env_t * env)
 {
     int token = 0;
     void *val = NULL;
-    /*	axutil_env_t* thread = NULL;*/
-    /*	thread = axutil_env_create(env->allocator);*/
-    /*	env = thread;*/
-    if(!om_builder)
+
+    if((!om_builder) || (!om_builder->parser))
     {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid OM builder");
         return -1;
     }
 
     if(om_builder->done)
     {
         AXIS2_ERROR_SET(env->error, AXIS2_ERROR_BUILDER_DONE_CANNOT_PULL, AXIS2_FAILURE);
-        return -1;
-    }
-
-    if(!om_builder->parser)
-    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "OM is fully built. Nothing more to build");
         return -1;
     }
 
     token = axiom_xml_reader_next(om_builder->parser, env);
-
     om_builder->current_event = token;
 
     if(token == -1)
     {
         om_builder->done = AXIS2_TRUE;
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error when reading xml");
         return -1;
     }
 
-    if(!(om_builder->cache))
+    if(!om_builder->cache)
     {
-        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Cacheing disabled");
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Caching disabled");
         return -1;
     }
+
     switch(token)
     {
         case AXIOM_XML_READER_START_DOCUMENT:
@@ -1133,6 +1005,52 @@
     return token;
 }
 
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_stax_builder_discard_current_element(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env)
+{
+    axiom_node_t *element = NULL;
+    axiom_node_t *prev_node = NULL;
+    axiom_node_t *parent = NULL;
+
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+    element = om_builder->lastnode;
+
+    if(axiom_node_is_complete(element, env) || !(om_builder->cache))
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_BUILDER_STATE_CANNOT_DISCARD, AXIS2_FAILURE);
+        return AXIS2_FAILURE;
+    }
+
+    om_builder->cache = AXIS2_FALSE;
+    do
+    {
+        while(axiom_xml_reader_next(om_builder->parser, env) != AXIOM_XML_READER_END_ELEMENT)
+            ;
+    }
+    while(!(axiom_node_is_complete(element, env)));
+
+    /*All children of this element is pulled now */
+
+    prev_node = axiom_node_get_previous_sibling(element, env);
+    if(prev_node)
+    {
+        axiom_node_free_tree(axiom_node_get_next_sibling(prev_node, env), env);
+        axiom_node_set_next_sibling(prev_node, env, NULL);
+    }
+    else
+    {
+        parent = axiom_node_get_parent(element, env);
+        axiom_node_free_tree(axiom_node_get_first_child(parent, env), env);
+        axiom_node_set_first_child(parent, env, NULL);
+        om_builder->lastnode = parent;
+    }
+    om_builder->cache = AXIS2_TRUE;
+
+    return AXIS2_SUCCESS;
+}
 
 AXIS2_EXTERN axiom_xml_reader_t *AXIS2_CALL
 axiom_stax_builder_get_parser(
@@ -1151,3 +1069,72 @@
     om_builder->cache = enable_cache;
 }
 
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN int AXIS2_CALL
+axiom_stax_builder_get_current_event(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env)
+{
+    return om_builder->current_event;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+axiom_stax_builder_get_lastnode(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env)
+{
+    return om_builder->lastnode;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+axiom_stax_builder_is_complete(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env)
+{
+    return om_builder->done;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_stax_builder_set_lastnode(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env,
+    axiom_node_t * om_node)
+{
+    om_builder->lastnode = om_node;
+    return AXIS2_SUCCESS;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN int AXIS2_CALL
+axiom_stax_builder_get_element_level(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env)
+{
+    return om_builder->element_level;
+}
+
+/**
+ internal function for soap om_builder only
+ */
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_stax_builder_set_element_level(
+    axiom_stax_builder_t * om_builder,
+    const axutil_env_t * env,
+    int element_level)
+{
+    om_builder->element_level = element_level;
+    return AXIS2_SUCCESS;
+}

Modified: webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c (original)
+++ webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c Tue Feb  2 06:49:42 2010
@@ -196,32 +196,18 @@
         }
 
         parser->event_map[XML_READER_TYPE_ELEMENT] = AXIOM_XML_READER_START_ELEMENT;
-
-        parser->event_map[XML_READER_TYPE_ELEMENT] = AXIOM_XML_READER_START_ELEMENT;
-
         parser->event_map[XML_READER_TYPE_DOCUMENT] = AXIOM_XML_READER_START_DOCUMENT;
-
         parser->event_map[XML_READER_TYPE_TEXT] = AXIOM_XML_READER_CHARACTER;
-
         parser->event_map[XML_READER_TYPE_CDATA] = AXIOM_XML_READER_CHARACTER;
-
         parser->event_map[XML_READER_TYPE_SIGNIFICANT_WHITESPACE] = AXIOM_XML_READER_SPACE;
-
         parser->event_map[XML_READER_TYPE_WHITESPACE] = AXIOM_XML_READER_SPACE;
-
         parser->event_map[XML_READER_TYPE_END_ELEMENT] = AXIOM_XML_READER_END_ELEMENT;
-
         parser->event_map[XML_READER_TYPE_ENTITY_REFERENCE] = AXIOM_XML_READER_ENTITY_REFERENCE;
-
         parser->event_map[XML_READER_TYPE_END_ENTITY] = AXIOM_XML_READER_SPACE;
-
         parser->event_map[XML_READER_TYPE_ENTITY] = AXIOM_XML_READER_SPACE;
-
         parser->event_map[XML_READER_TYPE_PROCESSING_INSTRUCTION]
             = AXIOM_XML_READER_PROCESSING_INSTRUCTION;
-
         parser->event_map[XML_READER_TYPE_COMMENT] = AXIOM_XML_READER_COMMENT;
-
         parser->event_map[XML_READER_TYPE_DOCUMENT_TYPE] = AXIOM_XML_READER_DOCUMENT_TYPE;
         return AXIS2_SUCCESS;
     }

Modified: webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap11_builder_helper.c Tue Feb  2 06:49:42 2010
@@ -73,8 +73,6 @@
     builder_helper->fault_code_present = AXIS2_FALSE;
     builder_helper->fault_string_present = AXIS2_FALSE;
     builder_helper->last_processed_node = NULL;
-    builder_helper->om_builder = NULL;
-
     builder_helper->soap_builder = soap_builder;
     builder_helper->om_builder = om_builder;
 

Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_body.c?rev=905530&r1=905529&r2=905530&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_body.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_body.c Tue Feb  2 06:49:42 2010
@@ -127,40 +127,43 @@
     return;
 }
 
+/**
+ * Indicates whether a soap fault is available with this soap body
+ * @param soap_body axiom_soap_body struct
+ * @param env environment must not be null
+ * @return AXIS2_TRUE if fault is available, AXIS2_FALSE otherwise
+ */
 AXIS2_EXTERN axis2_bool_t AXIS2_CALL
 axiom_soap_body_has_fault(
     axiom_soap_body_t * soap_body,
     const axutil_env_t * env)
 {
-    int status = AXIS2_SUCCESS;
-
     if(soap_body->soap_fault)
     {
         soap_body->has_fault = AXIS2_TRUE;
-        return AXIS2_TRUE;
     }
     else
     {
-        if(soap_body->soap_builder)
+        while(!axiom_node_is_complete(soap_body->om_ele_node, env))
         {
-            while(!(soap_body->soap_fault)
-                && !(axiom_node_is_complete(soap_body->om_ele_node, env)))
+            if(axiom_soap_builder_next(soap_body->soap_builder, env) != AXIS2_SUCCESS)
             {
-                status = axiom_soap_builder_next(soap_body->soap_builder, env);
-                if(status == AXIS2_FAILURE)
-                {
-                    return AXIS2_FALSE;
-                }
+                /* problem in building the SOAP body. Note that has_fault is about soap fault,
+                 * not about problem in building the node. So, even though there is a problem
+                 * building the body, has_fault should be AXIS2_FALSE
+                 */
+                break;
             }
+
             if(soap_body->soap_fault)
             {
                 soap_body->has_fault = AXIS2_TRUE;
-                return AXIS2_TRUE;
+                break;
             }
         }
     }
 
-    return AXIS2_FALSE;
+    return soap_body->has_fault;
 }
 
 /**

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=905530&r1=905529&r2=905530&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 06:49:42 2010
@@ -27,20 +27,11 @@
 #include "_axiom_soap_fault.h"
 #include <axutil_http_chunked_stream.h>
 
-axis2_status_t
-axiom_soap_builder_create_om_element(
-    axiom_soap_builder_t * soap_builder,
-    const axutil_env_t * env,
-    axiom_node_t * current_node,
-    int current_event);
-
 static axis2_status_t
 axiom_soap_builder_construct_node(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env,
-    axiom_node_t * parent,
-    axiom_node_t * om_element_node,
-    axis2_bool_t is_soap_envelope);
+    axiom_node_t * om_element_node);
 
 static axis2_status_t
 axiom_soap_builder_identify_soap_version(
@@ -54,11 +45,22 @@
     const axutil_env_t * env);
 
 static axis2_status_t
-axiom_soap_builder_construct_node_for_empty_element(
+axiom_soap_builder_process_namespace_data(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env,
-    axiom_node_t * parent,
-    axiom_node_t * om_element_node);
+    axiom_node_t * om_node);
+
+static axis2_status_t
+axiom_soap_builder_construct_soap_header(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node);
+
+static axis2_status_t
+axiom_soap_builder_construct_soap_body(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node);
 
 struct axiom_soap_builder
 {
@@ -297,172 +299,164 @@
     return NULL;
 }
 
+/**
+ * Builds next element of the OM structure
+ * @param builder pointer to the SOAP Builder struct
+ * @param env Environment. MUST NOT be NULL
+ * @return AXIS2_SUCCESS if the next element is present else AXIS2_FAILURE
+ */
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
 axiom_soap_builder_next(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env)
 {
-    axiom_node_t *lastnode = NULL;
     int current_event = AXIS2_MAX_EVENT;
-    axiom_node_t *current_node = NULL;
     int status = AXIS2_SUCCESS;
 
-    if(!soap_builder)
+    if((!soap_builder) || (soap_builder->done) || (!soap_builder->om_builder))
     {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid soap builder");
         return AXIS2_FAILURE;
     }
-    if(soap_builder->done)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(!(soap_builder->om_builder))
-    {
-        return AXIS2_FAILURE;
-    }
-    lastnode = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
 
-    if(!lastnode)
+    /* Get the status of previous node before building next node. We need the previous state of the
+     * node to identify very first element, which is SOAP Envelope. If last_node_status is
+     * AXIS2_BUILDER_LAST_NODE_NULL, then it means next node is SOAP Envelope
+     */
+    if(axiom_stax_builder_get_lastnode(soap_builder->om_builder, env))
     {
-        soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NULL;
+        soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NOT_NULL;
     }
     else
     {
-        soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NOT_NULL;
+        soap_builder->last_node_status = AXIS2_BUILDER_LAST_NODE_NULL;
     }
+
     current_event = axiom_stax_builder_next_with_token(soap_builder->om_builder, env);
-    if(current_event == -1)
+    if(current_event == AXIOM_XML_READER_START_ELEMENT
+        || current_event == AXIOM_XML_READER_EMPTY_ELEMENT)
     {
-        soap_builder->done = AXIS2_TRUE;
-        return AXIS2_FAILURE;
-    }
-    if(current_event == AXIOM_XML_READER_EMPTY_ELEMENT || current_event
-        == AXIOM_XML_READER_START_ELEMENT)
-    {
-        current_node = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
+        axiom_node_t *current_node = axiom_stax_builder_get_lastnode(soap_builder->om_builder, env);
         if(current_node)
         {
-            status = axiom_soap_builder_create_om_element(soap_builder, env, current_node,
-                current_event);
+            status = axiom_soap_builder_construct_node(soap_builder, env, current_node);
         }
         else
-            return AXIS2_FAILURE;
+        {
+            /* there is an error. So, don't continue building it */
+            soap_builder->done = AXIS2_TRUE;
+            status = AXIS2_FAILURE;
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error occurred when building node");
+        }
     }
+    else if(current_event == -1)
+    {
+        /* there is an error. So, don't continue building it */
+        soap_builder->done = AXIS2_TRUE;
+        status = AXIS2_FAILURE;
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Error occurred when building node");
+    }
+
+    /* for any other event types, return AXIS2_SUCCESS as the return value. */
 
     return status;
 }
 
-AXIS2_EXTERN axiom_node_t *AXIS2_CALL axiom_soap_builder_get_document_element(
+AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+axiom_soap_builder_get_document_element(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env)
 {
-    if (soap_builder->soap_envelope)
+    axiom_node_t *document_node = NULL;
+    if(soap_builder->soap_envelope)
     {
-        return axiom_soap_envelope_get_base_node(soap_builder->soap_envelope,
-            env);
+        document_node = axiom_soap_envelope_get_base_node(soap_builder->soap_envelope, env);
     }
-    else
-    return NULL;
-}
 
-axis2_status_t
-axiom_soap_builder_create_om_element(
-    axiom_soap_builder_t * soap_builder,
-    const axutil_env_t * env,
-    axiom_node_t * current_node,
-    int current_event)
-{
-    int ret_val = AXIS2_SUCCESS;
-    AXIS2_PARAM_CHECK(env->error, current_node, AXIS2_FAILURE);
-    if(!soap_builder)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(soap_builder->last_node_status == AXIS2_BUILDER_LAST_NODE_NULL)
-    {
-        ret_val = axiom_soap_builder_construct_node(soap_builder, env, NULL, current_node,
-            AXIS2_TRUE);
-    }
-    else
-    {
-        int element_level = 0;
-        axiom_node_t *parent_node = NULL;
-        parent_node = axiom_node_get_parent(current_node, env);
-        if(!soap_builder->om_builder)
-        {
-            return AXIS2_FAILURE;
-        }
-        element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
-        if(parent_node && element_level == 1 && current_event == AXIOM_XML_READER_EMPTY_ELEMENT)
-        {
-            ret_val = axiom_soap_builder_construct_node_for_empty_element(soap_builder, env,
-                parent_node, current_node);
-        }
-        else if(parent_node)
-        {
-            ret_val = axiom_soap_builder_construct_node(soap_builder, env, parent_node,
-                current_node, AXIS2_FALSE);
-        }
-        else
-            return AXIS2_FAILURE;
-    }
-    return ret_val;
+    return document_node;
 }
 
 static axis2_status_t
 axiom_soap_builder_construct_node(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env,
-    axiom_node_t * parent,
-    axiom_node_t * om_element_node,
-    axis2_bool_t is_soap_envelope)
+    axiom_node_t * om_element_node)
 {
-    axiom_element_t *parent_ele = NULL;
-    axis2_char_t *parent_localname = NULL;
-
     axiom_element_t *om_element = NULL;
     const axis2_char_t *ele_localname = NULL;
-
     int element_level = 0;
     int status = AXIS2_SUCCESS;
+    axiom_node_t *parent = NULL;
 
-    AXIS2_PARAM_CHECK(env->error, om_element_node, AXIS2_FAILURE);
-    if(!soap_builder)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(!soap_builder->om_builder)
-    {
-        return AXIS2_FAILURE;
-    }
-    /** get element level of this om element */
-    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 ensurer processing
-         * header block logic, as the following logic assumes 
-         * empty elements to be full elements. */
-        element_level++;
-    }
-    /* get om element struct from node */
+    /* get OM element struct from node */
     om_element = (axiom_element_t *)axiom_node_get_data_element(om_element_node, env);
     if(!om_element)
     {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot construct node. Invalid element");
         return AXIS2_FAILURE;
     }
-    /* get element localname */
+
+    /* get element local name */
     ele_localname = axiom_element_get_localname(om_element, env);
     if(!ele_localname)
     {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot construct node. Invalid element name");
         return AXIS2_FAILURE;
     }
+
+    parent = axiom_node_get_parent(om_element_node, env);
+    if(!parent)
+    {
+        /* parent node doesn't exist means, this should be SOAP Envelope */
+        if(soap_builder->last_node_status != AXIS2_BUILDER_LAST_NODE_NULL)
+        {
+            /* this means, there are two elements in the first level */
+            AXIS2_ERROR_SET(env->error,
+                AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                "Soap message can contain only one SOAP Envelope as the top level element");
+            return AXIS2_FAILURE;
+        }
+
+        if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_ENVELOPE_LOCAL_NAME) != 0)
+        {
+            AXIS2_ERROR_SET(env->error,
+                AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP message first element must be Envelope");
+            return AXIS2_FAILURE;
+        }
+
+        /** create a null soap envelope struct */
+        soap_builder->soap_envelope = axiom_soap_envelope_create_null(env);
+        if(!soap_builder->soap_envelope)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Envelope");
+            return AXIS2_FAILURE;
+        }
+
+        /** wrap this OM node in it */
+        axiom_soap_envelope_set_base_node(soap_builder->soap_envelope, env, om_element_node);
+        axiom_soap_envelope_set_builder(soap_builder->soap_envelope, env, soap_builder);
+        status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node);
+        if(status != AXIS2_SUCCESS)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP Envelope is having invalid namespace");
+        }
+
+        return status;
+    }
+
+    /** 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)
@@ -497,8 +491,8 @@
                                     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);
+                                    soap_builder-> mime_body_parts, (void *)id_decoded,
+                                    AXIS2_HASH_KEY_STRING);
                                     if(data_handler)
                                     {
                                         axiom_text_t *data_text = NULL;
@@ -508,11 +502,11 @@
                                         axiom_node_free_tree(om_element_node, env);
 
                                         data_text = axiom_text_create_with_data_handler(env,
-                                            parent, data_handler, &data_om_node);
+                                        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);
+                                        env, parent);
                                     }
                                     if(id_decoded)
                                     {
@@ -529,282 +523,273 @@
     }
     /* end: handle MTOM stuff */
 
-    if(parent)
+    /** get element level of this OM element */
+    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. */
+        ++element_level;
+    }
 
-        /** a parent node exist , so not soap envelope element */
-        parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
-        if(parent_ele)
+    if(element_level == 2)
+    {
+        /* At this level, we can only have soap:Header or soap:Body */
+        status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node);
+        if(status != AXIS2_SUCCESS)
         {
-            parent_localname = axiom_element_get_localname(parent_ele, env);
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "invalid SOAP namespace");
+            return AXIS2_FAILURE;
         }
-    }
-    if(!parent && is_soap_envelope)
-    {
 
-        /** this is the soap envelope element */
-        if(axutil_strcasecmp(ele_localname, AXIOM_SOAP_ENVELOPE_LOCAL_NAME) != 0)
+        if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
+        {
+            /* this is the soap header element */
+            status = axiom_soap_builder_construct_soap_header(soap_builder, env, om_element_node);
+        }
+        else if(axutil_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
+        {
+            /* This is the SOAP Body element */
+            status = axiom_soap_builder_construct_soap_body(soap_builder, env, om_element_node);
+        }
+        else
         {
             AXIS2_ERROR_SET(env->error,
-                AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
+                AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
             AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                "SOAP message first element must contain a localname");
-            return AXIS2_FAILURE;
+                "SOAP builder found a child element other than header or body in envelope element");
+            status = AXIS2_FAILURE;
         }
+        return status;
+    }
+    else if(element_level == 3)
+    {
+        axiom_element_t *parent_ele = NULL;
+        axis2_char_t *parent_localname = NULL;
 
-        /** create a null soap envelope struct */
-        soap_builder->soap_envelope = axiom_soap_envelope_create_null(env);
-        if(!soap_builder->soap_envelope)
+        parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
+        if(parent_ele)
         {
-            return AXIS2_FAILURE;
+            parent_localname = axiom_element_get_localname(parent_ele, env);
         }
-        /** wrap this om node in it */
-        status = axiom_soap_envelope_set_base_node(soap_builder->soap_envelope, env,
-            om_element_node);
 
-        axiom_soap_envelope_set_builder(soap_builder->soap_envelope, env, soap_builder);
-        status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
-            AXIS2_TRUE);
-        if(status == AXIS2_FAILURE)
+        if(!parent_localname)
         {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot identify parent element local name");
             return AXIS2_FAILURE;
         }
-    }
-    else if(element_level == 2)
-    {
-        if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
-        {
 
-            /** this is the soap header element */
+        if(axutil_strcasecmp(parent_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
+        {
+            axiom_soap_header_block_t *header_block = NULL;
             axiom_soap_header_t *soap_header = NULL;
-            if(soap_builder->header_present)
-            {
-                AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
-                    AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
-                return AXIS2_FAILURE;
-            }
-            if(soap_builder->body_present)
-            {
-                AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
-                    AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                    "SOAP builder encountered body element first and header next");
-                return AXIS2_FAILURE;
-            }
 
-            soap_builder->header_present = AXIS2_TRUE;
-
-            soap_header = axiom_soap_header_create(env);
+            soap_header = axiom_soap_envelope_get_header(soap_builder->soap_envelope, env);
             if(!soap_header)
             {
+                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get SOAP Header from OM Envelope");
                 return AXIS2_FAILURE;
             }
-            axiom_soap_header_set_base_node(soap_header, env, om_element_node);
-
-            axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
-
-            axiom_soap_header_set_builder(soap_header, env, soap_builder);
 
-            axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
-
-            status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
-                AXIS2_TRUE);
-            if(status == AXIS2_FAILURE)
+            header_block = axiom_soap_header_block_create(env);
+            if(!header_block)
             {
+                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create SOAP Header block");
                 return AXIS2_FAILURE;
             }
 
+            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_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
+        else if(axutil_strcasecmp(parent_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
         {
-
             axiom_soap_body_t *soap_body = NULL;
-            if(soap_builder->body_present)
+            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)
             {
-                AXIS2_ERROR_SET(env->error,
-                    AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                    "SOAP builder multiple body elements encountered");
-                return AXIS2_FAILURE;
+                /* 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)
+            {
+                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot get soap envelope namespace");
+                return AXIS2_FAILURE;
             }
-            soap_builder->body_present = AXIS2_TRUE;
 
-            soap_body = axiom_soap_body_create(env);
+            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;
             }
-            axiom_soap_body_set_base_node(soap_body, env, om_element_node);
 
-            axiom_soap_body_set_builder(soap_body, env, soap_builder);
+            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_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
+            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;
 
-            status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
-                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(status == AXIS2_FAILURE)
+            if(!soap_builder->builder_helper)
             {
+                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Cannot create soap builder helper");
                 return AXIS2_FAILURE;
             }
+            return AXIS2_SUCCESS;
         }
-        else if(parent_localname && axutil_strcasecmp(parent_localname,
-            AXIOM_SOAP_HEADER_LOCAL_NAME) && axutil_strcasecmp(parent_localname,
-            AXIOM_SOAP_BODY_LOCAL_NAME))
+        else
         {
             AXIS2_ERROR_SET(env->error,
                 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");
+                "SOAP builder found a child element other than header or body in envelope element");
             return AXIS2_FAILURE;
         }
     }
-    else if((element_level == 3) && parent_localname && axutil_strcasecmp(parent_localname,
-        AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
-    {
-        axiom_soap_header_block_t *header_block = NULL;
-        axiom_soap_header_t *soap_header = NULL;
-
-        soap_header = axiom_soap_envelope_get_header(soap_builder->soap_envelope, env);
-        if(!soap_header)
-        {
-            return AXIS2_FAILURE;
-        }
-
-        header_block = axiom_soap_header_block_create(env);
-        if(!header_block)
-        {
-            return AXIS2_FAILURE;
-        }
-
-        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);
-
-    }
-    else if((element_level == 3) && parent_localname && axutil_strcasecmp(parent_localname,
-        AXIOM_SOAP_BODY_LOCAL_NAME) == 0 && axutil_strcasecmp(ele_localname,
-        AXIOM_SOAP_BODY_FAULT_LOCAL_NAME) == 0)
+    else if(element_level > 3 && soap_builder->processing_fault)
     {
-        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)
+        if(soap_builder->soap_version == AXIOM_SOAP11)
         {
-            return AXIS2_FAILURE;
+            status = axiom_soap11_builder_helper_handle_event((axiom_soap11_builder_helper_t *)
+                soap_builder->builder_helper, env, om_element_node, element_level);
         }
-        soap_body = axiom_soap_envelope_get_body(soap_builder->soap_envelope, env);
-
-        if(!soap_body)
+        else if(soap_builder->soap_version == AXIOM_SOAP12)
         {
-            return AXIS2_FAILURE;
+            status = axiom_soap12_builder_helper_handle_event((axiom_soap12_builder_helper_t *)
+                soap_builder->builder_helper, env, om_element_node, element_level);
         }
-        soap_fault = axiom_soap_fault_create(env);
-        if(!soap_fault)
+        else
         {
-            return AXIS2_FAILURE;
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unknown SOAP Version");
+            status = AXIS2_FAILURE;
         }
-        axiom_soap_fault_set_base_node(soap_fault, env, om_element_node);
-
-        axiom_soap_body_set_fault(soap_body, env, soap_fault);
+    }
+    return status;
+}
 
-        axiom_soap_fault_set_builder(soap_fault, env, soap_builder);
+static axis2_status_t
+axiom_soap_builder_construct_soap_header(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node)
+{
+    axiom_soap_header_t *soap_header = NULL;
+    if(soap_builder->header_present)
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
+            AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
+        return AXIS2_FAILURE;
+    }
+    if(soap_builder->body_present)
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
+            AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+            "SOAP builder encountered body element first and header next");
+        return AXIS2_FAILURE;
+    }
 
-        soap_builder->processing_fault = AXIS2_TRUE;
+    soap_builder->header_present = AXIS2_TRUE;
+    soap_header = axiom_soap_header_create(env);
+    if(!soap_header)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Header");
+        return AXIS2_FAILURE;
+    }
 
-        soap_builder->processing_mandatory_fault_elements = AXIS2_TRUE;
+    axiom_soap_header_set_base_node(soap_header, env, om_node);
+    axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
+    axiom_soap_header_set_builder(soap_header, env, soap_builder);
+    axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
 
-        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);
-            if(!(soap_builder->builder_helper))
-            {
-                return AXIS2_FAILURE;
-            }
-        }
-        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))
-            {
-                return AXIS2_FAILURE;
-            }
-        }
+    return AXIS2_SUCCESS;
+}
 
+static axis2_status_t
+axiom_soap_builder_construct_soap_body(
+    axiom_soap_builder_t *soap_builder,
+    const axutil_env_t *env,
+    axiom_node_t *om_node)
+{
+    axiom_soap_body_t *soap_body = NULL;
+    if(soap_builder->body_present)
+    {
+        AXIS2_ERROR_SET(env->error,
+            AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+            "SOAP builder multiple body elements encountered");
+        return AXIS2_FAILURE;
     }
-    else if(element_level > 3 && soap_builder->processing_fault)
+
+    soap_builder->body_present = AXIS2_TRUE;
+    soap_body = axiom_soap_body_create(env);
+    if(!soap_body)
     {
-        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);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Unable to create SOAP Body");
+        return AXIS2_FAILURE;
+    }
 
-        }
-        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);
-        }
+    axiom_soap_body_set_base_node(soap_body, env, om_node);
+    axiom_soap_body_set_builder(soap_body, env, soap_builder);
+    axiom_soap_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
 
-    }
-    return status;
+    return AXIS2_SUCCESS;
 }
-
-AXIS2_EXTERN axis2_status_t AXIS2_CALL
+/* check whether the namespace of given node is either SOAP11 or SOAP12 namespace */
+static axis2_status_t
 axiom_soap_builder_process_namespace_data(
     axiom_soap_builder_t * soap_builder,
     const axutil_env_t * env,
-    axiom_node_t * om_node,
-    axis2_bool_t is_soap_element)
+    axiom_node_t * om_node)
 {
     axiom_element_t *om_ele = NULL;
     axiom_namespace_t *om_ns = NULL;
-    axis2_char_t *ns_uri = NULL;
-
-    if(!om_node)
-    {
-        return AXIS2_FAILURE;
-    }
 
-    if(!is_soap_element)
+    om_ele = (axiom_element_t *)axiom_node_get_data_element(om_node, env);
+    om_ns = axiom_element_get_namespace(om_ele, env, om_node);
+    if(om_ns)
     {
-        return AXIS2_SUCCESS;
-    }
-    if(axiom_node_get_node_type(om_node, env) == AXIOM_ELEMENT)
-    {
-        om_ele = (axiom_element_t *)axiom_node_get_data_element(om_node, env);
-        if(om_ele)
+        axis2_char_t *ns_uri = NULL;
+        ns_uri = axiom_namespace_get_uri(om_ns, env);
+        if(ns_uri)
         {
-            om_ns = axiom_element_get_namespace(om_ele, env, om_node);
-            if(om_ns)
+            if((axutil_strcmp(ns_uri, AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI) == 0)
+                || (axutil_strcmp(ns_uri, AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI) == 0))
             {
-                ns_uri = axiom_namespace_get_uri(om_ns, env);
-                if(ns_uri && (axutil_strcmp(ns_uri, AXIOM_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI) != 0)
-                    && (axutil_strcmp(ns_uri, AXIOM_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI) != 0))
-                {
-                    AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI,
-                        AXIS2_FAILURE);
-                    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
-                        "AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI");
-                    return AXIS2_FAILURE;
-                }
-
+                return AXIS2_SUCCESS;
             }
         }
     }
-    return AXIS2_SUCCESS;
+
+    AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI, AXIS2_FAILURE);
+    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid SOAP Namespace URI");
+    return AXIS2_FAILURE;
 }
 
 static axis2_status_t
@@ -977,149 +962,6 @@
     return AXIS2_SUCCESS;
 }
 
-static axis2_status_t
-axiom_soap_builder_construct_node_for_empty_element(
-    axiom_soap_builder_t * soap_builder,
-    const axutil_env_t * env,
-    axiom_node_t * parent,
-    axiom_node_t * om_element_node)
-{
-    axiom_element_t *parent_ele = NULL;
-    axis2_char_t *parent_localname = NULL;
-
-    axiom_element_t *om_element = NULL;
-    axis2_char_t *ele_localname = NULL;
-
-    int element_level = 0;
-    int status = AXIS2_SUCCESS;
-
-    AXIS2_PARAM_CHECK(env->error, om_element_node, AXIS2_FAILURE);
-    if(!soap_builder)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(!soap_builder->om_builder)
-    {
-        return AXIS2_FAILURE;
-    }
-    element_level = axiom_stax_builder_get_element_level(soap_builder->om_builder, env);
-
-    om_element = (axiom_element_t *)axiom_node_get_data_element(om_element_node, env);
-    if(!om_element)
-    {
-        return AXIS2_FAILURE;
-    }
-    ele_localname = axiom_element_get_localname(om_element, env);
-    if(!ele_localname)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(!parent)
-    {
-        return AXIS2_FAILURE;
-    }
-    parent_ele = (axiom_element_t *)axiom_node_get_data_element(parent, env);
-    if(!parent_ele)
-    {
-        return AXIS2_FAILURE;
-    }
-    parent_localname = axiom_element_get_localname(parent_ele, env);
-    if(!parent_localname)
-    {
-        return AXIS2_FAILURE;
-    }
-    if(element_level == 1)
-    {
-        if(axutil_strcmp(ele_localname, AXIOM_SOAP_HEADER_LOCAL_NAME) == 0)
-        {
-
-            /** this is the soap header element */
-            axiom_soap_header_t *soap_header = NULL;
-            if(soap_builder->header_present)
-            {
-                AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED,
-                    AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "SOAP builder encountered multiple headers");
-                return AXIS2_FAILURE;
-            }
-            if(soap_builder->body_present)
-            {
-                AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER,
-                    AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                    "SOAP builder encountered body element first and header next");
-                return AXIS2_FAILURE;
-            }
-
-            soap_builder->header_present = AXIS2_TRUE;
-
-            soap_header = axiom_soap_header_create(env);
-            if(!soap_header)
-            {
-                return AXIS2_FAILURE;
-            }
-            axiom_soap_header_set_base_node(soap_header, env, om_element_node);
-
-            axiom_soap_envelope_set_header(soap_builder->soap_envelope, env, soap_header);
-
-            axiom_soap_header_set_builder(soap_header, env, soap_builder);
-
-            axiom_soap_header_set_soap_version(soap_header, env, soap_builder->soap_version);
-
-            status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
-                AXIS2_TRUE);
-            if(status == AXIS2_FAILURE)
-            {
-                return AXIS2_FAILURE;
-            }
-        }
-        else if(axutil_strcmp(ele_localname, AXIOM_SOAP_BODY_LOCAL_NAME) == 0)
-        {
-
-            axiom_soap_body_t *soap_body = NULL;
-            if(soap_builder->body_present)
-            {
-                AXIS2_ERROR_SET(env->error,
-                    AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
-                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                    "SOAP builder multiple body elements encountered");
-                return AXIS2_FAILURE;
-
-            }
-            soap_builder->body_present = AXIS2_TRUE;
-
-            soap_body = axiom_soap_body_create(env);
-            if(!soap_body)
-            {
-                return AXIS2_FAILURE;
-            }
-            axiom_soap_body_set_base_node(soap_body, env, om_element_node);
-
-            axiom_soap_body_set_builder(soap_body, env, soap_builder);
-
-            axiom_soap_envelope_set_body(soap_builder->soap_envelope, env, soap_body);
-
-            status = axiom_soap_builder_process_namespace_data(soap_builder, env, om_element_node,
-                AXIS2_TRUE);
-
-            if(status == AXIS2_FAILURE)
-            {
-                return AXIS2_FAILURE;
-            }
-        }
-        else
-        {
-            AXIS2_ERROR_SET(env->error,
-                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");
-            return AXIS2_FAILURE;
-        }
-    }
-    return status;
-}
-
 AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
 axiom_soap_builder_get_mime_body_parts(
     axiom_soap_builder_t * builder,