/*
 * 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_fault.h>
 #include <axis2_soap.h>
 #include <axis2_soap_body.h>
 #include <axis2_om_node.h>
 #include <axis2_om_element.h>
 #include <axis2_soap_fault_code.h>
 #include <axis2_soap_fault_detail.h>
 #include <axis2_soap_fault_value.h>
 #include <axis2_soap_fault_text.h>
 #include <axis2_soap_fault_reason.h>
 #include <axis2_soap_fault_role.h>
 #include <axis2_soap_fault_node.h>
 #include <axis2_soap_utils.h>
 #include <axis2_soap_builder.h>
 
/**************** impl struct ************************************************/

typedef struct axis2_soap_fault_impl_t
{
    axis2_soap_fault_t soap_fault;
    /* om element node corresponding to soap fault */
    axis2_om_node_t *om_ele_node;
    
    /* soap fault code sub element */
    axis2_soap_fault_code_t *fcode;
    /* soap fault reason sub element */
    axis2_soap_fault_reason_t *freason;
    /* soap fault node sub element */
    axis2_soap_fault_node_t *fnode;
    /* soap fault role sub element */
    axis2_soap_fault_role_t *frole;
    /* soap fault detail sub element */
    axis2_soap_fault_detail_t *fdetail;
    
    axis2_char_t *exception;
    /* soap version */
    int soap_version;
    /* reference to soap builder */
    axis2_soap_builder_t *soap_builder;
    
}axis2_soap_fault_impl_t;

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

#define AXIS2_INTF_TO_IMPL(fault) ((axis2_soap_fault_impl_t*)fault)

/************************ function prototype **********************************/


axis2_status_t AXIS2_CALL 
axis2_soap_fault_free(axis2_soap_fault_t *fault,
                      axis2_env_t **env);

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_code(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_code_t *code);
                                        
axis2_soap_fault_code_t * AXIS2_CALL 
axis2_soap_fault_get_code(axis2_soap_fault_t *fault,
                          axis2_env_t **env);
                                    
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_reason(axis2_soap_fault_t *fault,
                            axis2_env_t **env,
                            axis2_soap_fault_reason_t *reason);
                                        
axis2_soap_fault_reason_t* AXIS2_CALL 
axis2_soap_fault_get_reason(axis2_soap_fault_t *fault,
                            axis2_env_t **env);
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_node(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_node_t *node);
                                        
axis2_soap_fault_node_t* AXIS2_CALL 
axis2_soap_fault_get_node(axis2_soap_fault_t *fault,
                          axis2_env_t **env);
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_role(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_role_t *role);
                                        
axis2_soap_fault_role_t* AXIS2_CALL 
axis2_soap_fault_get_role(axis2_soap_fault_t *fault,
                          axis2_env_t **env);

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_detail(axis2_soap_fault_t *fault,
                            axis2_env_t **env,
                            axis2_soap_fault_detail_t *detail);
                                
axis2_soap_fault_detail_t* AXIS2_CALL 
axis2_soap_fault_get_detail(axis2_soap_fault_t *fault,
                            axis2_env_t **env);   

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_base_node(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                               axis2_om_node_t *node);
                                        
axis2_om_node_t* AXIS2_CALL 
axis2_soap_fault_get_base_node(axis2_soap_fault_t *fault,
                               axis2_env_t **env);  
                                                
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_soap_version(axis2_soap_fault_t *fault,
                                  axis2_env_t **env,
                                  int soap_version);
                                    
int AXIS2_CALL 
axis2_soap_fault_get_soap_version(axis2_soap_fault_t *fault,
                                  axis2_env_t **env);    
                                  
axis2_char_t * AXIS2_CALL 
axis2_soap_fault_get_exception(axis2_soap_fault_t *fault,
                               axis2_env_t **env);
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_exception(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                               axis2_char_t *exception);                                                                                                                                                                                                                                                                                         

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_builder(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                              axis2_soap_builder_t *builder);
                              
/***************** function implementations ***********************************/

