/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
 #include <axis2_soap_builder.h>
 #include <axis2_soap_message.h>
 #include <axis2_soap_envelope.h>
 #include <axis2_soap_header.h>
 #include <axis2_soap11_builder_helper.h>
 #include <axis2_soap12_builder_helper.h>
 #include <axis2_soap.h>
 #include <axis2_soap_body.h>
 #include <axis2_soap_header_block.h>
 
 /*********************** impl struct *****************************************/
 
 typedef struct axis2_soap_builder_impl_t
 {
    axis2_soap_builder_t soap_builder;
    
    axis2_om_stax_builder_t *om_builder;
    
    axis2_soap_message_t *soap_message;
    
    axis2_soap_envelope_t *soap_envelope;
    
    axis2_bool_t header_present;
    
    axis2_bool_t body_present;
    
    int element_level;
    
    axis2_bool_t processing_fault;
    
    axis2_bool_t processing_detail_elements;
    
    axis2_char_t* sender_fault_code;
    
    axis2_char_t* receiver_fault_code;
    
    axis2_bool_t processing_mandatory_fault_elements;
    
    void *builder_helper;
    
    axis2_om_namespace_t *envelope_ns;
    
    int soap_version;
    
    int last_node_status;
    
    axis2_bool_t  done;
}axis2_soap_builder_impl_t;

typedef enum axis2_builder_last_node_states
{
    AXIS2_BUILDER_LAST_NODE_NULL = 0,
    AXIS2_BUILDER_LAST_NODE_DONE_TRUE,
    AXIS2_BUILDER_LAST_NODE_DONE_FALSE
}axis2_builder_last_node_states;

#define AXIS2_MAX_EVENT 100


/***************** Macro ******************************************************/

 #define AXIS2_INTF_TO_IMPL(builder) ((axis2_soap_builder_impl_t*)builder)
 
 /**************** function prototypes ****************************************/
 
axis2_status_t AXIS2_CALL 
axis2_soap_builder_free(axis2_soap_builder_t *builder,
                              axis2_env_t **env);

axis2_soap_envelope_t* AXIS2_CALL 
axis2_soap_builder_get_soap_envelope
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env);
                                
axis2_om_document_t* AXIS2_CALL 
axis2_soap_builder_get_document
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env);
                                
axis2_status_t AXIS2_CALL
axis2_soap_builder_next(axis2_soap_builder_t *builder,
                              axis2_env_t **env);
                                    
axis2_om_node_t* AXIS2_CALL
axis2_soap_builder_get_document_element
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env); 
                                 
axis2_status_t 
axis2_soap_builder_create_om_element
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env,
                                 axis2_om_node_t *current_node);
                                 
axis2_status_t AXIS2_CALL
axis2_soap_builder_process_namespace_data
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env,
                                 axis2_om_node_t *om_node,
                                 int is_soap_element);

static axis2_status_t
axis2_soap_builder_identify_soap_version(axis2_soap_builder_t *builder,
                      axis2_env_t **env,
                      axis2_char_t* soap_version_uri_from_transport);
                      
static axis2_status_t
axis2_soap_builder_construct_node(axis2_soap_builder_t *builder,
                                axis2_env_t **env,
                                axis2_om_node_t *parent,
                                axis2_om_node_t *element_node,
                                axis2_bool_t is_soap_envelope);                      

static axis2_status_t 
axis2_soap_builder_parse_headers(axis2_soap_builder_t *builder,
                                 axis2_env_t **env); 
              

axis2_status_t AXIS2_CALL 
axis2_soap_builder_set_bool_processing_mandatory_fault_elements
                                    (axis2_soap_builder_t *builder,
                                     axis2_env_t **env,
                                     axis2_bool_t value);
                                     
axis2_status_t AXIS2_CALL 
axis2_soap_builder_set_processing_detail_elements
                                    (axis2_soap_builder_t *builder,
                                     axis2_env_t **env,
                                     axis2_bool_t value); 
                                     
axis2_bool_t AXIS2_CALL 
axis2_soap_builder_is_processing_detail_elements
                            (axis2_soap_builder_t *builder, 
                             axis2_env_t **env); 
                             
int AXIS2_CALL
axis2_soap_builder_get_soap_version (axis2_soap_builder_t *builder, 
                             axis2_env_t **env);                                                                                                                   

/***************** function implementations ***********************************/

AXIS2_DECLARE(axis2_soap_builder_t *)
axis2_soap_builder_create(axis2_env_t **env,
                                axis2_om_stax_builder_t *builder,
                                axis2_char_t *soap_version)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    axis2_status_t status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK((*env)->error, builder, NULL);
    
    builder_impl = (axis2_soap_builder_impl_t*)AXIS2_MALLOC((*env)->allocator, 
            sizeof(axis2_soap_builder_impl_t));
    if(builder_impl == NULL)
    {
        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }
    
    builder_impl->done = AXIS2_FALSE;
    builder_impl->body_present = AXIS2_FALSE;
    builder_impl->builder_helper = NULL;
    builder_impl->element_level= 0;
    builder_impl->header_present = AXIS2_FALSE;
    builder_impl->om_builder = NULL;
    builder_impl->processing_detail_elements = AXIS2_FALSE;
    builder_impl->processing_fault = AXIS2_FALSE;
    builder_impl->processing_mandatory_fault_elements = AXIS2_FALSE;
    builder_impl->receiver_fault_code = NULL;
    builder_impl->sender_fault_code = NULL;
    builder_impl->soap_version = AXIS2_SOAP12;
    builder_impl->soap_builder.ops = NULL;
    builder_impl->last_node_status = -1;
    builder_impl->envelope_ns = NULL;
    builder_impl->soap_envelope = NULL;
    builder_impl->soap_message = NULL;
    builder_impl->soap_builder.ops = (axis2_soap_builder_ops_t*)
            AXIS2_MALLOC((*env)->allocator, sizeof(axis2_soap_builder_ops_t));
    if(!(builder_impl->soap_builder.ops))
    {
        AXIS2_FREE((*env)->allocator, builder_impl);
        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }
    
    builder_impl->om_builder = builder;
    builder_impl->soap_builder.ops->free = 
            axis2_soap_builder_free;
    builder_impl->soap_builder.ops->next =
            axis2_soap_builder_next;
    builder_impl->soap_builder.ops->get_soap_envelope =
            axis2_soap_builder_get_soap_envelope;
    builder_impl->soap_builder.ops->get_document =
            axis2_soap_builder_get_document;
    builder_impl->soap_builder.ops->set_bool_processing_mandatory_fault_elements =
            axis2_soap_builder_set_bool_processing_mandatory_fault_elements;                
    builder_impl->soap_builder.ops->set_processing_detail_elements =
            axis2_soap_builder_set_processing_detail_elements;
    builder_impl->soap_builder.ops->is_processing_detail_elements = 
            axis2_soap_builder_is_processing_detail_elements;            
    builder_impl->soap_builder.ops->get_soap_version =
            axis2_soap_builder_get_soap_version;
    builder_impl->soap_builder.ops->process_namespace_data =
            axis2_soap_builder_process_namespace_data;
    
    status = axis2_soap_builder_identify_soap_version(&(builder_impl->soap_builder), env, soap_version);
    if(status == AXIS2_FAILURE)
    {
        axis2_soap_builder_free(&(builder_impl->soap_builder), env);
        return NULL;
    }
    status = axis2_soap_builder_parse_headers(&(builder_impl->soap_builder), env);
    if(status == AXIS2_FAILURE)
    {
        axis2_soap_builder_free(&(builder_impl->soap_builder), env);
        return NULL;
    }
    return &(builder_impl->soap_builder);    
} 

axis2_status_t AXIS2_CALL 
axis2_soap_builder_free(axis2_soap_builder_t *builder,
                              axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    if(builder_impl->builder_helper)
    {
        if(builder_impl->soap_version == AXIS2_SOAP11 && builder_impl->builder_helper)
        {
            AXIS2_SOAP11_BUILDER_HELPER_FREE((axis2_soap11_builder_helper_t *)(builder_impl->builder_helper), env);
        }
        else if(builder_impl->soap_version == AXIS2_SOAP12 && builder_impl->builder_helper)
        {
            AXIS2_SOAP12_BUILDER_HELPER_FREE((axis2_soap12_builder_helper_t *)(builder_impl->builder_helper), env);
        }
    }
    if(builder->ops)
    {
        AXIS2_FREE((*env)->allocator, builder->ops);
    }
    AXIS2_FREE((*env)->allocator, builder_impl);
    return AXIS2_SUCCESS;
}
                              