AXIS2_DECLARE(axis2_soap_fault_t *)
axis2_soap_fault_create(axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = (axis2_soap_fault_impl_t*)AXIS2_MALLOC(
                    (*env)->allocator,
                    sizeof(axis2_soap_fault_impl_t));
    if(!fault_impl)
    {
        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }
    fault_impl->exception = NULL;
    fault_impl->fcode = NULL;
    fault_impl->fdetail = NULL;
    fault_impl->fnode = NULL;
    fault_impl->freason = NULL;
    fault_impl->frole = NULL;
    fault_impl->om_ele_node = NULL;
    fault_impl->soap_fault.ops = NULL;
    fault_impl->soap_version = AXIS2_SOAP_VERSION_NOT_SET;

    fault_impl->soap_fault.ops = (axis2_soap_fault_ops_t*)AXIS2_MALLOC(
                                 (*env)->allocator,
                                 sizeof(axis2_soap_fault_ops_t));

    if(!(fault_impl->soap_fault.ops))
    {
        AXIS2_FREE((*env)->allocator, fault_impl);
        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;    
    }

    fault_impl->soap_fault.ops->get_soap_version =
        axis2_soap_fault_get_soap_version;
    fault_impl->soap_fault.ops->set_soap_version =
        axis2_soap_fault_set_soap_version;
    fault_impl->soap_fault.ops->free_fn =
        axis2_soap_fault_free;
    fault_impl->soap_fault.ops->get_base_node =
        axis2_soap_fault_get_base_node;
    fault_impl->soap_fault.ops->set_base_node =
        axis2_soap_fault_set_base_node;
    fault_impl->soap_fault.ops->set_code =
        axis2_soap_fault_set_code;
    fault_impl->soap_fault.ops->get_code =
        axis2_soap_fault_get_code;
    fault_impl->soap_fault.ops->set_reason =
        axis2_soap_fault_set_reason;
    fault_impl->soap_fault.ops->get_reason =
        axis2_soap_fault_get_reason;        
    fault_impl->soap_fault.ops->set_role =
        axis2_soap_fault_set_role;
    fault_impl->soap_fault.ops->get_role =
        axis2_soap_fault_get_role;
    fault_impl->soap_fault.ops->get_node =
        axis2_soap_fault_get_node;
    fault_impl->soap_fault.ops->set_node =
        axis2_soap_fault_set_node;
    fault_impl->soap_fault.ops->get_detail =
        axis2_soap_fault_get_detail;
    fault_impl->soap_fault.ops->set_detail =
        axis2_soap_fault_set_detail; 
    fault_impl->soap_fault.ops->get_exception =
        axis2_soap_fault_get_exception;
    fault_impl->soap_fault.ops->set_exception =
        axis2_soap_fault_set_exception;
    fault_impl->soap_fault.ops->set_builder =
        axis2_soap_fault_set_builder;                            
                                                                                               
    return &(fault_impl->soap_fault);
}


AXIS2_DECLARE(axis2_soap_fault_t *)
axis2_soap_fault_create_with_parent(axis2_env_t **env,
                                    axis2_soap_body_t *body)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    axis2_soap_fault_t *fault = NULL;
    axis2_om_element_t *this_ele = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_om_node_t *parent_node = NULL;
    axis2_om_element_t *parent_ele = NULL;
    axis2_om_namespace_t *parent_ns = NULL;
    
    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK((*env)->error, body, NULL);
    
    fault = axis2_soap_fault_create(env);
    if(!fault)
        return NULL;
        
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    parent_node = AXIS2_SOAP_BODY_GET_BASE_NODE(body, env);
    parent_ele  = (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(
                        parent_node, env);
    parent_ns = AXIS2_OM_ELEMENT_GET_NAMESPACE(parent_ele, env);
    this_ele = axis2_om_element_create(env, 
                                       parent_node,                             
                                       AXIS2_SOAP_FAULT_LOCAL_NAME,
                                       parent_ns,
                                       &this_node);
    fault_impl->om_ele_node = this_node;
    AXIS2_SOAP_BODY_SET_FAULT(body, env, fault);    
    return  &(fault_impl->soap_fault);  
}


AXIS2_DECLARE(axis2_soap_fault_t *)
axis2_soap_fault_create_with_exception(axis2_env_t **env,
                                        axis2_soap_body_t *body,  
                                        axis2_char_t* exception)
{
    axis2_soap_fault_t *fault = NULL;
    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK((*env)->error, body, NULL);
    AXIS2_PARAM_CHECK((*env)->error, exception, NULL);
    fault = axis2_soap_fault_create_with_parent(env, body);
    if(!fault)
        return NULL;
    axis2_soap_fault_set_exception(fault, env, exception);
    return fault;
}


axis2_status_t AXIS2_CALL 
axis2_soap_fault_free(axis2_soap_fault_t *fault,
                      axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    
    if(fault_impl->fcode)
    {
        AXIS2_SOAP_FAULT_CODE_FREE(fault_impl->fcode, env);
        fault_impl->fcode = NULL;
    }
    if(fault_impl->fdetail)
    {
        AXIS2_SOAP_FAULT_DETAIL_FREE(fault_impl->fdetail, env);
        fault_impl->fdetail = NULL;
    }
    if(fault_impl->fnode)
    {
        AXIS2_SOAP_FAULT_NODE_FREE(fault_impl->fnode, env);
        fault_impl->fnode = NULL;
    }    
    if(fault_impl->freason)
    {
        AXIS2_SOAP_FAULT_REASON_FREE(fault_impl->freason, env);
        fault_impl->freason = NULL;
    }
    if(fault_impl->frole)
    {
        AXIS2_SOAP_FAULT_ROLE_FREE(fault_impl->frole, env);
        fault_impl->frole = NULL;
    }
    if(fault->ops)
    {
        AXIS2_FREE((*env)->allocator, fault->ops);
        fault->ops = NULL;
    }
    AXIS2_FREE((*env)->allocator, fault_impl);
    fault_impl = NULL;
    return AXIS2_SUCCESS;
}

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_code(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_code_t *code)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, code, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    /* axis2_soap_fault_get_code(fault_code, env); 
    if(fault_impl->fcode)
    {
        my_node = AXIS2_SOAP_FAULT_CODE_GET_BASE_NODE(
                            fault_impl->fcode, env);
        AXIS2_SOAP_FAULT_CODE_FREE(fault_impl->fcode, env);
        fault_impl->fcode = NULL;
    }
    code_node = AXIS2_SOAP_FAULT_CODE_GET_BASE_NODE(
                            code, env);
    axis2_soap_utils_set_new_node(env, 
                    fault_impl->om_ele_node,
                    &my_node, 
                    code_node);
    */                    
    fault_impl->fcode = code;
    return AXIS2_SUCCESS;  
}
                                        
axis2_soap_fault_code_t * AXIS2_CALL 
axis2_soap_fault_get_code(axis2_soap_fault_t *fault,
                          axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    if(fault_impl->fcode)
    {
        return fault_impl->fcode;
    } 
    else if(fault_impl->soap_builder)
    {
        while(!(fault_impl->fcode) && !(AXIS2_OM_NODE_GET_BUILD_STATUS(fault_impl->om_ele_node, env)))
        {
            status = AXIS2_SOAP_BUILDER_NEXT(fault_impl->soap_builder, env);
            if(status == AXIS2_FAILURE)
                break;
        }            
    }
    /*
    axis2_om_node_t *code_node = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_soap_fault_code_t* code = NULL;
    this_node = fault_impl->om_ele_node;
    if(!(fault_impl->fcode))
    {
        code_node = axis2_soap_utils_get_child_with_name(env, 
                                            this_node, 
                                            AXIS2_SOAP12_SOAP_FAULT_CODE_LOCAL_NAME);
        code = axis2_soap_fault_code_create(env);
        AXIS2_SOAP_FAULT_CODE_SET_BASE_NODE(code , env, code_node);
        fault_impl->fcode = code;
    }
    */
    return fault_impl->fcode; 
}
                                    
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_reason(axis2_soap_fault_t *fault,
                            axis2_env_t **env,
                            axis2_soap_fault_reason_t *reason)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, reason, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
   /*
    axis2_om_node_t *reason_node = NULL;
    axis2_om_node_t *my_node = NULL;
    axis2_soap_fault_get_reason(fault_reason, env); 
    if(fault_impl->freason)
    {
        my_node = AXIS2_SOAP_FAULT_REASON_GET_BASE_NODE(
                            fault_impl->freason, env);
        AXIS2_SOAP_FAULT_REASON_FREE(fault_impl->freason, env);
        fault_impl->freason = NULL;
    }
    reason_node = AXIS2_SOAP_FAULT_REASON_GET_BASE_NODE(
                            reason, env);
    axis2_soap_utils_set_new_node(env, 
                    fault_impl->om_ele_node,
                    &my_node, 
                    reason_node);
    */                    
    fault_impl->freason = reason;
    return AXIS2_SUCCESS;  
}
                                        