axis2_soap_envelope_t* AXIS2_CALL 
axis2_soap_builder_get_soap_envelope
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    
    if(!(builder_impl->om_builder))
        return NULL;
    
    while(!(builder_impl->soap_envelope) && 
        !AXIS2_OM_STAX_BUILDER_IS_COMPLETE(builder_impl->om_builder, env))
    {
       status = axis2_soap_builder_next(builder, env); 
            if(status == AXIS2_FAILURE)
                  break;
    }        
    
    return builder_impl->soap_envelope;
}
                                
axis2_om_document_t* AXIS2_CALL 
axis2_soap_builder_get_document
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env)
 {
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, NULL);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    return AXIS2_OM_STAX_BUILDER_GET_DOCUMENT(builder_impl->om_builder, env);
 }
                                
axis2_status_t AXIS2_CALL
axis2_soap_builder_next(axis2_soap_builder_t *builder,
                              axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    axis2_om_node_t *lastnode = NULL;
    int current_event = AXIS2_MAX_EVENT;
    axis2_om_node_t *current_node =  NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    if(builder_impl->done)
    {
        return AXIS2_FAILURE;   
    }
    
    lastnode = AXIS2_OM_STAX_BUILDER_GET_LAST_NODE(builder_impl->om_builder, env);
    
    if(!lastnode)
    {
        builder_impl->last_node_status = AXIS2_BUILDER_LAST_NODE_NULL;
    }/*else if(AXIS2_OM_NODE_GET_BUILD_STATUS(lastnode, env))
    {
        builder_impl->last_node_status = AXIS2_BUILDER_LAST_NODE_DONE_TRUE;
    }*/
    else
    {
        builder_impl->last_node_status = AXIS2_BUILDER_LAST_NODE_DONE_FALSE;
    }
    /*
    current_node = AXIS2_OM_STAX_BUILDER_NEXT(builder_impl->om_builder, env);
    */
    current_event = AXIS2_OM_STAX_BUILDER_NEXT_WITH_TOKEN(builder_impl->om_builder, env);
    /*
    current_event = AXIS2_OM_STAX_BUILDER_GET_CURRENT_EVENT(builder_impl->om_builder, env);
    */
    if(current_event == -1)
    {
        builder_impl->done = AXIS2_TRUE;
        return AXIS2_FAILURE;
    }
    if(current_event == AXIS2_XML_READER_EMPTY_ELEMENT ||
        current_event ==  AXIS2_XML_READER_START_ELEMENT)
    {
      current_node = AXIS2_OM_STAX_BUILDER_GET_LAST_NODE(builder_impl->om_builder, env);
    
      status = axis2_soap_builder_create_om_element(builder, env, current_node);
    }
   
    return status;
}
                                    
axis2_om_node_t* AXIS2_CALL
axis2_soap_builder_get_document_element
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, NULL);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    return AXIS2_SOAP_ENVELOPE_GET_BASE_NODE(builder_impl->soap_envelope, env);
} 
                                       
                                                          
                                     
axis2_status_t
axis2_soap_builder_create_om_element
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env,
                                 axis2_om_node_t *current_node)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    int ret_val = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, current_node, AXIS2_FAILURE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    if(builder_impl->last_node_status == AXIS2_BUILDER_LAST_NODE_NULL)
    {
       
       ret_val =  axis2_soap_builder_construct_node(builder, env, NULL, current_node, AXIS2_TRUE);
         
    }/*else if(builder_impl->last_node_status == AXIS2_BUILDER_LAST_NODE_DONE_TRUE)
    {
      ret_val =  axis2_soap_builder_construct_node(builder, env, 
            AXIS2_OM_NODE_GET_PARENT(current_node, env), current_node, AXIS2_FALSE);
    
    }*/
    else
    {
       ret_val = axis2_soap_builder_construct_node(builder, env, 
            AXIS2_OM_NODE_GET_PARENT(current_node, env), current_node, AXIS2_FALSE);
    }
    return ret_val;
}   

static axis2_status_t
axis2_soap_builder_construct_node(axis2_soap_builder_t *builder,
                                axis2_env_t **env,
                                axis2_om_node_t *parent,
                                axis2_om_node_t *om_element_node,
                                axis2_bool_t is_soap_envelope)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    
    axis2_om_element_t *parent_ele  = NULL;
    axis2_char_t *parent_localname = NULL;
    
    axis2_om_element_t *om_element = NULL;
    axis2_char_t *ele_localname = NULL;
    
    int element_level = 0;
    int status = AXIS2_SUCCESS;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, om_element_node, AXIS2_FAILURE);
    
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    
    
    element_level = AXIS2_OM_STAX_BUILDER_GET_ELEMENT_LEVEL(
                        builder_impl->om_builder, env);
    
    om_element = (axis2_om_element_t *)
                AXIS2_OM_NODE_GET_DATA_ELEMENT(om_element_node, env);
     
    ele_localname = AXIS2_OM_ELEMENT_GET_LOCALNAME(om_element, env);
    
    
    if(parent)
    {
        parent_ele = (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(parent, env);
        parent_localname = AXIS2_OM_ELEMENT_GET_LOCALNAME(parent_ele, env);
    }
    if(!parent && is_soap_envelope)
    {   
        
        if(AXIS2_STRCASECMP(ele_localname, AXIS2_SOAP_ENVELOPE_LOCAL_NAME) != 0)
        {
            AXIS2_ERROR_SET((*env)->error, 
                AXIS2_ERROR_SOAP_MESSAGE_FIRST_ELEMENT_MUST_CONTAIN_LOCAL_NAME, AXIS2_FAILURE);
            return AXIS2_FAILURE;   
        }
        builder_impl->soap_envelope = axis2_soap_envelope_create_null(env);
       
        status = AXIS2_SOAP_ENVELOPE_SET_BASE_NODE(builder_impl->soap_envelope, 
                    env, om_element_node);
        
        AXIS2_SOAP_ENVELOPE_SET_BUILDER(builder_impl->soap_envelope, env, builder);
        
        status = axis2_soap_builder_process_namespace_data(builder, env, om_element_node, AXIS2_TRUE);
        if(status == AXIS2_FAILURE)
            return AXIS2_FAILURE;
    }
    else if(element_level == 2)
    {
        if(AXIS2_STRCMP(ele_localname, AXIS2_SOAP_HEADER_LOCAL_NAME) == 0)
        {   
            axis2_soap_header_t *soap_header = NULL;
            if(builder_impl->header_present)
            {
                printf("AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED");
                AXIS2_ERROR_SET((*env)->error, 
                    AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_HEADERS_ENCOUNTERED, AXIS2_FAILURE);
                    return AXIS2_FAILURE;
            }
            if(builder_impl->body_present)
            {
                printf("AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER");
                AXIS2_ERROR_SET((*env)->error,
                    AXIS2_ERROR_SOAP_BUILDER_HEADER_BODY_WRONG_ORDER, AXIS2_FAILURE);
                return  AXIS2_FAILURE;                                              
            }
            builder_impl->header_present = AXIS2_TRUE;
            soap_header = axis2_soap_header_create(env);
            AXIS2_SOAP_HEADER_SET_BASE_NODE(soap_header, env, om_element_node);
            AXIS2_SOAP_HEADER_SET_SOAP_VERSION(soap_header, env, builder_impl->soap_version);
            AXIS2_SOAP_ENVELOPE_SET_HEADER(builder_impl->soap_envelope, env, soap_header);
            AXIS2_SOAP_HEADER_SET_BUILDER(soap_header, env, builder);
            status = axis2_soap_builder_process_namespace_data(builder, env, 
                                om_element_node, AXIS2_TRUE);
            if(status == AXIS2_FAILURE)
                return AXIS2_FAILURE;
            
        }
        else if(AXIS2_STRCMP(ele_localname, AXIS2_SOAP_BODY_LOCAL_NAME) == 0)
        {
           
            axis2_soap_body_t *soap_body = NULL;
            if(builder_impl->body_present)
            {
                printf("AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED");
                AXIS2_ERROR_SET((*env)->error, 
                    AXIS2_ERROR_SOAP_BUILDER_MULTIPLE_BODY_ELEMENTS_ENCOUNTERED, AXIS2_FAILURE);
                return AXIS2_FAILURE;                   
            
            }
            builder_impl->body_present = AXIS2_TRUE;                
            soap_body = axis2_soap_body_create(env);
            AXIS2_SOAP_BODY_SET_BASE_NODE(soap_body, env, om_element_node);
            AXIS2_SOAP_BODY_SET_SOAP_VERSION(soap_body, env, builder_impl->soap_version);
            AXIS2_SOAP_BODY_SET_BUILDER(soap_body, env, builder);
            AXIS2_SOAP_ENVELOPE_SET_BODY(builder_impl->soap_envelope, env, soap_body);
            status = axis2_soap_builder_process_namespace_data(builder, env, 
                        om_element_node, AXIS2_TRUE);
            if(status == AXIS2_FAILURE)
                return AXIS2_FAILURE;
        }
        else
        {
            printf("AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY");
            AXIS2_ERROR_SET((*env)->error,
                    AXIS2_ERROR_SOAP_BUILDER_ENVELOPE_CAN_HAVE_ONLY_HEADER_AND_BODY, AXIS2_FAILURE);
            return AXIS2_FAILURE;                                            
        }
    }
    else if((element_level == 3) && AXIS2_STRCASECMP(parent_localname, 
            AXIS2_SOAP_HEADER_LOCAL_NAME) == 0)
    {
            axis2_soap_header_block_t *header_block = NULL;
            axis2_soap_header_t *soap_header = NULL;
            header_block = axis2_soap_header_block_create(env);
            AXIS2_SOAP_HEADER_BLOCK_SET_BASE_NODE(header_block, env, om_element_node);
            AXIS2_SOAP_HEADER_BLOCK_SET_SOAP_VERSION(header_block, env, builder_impl->soap_version);
            soap_header = AXIS2_SOAP_ENVELOPE_GET_HEADER(builder_impl->soap_envelope, env);
            AXIS2_SOAP_HEADER_SET_HEADER_BLOCK(soap_header, env, header_block);

    }
    else if((element_level == 3) && 
            AXIS2_STRCASECMP(parent_localname, AXIS2_SOAP_BODY_LOCAL_NAME) == 0 &&
                AXIS2_STRCASECMP(ele_localname, AXIS2_SOAP_BODY_FAULT_LOCAL_NAME) == 0)
    {
            axis2_soap_body_t *soap_body = NULL;
            axis2_soap_fault_t *soap_fault = NULL;
            axis2_om_node_t *envelope_node = NULL;
            axis2_om_element_t *envelope_ele = NULL;
            axis2_om_namespace_t *env_ns = NULL;
            envelope_node = AXIS2_SOAP_ENVELOPE_GET_BASE_NODE(
                builder_impl->soap_envelope, env);
            envelope_ele = (axis2_om_element_t *)
                AXIS2_OM_NODE_GET_DATA_ELEMENT(envelope_node, env);
            env_ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(envelope_ele, env);
                       
            soap_body = AXIS2_SOAP_ENVELOPE_GET_BODY(builder_impl->soap_envelope, env);
            if(!soap_body )
                return AXIS2_FAILURE;
            soap_fault = axis2_soap_fault_create(env);
            if(!soap_fault) 
                return AXIS2_FAILURE;
            AXIS2_SOAP_FAULT_SET_BASE_NODE(soap_fault, env, om_element_node);
            
            AXIS2_SOAP_FAULT_SET_SOAP_VERSION(soap_fault, env, builder_impl->soap_version);
            
            AXIS2_SOAP_BODY_SET_FAULT(soap_body, env, soap_fault);                    
                                
            builder_impl->processing_fault = AXIS2_TRUE;
            builder_impl->processing_mandatory_fault_elements = AXIS2_TRUE; 
            if(AXIS2_STRCMP(AXIS2_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI, 
                AXIS2_OM_NAMESPACE_GET_URI(env_ns , env)) == 0)
            {
                builder_impl->builder_helper = axis2_soap12_builder_helper_create(env, builder); 
             
            }
            else if(AXIS2_STRCMP(AXIS2_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI, 
                AXIS2_OM_NAMESPACE_GET_URI(env_ns , env)) == 0)
            {   
                builder_impl->builder_helper = axis2_soap11_builder_helper_create(env, builder, builder_impl->om_builder);            
            }
             
    }
    else if(element_level > 3 && builder_impl->processing_fault)
    {
        if(builder_impl->soap_version == AXIS2_SOAP11)
        {   
             status = AXIS2_SOAP11_BUILDER_HELPER_HANDLE_EVENT(((axis2_soap11_builder_helper_t*)(builder_impl->builder_helper)), 
                env,  om_element_node , element_level);
        
        }
        if(builder_impl->soap_version == AXIS2_SOAP12)
        {
            status = AXIS2_SOAP12_BUILDER_HELPER_HANDLE_EVENT(((axis2_soap12_builder_helper_t *)
            (builder_impl->builder_helper)), env,  om_element_node , element_level);
        }
        
    }
    return status;
}