axis2_soap_fault_reason_t* AXIS2_CALL 
axis2_soap_fault_get_reason(axis2_soap_fault_t *fault,
                            axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    if(fault_impl->freason)
    {
        return fault_impl->freason;
    } 
    else if(fault_impl->soap_builder)
    {
        while(!(fault_impl->freason) && !(AXIS2_OM_NODE_GET_BUILD_STATUS(fault_impl->om_ele_node, env)))
        {
            status = AXIS2_SOAP_BUILDER_NEXT(fault_impl->soap_builder, env);
            if(status == AXIS2_FAILURE)
                break;
        }            
    }
    /*
    axis2_om_node_t *reason_node = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_soap_fault_reason_t* reason = NULL;
    this_node = fault_impl->om_ele_node;
    if(!(fault_impl->freason))
    {
        reason_node = axis2_soap_utils_get_child_with_name(env, 
                                            this_node, 
                                            AXIS2_SOAP12_SOAP_FAULT_REASON_LOCAL_NAME);
        reason = axis2_soap_fault_reason_create(env);
        AXIS2_SOAP_FAULT_REASON_SET_BASE_NODE(reason , env, reason_node);
        fault_impl->freason = reason;
    }
    */
    return fault_impl->freason; 
}
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_node(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_node_t *node)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, node, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
   /* 
    axis2_om_node_t *node_node = NULL;
    axis2_om_node_t *my_node = NULL;
    axis2_soap_fault_get_node(fault_node, env); 
    if(fault_impl->fnode)
    {
        my_node = AXIS2_SOAP_FAULT_NODE_GET_BASE_NODE(
                            fault_impl->fnode, env);
        AXIS2_SOAP_FAULT_NODE_FREE(fault_impl->fnode, env);
        fault_impl->fnode = NULL;
    }
    node_node = AXIS2_SOAP_FAULT_NODE_GET_BASE_NODE(
                            node, env);
    axis2_soap_utils_set_new_node(env, 
                    fault_impl->om_ele_node,
                    &my_node, 
                    node_node);
    */                    
    fault_impl->fnode = node;
    return AXIS2_SUCCESS;
}
                                        