axis2_status_t AXIS2_CALL 
axis2_soap_builder_process_namespace_data
                                (axis2_soap_builder_t *builder,
                                 axis2_env_t **env,
                                 axis2_om_node_t *om_node,
                                 int is_soap_element)
{
    axis2_om_element_t *om_ele = NULL;
    axis2_om_namespace_t *om_ns = NULL;
    axis2_char_t *ns_uri = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, om_node, AXIS2_FAILURE);
    if(!is_soap_element)
        return AXIS2_SUCCESS;
    if(AXIS2_OM_NODE_GET_NODE_TYPE(om_node, env) == AXIS2_OM_ELEMENT)
    {
        om_ele = (axis2_om_element_t *) AXIS2_OM_NODE_GET_DATA_ELEMENT(om_node, env);
        om_ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(om_ele, env);
        ns_uri = AXIS2_OM_NAMESPACE_GET_URI(om_ns, env);
        if(om_ns && 
                (AXIS2_STRCMP(ns_uri, AXIS2_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI) != 0) &&
                (AXIS2_STRCMP(ns_uri, AXIS2_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI) != 0))
        {
            AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI, AXIS2_FAILURE);                
            AXIS2_LOG_WRITE((*env)->log,"AXIS2_ERROR_INVALID_SOAP_NAMESPACE_URI", AXIS2_LOG_LEVEL_DEBUG);
            return AXIS2_FAILURE;
        }
    }    
    return AXIS2_SUCCESS;
}

static axis2_status_t 
axis2_soap_builder_identify_soap_version(axis2_soap_builder_t *builder,
                      axis2_env_t **env,
                      axis2_char_t* soap_version_uri_from_transport)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    axis2_om_namespace_t *om_ns = NULL;
    axis2_om_node_t *envelope_node = NULL;
    axis2_om_element_t *om_ele = NULL;
    axis2_char_t *ns_uri = NULL;
    AXIS2_PARAM_CHECK((*env)->error, soap_version_uri_from_transport, AXIS2_FAILURE);    
    
    
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    builder_impl->soap_envelope = 
        axis2_soap_builder_get_soap_envelope(builder, env);
    if(builder_impl->soap_envelope == NULL)
    {
        AXIS2_ERROR_SET((*env)->error, 
            AXIS2_ERROR_SOAP_MESSAGE_DOES_NOT_CONTAIN_AN_ENVELOPE, AXIS2_FAILURE);
        AXIS2_LOG_WRITE((*env)->log, " soap message does not have a soap envelope element ",
            AXIS2_LOG_LEVEL_CRITICAL);        
        return AXIS2_FAILURE;
    }
    envelope_node = AXIS2_SOAP_ENVELOPE_GET_BASE_NODE(builder_impl->soap_envelope, env);
    om_ele = (axis2_om_element_t *) AXIS2_OM_NODE_GET_DATA_ELEMENT(envelope_node, env);
    
    om_ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(om_ele, env);
    
    ns_uri = AXIS2_OM_NAMESPACE_GET_URI(om_ns, env);
    if(ns_uri != NULL)
    {        
       if(soap_version_uri_from_transport && AXIS2_STRCMP(soap_version_uri_from_transport, ns_uri) != 0)
        {
            AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_TRANSPORT_LEVEL_INFORMATION_DOES_NOT_MATCH_WITH_SOAP, AXIS2_FAILURE);
            AXIS2_LOG_WRITE((*env)->log , "AXIS2_ERROR_TRANSPORT_LEVEL_INFORMATION_DOES_NOT_MATCH_WITH_SOAP",
                AXIS2_LOG_LEVEL_ERROR);            
            return AXIS2_FAILURE;
        }            
        if(AXIS2_STRCMP(AXIS2_SOAP11_SOAP_ENVELOPE_NAMESPACE_URI, ns_uri) == 0)
        {
            builder_impl->soap_version = AXIS2_SOAP11;        
            AXIS2_LOG_WRITE((*env)->log,"Identified soap version is soap11", AXIS2_LOG_LEVEL_DEBUG);
        }
        else if(AXIS2_STRCMP(AXIS2_SOAP12_SOAP_ENVELOPE_NAMESPACE_URI, ns_uri) == 0)
        {
            builder_impl->soap_version = AXIS2_SOAP12;          
            AXIS2_LOG_DEBUG((*env)->log, AXIS2_LOG_SI, "identified soap version is soap12");
            
        }
        AXIS2_SOAP_ENVELOPE_SET_SOAP_VERSION(builder_impl->soap_envelope, env, builder_impl->soap_version);        
       
        return AXIS2_SUCCESS;
    }
    return AXIS2_FAILURE;
} 