axis2_soap_fault_node_t* AXIS2_CALL 
axis2_soap_fault_get_node(axis2_soap_fault_t *fault,
                          axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    
    if(fault_impl->fnode)
    {
        return fault_impl->fnode;
    } 
    else if(fault_impl->soap_builder)
    {
        while(!(fault_impl->fnode) && !(AXIS2_OM_NODE_GET_BUILD_STATUS(fault_impl->om_ele_node, env)))
        {
            status = AXIS2_SOAP_BUILDER_NEXT(fault_impl->soap_builder, env);
            if(status == AXIS2_FAILURE)
                break;
        }            
    }
    /*
    axis2_om_node_t *node_node = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_soap_fault_node_t* node = NULL;
    this_node = fault_impl->om_ele_node;
    if(!(fault_impl->fnode))
    {
        node_node = axis2_soap_utils_get_child_with_name(env, 
                                            this_node, 
                                            AXIS2_SOAP12_SOAP_FAULT_NODE_LOCAL_NAME);
        node = axis2_soap_fault_node_create(env);
        AXIS2_SOAP_FAULT_NODE_SET_BASE_NODE(node , env, node_node);
        fault_impl->fnode = node;
    }
    */
    return fault_impl->fnode; 
}
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_role(axis2_soap_fault_t *fault,
                          axis2_env_t **env,
                          axis2_soap_fault_role_t *role)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
   
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, role, AXIS2_FAILURE);
    
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
   /* 
    axis2_om_node_t *role_node = NULL;
    axis2_om_node_t *my_node = NULL;
    axis2_soap_fault_get_role(fault_role, env); 
    if(fault_impl->frole)
    {
        my_node = AXIS2_SOAP_FAULT_ROLE_GET_BASE_NODE(
                            fault_impl->frole, env);
        AXIS2_SOAP_FAULT_ROLE_FREE(fault_impl->frole, env);
        fault_impl->frole = NULL;
    }
    role_node = AXIS2_SOAP_FAULT_ROLE_GET_BASE_NODE(
                            role, env);
    axis2_soap_utils_set_new_node(env, 
                    fault_impl->om_ele_node,
                    &my_node, 
                    role_node);
    */                    
    fault_impl->frole = role;
    return AXIS2_SUCCESS;  

}
                                        
axis2_soap_fault_role_t* AXIS2_CALL 
axis2_soap_fault_get_role(axis2_soap_fault_t *fault,
                          axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    if(fault_impl->frole)
    {
        return fault_impl->frole;
    } 
    else if(fault_impl->soap_builder)
    {
        while(!(fault_impl->frole) && !(AXIS2_OM_NODE_GET_BUILD_STATUS(fault_impl->om_ele_node, env)))
        {
            status = AXIS2_SOAP_BUILDER_NEXT(fault_impl->soap_builder, env);
            if(status == AXIS2_FAILURE)
                break;
        }            
    }
    /*
    axis2_om_node_t *role_node = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_soap_fault_role_t* role = NULL;
    this_node = fault_impl->om_ele_node;
    if(!(fault_impl->frole))
    {
        role_node = axis2_soap_utils_get_child_with_name(env, 
                                            this_node, 
                                            AXIS2_SOAP12_SOAP_FAULT_ROLE_LOCAL_NAME);
                                                    
        role = axis2_soap_fault_role_create(env);
        AXIS2_SOAP_FAULT_ROLE_SET_BASE_NODE(role , env, role_node);
        fault_impl->frole = role;
    }
    */
    return fault_impl->frole; 
}

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_detail(axis2_soap_fault_t *fault,
                            axis2_env_t **env,
                            axis2_soap_fault_detail_t *detail)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, detail, AXIS2_FAILURE);
    
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
   /* 
    axis2_om_node_t *detail_node = NULL;
    axis2_om_node_t *my_node = NULL;
    axis2_soap_fault_get_detail(fault_detail, env); 
    if(fault_impl->fdetail)
    {
        my_node = AXIS2_SOAP_FAULT_DETAIL_GET_BASE_NODE(
                            fault_impl->fdetail, env);
        AXIS2_SOAP_FAULT_DETAIL_FREE(fault_impl->fdetail, env);
        fault_impl->fdetail = NULL;
    }
    
    detail_node = AXIS2_SOAP_FAULT_DETAIL_GET_BASE_NODE(
                            detail, env);
    
    axis2_soap_utils_set_new_node(env, 
                    fault_impl->om_ele_node,
                    &my_node, 
                    detail_node);
    */                    
    fault_impl->fdetail = detail;
    return AXIS2_SUCCESS;  


}
                                
axis2_soap_fault_detail_t* AXIS2_CALL 
axis2_soap_fault_get_detail(axis2_soap_fault_t *fault,
                            axis2_env_t **env)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    int status = AXIS2_SUCCESS;
    AXIS2_ENV_CHECK(env, NULL);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    if(fault_impl->fdetail)
    {
        return fault_impl->fdetail;
    } 
    else if(fault_impl->soap_builder)
    {
        while(!(fault_impl->fdetail) && !(AXIS2_OM_NODE_GET_BUILD_STATUS(fault_impl->om_ele_node, env)))
        {
            status = AXIS2_SOAP_BUILDER_NEXT(fault_impl->soap_builder, env);
            if(status == AXIS2_FAILURE)
                break;
        }            
    }
    /*
    axis2_om_node_t *detail_node = NULL;
    axis2_om_node_t *this_node = NULL;
    axis2_soap_fault_detail_t* detail = NULL;
    this_node = fault_impl->om_ele_node;
    
    if(!(fault_impl->fdetail))
    {
        detail_node = axis2_soap_utils_get_child_with_name(env, 
                                            this_node, 
                                            AXIS2_SOAP12_SOAP_FAULT_DETAIL_LOCAL_NAME);
                                                    
        detail = axis2_soap_fault_detail_create(env);
        AXIS2_SOAP_FAULT_DETAIL_SET_BASE_NODE(detail , env, detail_node);
        fault_impl->fdetail = detail;
    }
    */
    return fault_impl->fdetail; 
}   

axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_base_node(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                               axis2_om_node_t *node)
{
   axis2_soap_fault_impl_t *fault_impl = NULL;
   AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
   AXIS2_PARAM_CHECK((*env)->error, node, AXIS2_FAILURE);
   fault_impl = AXIS2_INTF_TO_IMPL(fault);

    if(AXIS2_OM_NODE_GET_NODE_TYPE(node, env) != AXIS2_OM_ELEMENT)
   {
        AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_INVALID_BASE_TYPE, AXIS2_FAILURE);
        return AXIS2_FAILURE;
   }
   fault_impl->om_ele_node = node;
   return AXIS2_SUCCESS;

}
                                        
axis2_om_node_t* AXIS2_CALL 
axis2_soap_fault_get_base_node(axis2_soap_fault_t *fault,
                               axis2_env_t **env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(fault)->om_ele_node;
}  
                                                
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_soap_version(axis2_soap_fault_t *fault,
                                  axis2_env_t **env,
                                  int soap_version)
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, soap_version, AXIS2_FAILURE);
    AXIS2_INTF_TO_IMPL(fault)->soap_version = soap_version;
    return AXIS2_SUCCESS;

}
                                    
int AXIS2_CALL 
axis2_soap_fault_get_soap_version(axis2_soap_fault_t *fault,
                                  axis2_env_t **env)
{
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    return AXIS2_INTF_TO_IMPL(fault)->soap_version;
}
                                  
axis2_char_t * AXIS2_CALL 
axis2_soap_fault_get_exception(axis2_soap_fault_t *fault,
                               axis2_env_t **env)
{
    axis2_soap_fault_detail_t *detail = NULL;
    axis2_om_node_t *detail_node = NULL;
    axis2_om_element_t *detail_ele = NULL;
    axis2_om_node_t *exception_node = NULL;
    axis2_om_element_t *exception_ele = NULL;
    axis2_qname_t *qn = NULL;
    axis2_char_t *excep = NULL;
    
    AXIS2_ENV_CHECK(env, NULL);
    detail = axis2_soap_fault_get_detail(fault, env);
    if(!detail)
        return NULL;
    detail_node = AXIS2_SOAP_FAULT_DETAIL_GET_BASE_NODE(detail, env);
    detail_ele = (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(
                    detail_node, env);
    qn = axis2_qname_create(env,
             AXIS2_SOAP_FAULT_DETAIL_EXCEPTION_ENTRY, NULL, NULL);
    
    exception_ele = AXIS2_OM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(
                        detail_ele, env,
                        qn, detail_node, &exception_node);
    AXIS2_QNAME_FREE(qn, env);                        
    if(exception_ele && 
           (excep = AXIS2_OM_ELEMENT_GET_TEXT(exception_ele, env, exception_node)))
    {
        return excep;
    }
        return NULL;
}
                                        
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_exception(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                               axis2_char_t *exception)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    axis2_soap_fault_detail_t *detail = NULL;
    axis2_om_node_t *fault_detail_entry_node = NULL;
    axis2_om_element_t *fault_detail_ele = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, exception, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    detail = axis2_soap_fault_get_detail(fault, env);
    if(!detail)
    {
        if(fault_impl->soap_version == AXIS2_SOAP11)
            detail = axis2_soap11_fault_detail_create(env, fault);
        if(fault_impl->soap_version == AXIS2_SOAP12)
            detail = axis2_soap12_fault_detail_create(env, fault);
    }
    axis2_soap_fault_set_detail(fault, env, detail);

    fault_detail_ele = axis2_om_element_create(env, NULL, 
                            AXIS2_SOAP_FAULT_DETAIL_EXCEPTION_ENTRY,
                            NULL, &fault_detail_entry_node);

    AXIS2_OM_ELEMENT_SET_TEXT(fault_detail_ele,
         env, exception, fault_detail_entry_node);

    AXIS2_SOAP_FAULT_DETAIL_ADD_DETAIL_ENTRY(detail, env, fault_detail_entry_node);             
    return AXIS2_SUCCESS;
}                                                                                                                                                                                                                                                                                        
                                  