static axis2_status_t 
axis2_soap_builder_parse_headers(axis2_soap_builder_t *builder,
              axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    axis2_om_node_t *om_node = NULL;
    axis2_soap_header_t *soap_header = NULL;
    int status = AXIS2_SUCCESS;
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    soap_header = AXIS2_SOAP_ENVELOPE_GET_HEADER(builder_impl->soap_envelope, env);
    if(soap_header != NULL)
    {
        om_node = AXIS2_SOAP_HEADER_GET_BASE_NODE(soap_header, env);
        while(!AXIS2_OM_NODE_GET_BUILD_STATUS(om_node, env))
        {
            status = axis2_soap_builder_next(builder, env);
            if(status == AXIS2_FAILURE)
                return AXIS2_FAILURE;
        }
    }
    return AXIS2_SUCCESS;
} 

axis2_status_t AXIS2_CALL 
axis2_soap_builder_set_bool_processing_mandatory_fault_elements
                                    (axis2_soap_builder_t *builder,
                                     axis2_env_t **env,
                                     axis2_bool_t value)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FALSE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    builder_impl->processing_mandatory_fault_elements = value;
    return AXIS2_SUCCESS;
}                                                                                                                                                      

axis2_status_t AXIS2_CALL 
axis2_soap_builder_set_processing_detail_elements
                                    (axis2_soap_builder_t *builder,
                                     axis2_env_t **env,
                                     axis2_bool_t value)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FALSE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    builder_impl->processing_detail_elements = value;
    return AXIS2_SUCCESS;
}    

axis2_bool_t AXIS2_CALL 
axis2_soap_builder_is_processing_detail_elements
                            (axis2_soap_builder_t *builder, 
                             axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FALSE);
    builder_impl = AXIS2_INTF_TO_IMPL(builder);
    return builder_impl->processing_detail_elements ;
}     

int AXIS2_CALL
axis2_soap_builder_get_soap_version (axis2_soap_builder_t *builder, 
                             axis2_env_t **env)
{
    axis2_soap_builder_impl_t *builder_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FALSE);
     builder_impl = AXIS2_INTF_TO_IMPL(builder);
    return builder_impl->soap_version ;
}