axis2_status_t AXIS2_CALL 
axis2_soap_fault_set_builder(axis2_soap_fault_t *fault,
                               axis2_env_t **env,
                              axis2_soap_builder_t *builder)
{
    axis2_soap_fault_impl_t *fault_impl = NULL;
    AXIS2_PARAM_CHECK((*env)->error, builder, AXIS2_FAILURE);
    fault_impl = AXIS2_INTF_TO_IMPL(fault);
    fault_impl->soap_builder = builder;
    return AXIS2_SUCCESS;
}

AXIS2_DECLARE(axis2_soap_fault_t *)
axis2_soap_fault_create_default_fault(axis2_env_t **env,
                                      struct axis2_soap_body *parent,
                                      axis2_char_t *code_value,
                                      axis2_char_t *reason_text,
                                      int soap_version)
{
    axis2_soap_fault_t *soap_fault = NULL;
    
    axis2_soap_fault_code_t *soap_fault_code = NULL;
    axis2_soap_fault_value_t *soap_fault_value = NULL;
    axis2_soap_fault_reason_t *soap_fault_reason = NULL;
    axis2_soap_fault_text_t *soap_fault_text = NULL;
    axis2_om_node_t *value_node  = NULL;
    axis2_om_element_t *value_ele = NULL;
    
    axis2_om_node_t *text_node = NULL;
    axis2_om_element_t *text_ele = NULL;
    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, code_value, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK((*env)->error, reason_text, AXIS2_FAILURE);

    soap_fault = axis2_soap_fault_create_with_parent(env, parent);
    if(soap_fault)
    {
        AXIS2_SOAP_FAULT_SET_SOAP_VERSION(soap_fault, env, soap_version);
        if(soap_version == AXIS2_SOAP11)
        {
            soap_fault_code = axis2_soap11_fault_code_create_with_parent(env, soap_fault);
            soap_fault_reason = axis2_soap11_fault_reason_create_with_parent(env, soap_fault);
        }
        else if(soap_version == AXIS2_SOAP12)
        {
            soap_fault_code = axis2_soap12_fault_code_create_with_parent(env, soap_fault);
            soap_fault_reason = axis2_soap12_fault_reason_create_with_parent(env, soap_fault);    
        }
        
        soap_fault_value = axis2_soap_fault_value_create_with_code( env,soap_fault_code);
        value_node = AXIS2_SOAP_FAULT_VALUE_GET_BASE_NODE(soap_fault_value, env);
        value_ele  = (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(value_node, env);
        AXIS2_OM_ELEMENT_SET_TEXT(value_ele, env, code_value, value_node);
    
        soap_fault_text = axis2_soap_fault_text_create_with_parent( env, soap_fault_reason);
        text_node = AXIS2_SOAP_FAULT_TEXT_GET_BASE_NODE(soap_fault_text, env);
        text_ele  = (axis2_om_element_t *)AXIS2_OM_NODE_GET_DATA_ELEMENT(text_node, env);
        AXIS2_OM_ELEMENT_SET_TEXT(text_ele, env, reason_text, text_node);
    }
    return soap_fault;
}
