/*
 * 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 <sandesha2_utils.h>
#include <sandesha2_constants.h>
#include <sandesha2_in_order_invoker.h>
#include <sandesha2_transport_sender.h>
#include <sandesha2_seq_property_mgr.h>
#include <sandesha2_error.h>
#include <sandesha2_sender.h>
#include <sandesha2_seq.h>
#include <sandesha2_seq_ack.h>
#include <sandesha2_ack_requested.h>
#include <sandesha2_close_seq.h>
#include <sandesha2_close_seq_res.h>
#include <sandesha2_polling_mgr.h>
#include <sandesha2_permanent_storage_mgr.h>
#include <axutil_string.h>
#include <axis2_conf.h>
#include <axis2_const.h>
#include <axutil_property.h>
#include <axutil_uuid_gen.h>
#include <axiom_soap_body.h>
#include <axis2_options.h>
#include <axis2_msg_ctx.h>
#include <axis2_engine.h>
#include <axis2_transport_out_desc.h>
#include <axis2_transport_in_desc.h>
#include <axutil_qname.h>
#include <axis2_http_transport.h>
#include <axis2_addr.h>
#include <axiom_soap_header.h>
#include <axutil_param.h>
#include <stdlib.h>
#include <sys/timeb.h>


static axutil_array_list_t *
get_sorted_msg_no_list(
        const axutil_env_t *env,
        axis2_char_t *msg_no_str,
        axis2_char_t *delim);

static axutil_array_list_t *
sandesha2_utils_sort(
        const axutil_env_t *env,
        axutil_array_list_t *list);

AXIS2_EXTERN void AXIS2_CALL
sandesha2_util_dummy_prop_free();

AXIS2_EXTERN axis2_msg_ctx_t * AXIS2_CALL
sandesha2_utils_create_out_msg_ctx(
    const axutil_env_t *env,
    axis2_msg_ctx_t *in_msg_ctx);

AXIS2_EXTERN axis2_status_t AXIS2_CALL
sandesha2_utils_remove_soap_body_part(
    const axutil_env_t *env, 
    axiom_soap_envelope_t *envelope, 
    axutil_qname_t *qname)
{
    axiom_soap_body_t *soap_body = NULL;
    axiom_node_t *body_node = NULL;
    axiom_node_t *body_rm_node = NULL;
    axiom_element_t *body_element = NULL;
    axiom_element_t *body_rm_element = NULL;
    
    AXIS2_PARAM_CHECK(env->error, envelope, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, qname, AXIS2_FAILURE);
    
    soap_body = axiom_soap_envelope_get_body(envelope, env);
    if(!soap_body)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
                "[sandesha2] Soap envelope does not have a soap body");
        return AXIS2_FAILURE;
    }

    body_node = axiom_soap_body_get_base_node(soap_body, env);
    if(!body_node)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[sandesha2] Soap body does not have a base node");
        return AXIS2_FAILURE;
    }

    body_element = axiom_node_get_data_element(body_node, env);
    if(!body_element)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
                "[sandesha2] Soap body node does not have a node element");
        return AXIS2_FAILURE;
    }

    body_rm_element = axiom_element_get_first_child_with_qname(body_element, env, qname, body_node, 
            &body_rm_node);

    if(body_rm_element)
    {
        axiom_node_t *temp_node = NULL;

        temp_node = axiom_node_detach(body_rm_node, env);
        if(temp_node)
        {
            axiom_node_free_tree(temp_node, env);
        }
    }

    return AXIS2_SUCCESS;
}

AXIS2_EXTERN long AXIS2_CALL
sandesha2_utils_get_current_time_in_millis(
    const axutil_env_t *env)
{
    /*const long fixed_time = 1153918446;
    long millis = -1;*/
    long seconds = -1;
    struct timeb *tp = AXIS2_MALLOC(env->allocator, sizeof(struct timeb));
    ftime(tp);
    /* To prevent an overflow we substract a contstant from seconds value
     * This value is taken as 18.23.xx seconds on 26 Jul 2006
     *
     */
    seconds = tp->time;
    /*seconds -= fixed_time;
    seconds *= 1000;
    millis = tp->millitm;
    millis = millis + seconds;

    return millis;*/
    if(tp)
        AXIS2_FREE(env->allocator, tp);
    return seconds;
}

AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_get_rm_version(
    const axutil_env_t *env,
    axis2_char_t *key,
    sandesha2_seq_property_mgr_t *seq_prop_mgr)
{
    axis2_char_t *value = NULL;
    sandesha2_seq_property_bean_t *rm_version_bean = NULL;
    
    AXIS2_PARAM_CHECK(env->error, key, NULL);
    
    if(seq_prop_mgr)
    {
        rm_version_bean = sandesha2_seq_property_mgr_retrieve(seq_prop_mgr, 
            env, key, SANDESHA2_SEQ_PROP_RM_SPEC_VERSION);
    }
    if(!rm_version_bean)
    {
        return NULL;
    }
    value = axutil_strdup(env, sandesha2_seq_property_bean_get_value(rm_version_bean, env));
    sandesha2_seq_property_bean_free(rm_version_bean, env);
    return value;
}

AXIS2_EXTERN sandesha2_storage_mgr_t* AXIS2_CALL
sandesha2_utils_get_storage_mgr(
    const axutil_env_t *env,
    axis2_char_t *dbname)
{
    sandesha2_storage_mgr_t *storage_mgr = NULL;
   
    AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, 
        "[sandesha2]Entry:sandesha2_utils_get_storage_mgr");
    
    storage_mgr = sandesha2_utils_get_permanent_storage_mgr(env, dbname);
    AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, 
        "[sandesha2]Exit:sandesha2_utils_get_storage_mgr");
    return storage_mgr;
}
                        
AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_get_seq_property(
    const axutil_env_t *env,
    const axis2_char_t *incoming_seq_id,
    const axis2_char_t *name,
    sandesha2_seq_property_mgr_t *seq_prop_mgr)
{
    axis2_char_t *value = NULL;
    sandesha2_seq_property_bean_t *seq_prop_bean = NULL;
    
    AXIS2_PARAM_CHECK(env->error, incoming_seq_id, NULL);
    AXIS2_PARAM_CHECK(env->error, name, NULL);
    AXIS2_PARAM_CHECK(env->error, seq_prop_mgr, NULL);
    
    seq_prop_bean = sandesha2_seq_property_mgr_retrieve(seq_prop_mgr, env, incoming_seq_id, name);
    if(!seq_prop_bean)
    {
        return NULL;
    }

    value = axutil_strdup(env, sandesha2_seq_property_bean_get_value(seq_prop_bean, env));
    sandesha2_seq_property_bean_free(seq_prop_bean, env);
    return value;
}

AXIS2_EXTERN sandesha2_property_bean_t* AXIS2_CALL
sandesha2_utils_get_property_bean(
    const axutil_env_t *env,
    axis2_conf_t *conf)
{
    axutil_param_t *param = NULL;
    
    AXIS2_PARAM_CHECK(env->error, conf, NULL);
    
    param = axis2_conf_get_param(conf, env, SANDESHA2_SANDESHA_PROPERTY_BEAN);
    if(!param)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[sandesha2]Configuration not set");
        AXIS2_ERROR_SET(env->error, SANDESHA2_ERROR_CONFIGURATION_NOT_SET,
            AXIS2_FAILURE);
        return NULL;
    }
    return (sandesha2_property_bean_t*)axutil_param_get_value(param, env);
    
}

AXIS2_EXTERN axutil_array_list_t* AXIS2_CALL
sandesha2_utils_get_array_list_from_string(
    const axutil_env_t *env,
    axis2_char_t *str)
{
    axis2_char_t *dup_str = NULL;
    axis2_char_t *temp_str = NULL;
    axutil_array_list_t *ret = NULL;
    
    if(!str || 0 == axutil_strcmp("", str))
    {
        return NULL;
    }
    dup_str = axutil_strdup(env, str);
        
    ret = axutil_array_list_create(env, AXIS2_ARRAY_LIST_DEFAULT_CAPACITY);
    temp_str = NULL;
    temp_str = strtok(dup_str, ",");
    while(temp_str)
    {
        if(!sandesha2_utils_array_list_contains(env, ret, temp_str))
        {
            axis2_char_t *temp_element = axutil_strdup(env, temp_str);
            axutil_array_list_add(ret, env, temp_element);
        }
        temp_str = strtok(NULL, ",");
    }
    AXIS2_FREE(env->allocator, dup_str);
    return ret;
}

AXIS2_EXTERN axis2_bool_t AXIS2_CALL
sandesha2_utils_array_list_contains(
    const axutil_env_t *env,
    axutil_array_list_t *list,
    axis2_char_t *str)
{
    int i = 0;
    AXIS2_PARAM_CHECK(env->error, list, AXIS2_FALSE);
    AXIS2_PARAM_CHECK(env->error, str, AXIS2_FALSE);
    
    for(i = 0; i < axutil_array_list_size(list, env); i++)
    {
        axis2_char_t *element = axutil_array_list_get(list, env, i);
        if(element && 0 == axutil_strcmp(element, str))
            return AXIS2_TRUE;
    }
    return AXIS2_FAILURE;
}

AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_array_list_to_string(
        const axutil_env_t *env,
        axutil_array_list_t *list, 
        int type)
{
    axis2_char_t *list_str = NULL;
    int i = 0, size = 0;
    
    AXIS2_PARAM_CHECK(env->error, list, NULL);
    size = axutil_array_list_size(list, env);
    if(size > 0)
    {
        list_str = (axis2_char_t *) AXIS2_MALLOC(env->allocator, 
            size * 64 * sizeof(axis2_char_t));
        if(SANDESHA2_ARRAY_LIST_STRING == type)
        {
            axis2_char_t *element = axutil_array_list_get(list, env, 0);
            sprintf(list_str, "%s", element);
        }
        else if(SANDESHA2_ARRAY_LIST_LONG == type)
        {
            long *element = axutil_array_list_get(list, env, 0);
            sprintf(list_str, "%ld", *element);
        }
    }
    for(i = 1; i < size; i++)
    {
        int len = axutil_strlen(list_str);
        if(SANDESHA2_ARRAY_LIST_STRING == type)
        {
            axis2_char_t *element = axutil_array_list_get(list, env, i);
            sprintf(list_str + len, ",%s", element);
        }
        else if(SANDESHA2_ARRAY_LIST_LONG == type)
        {
            long *element = axutil_array_list_get(list, env, i);
            sprintf(list_str + len, ",%ld", *element);
        } 
    }
    return list_str;

}

AXIS2_EXTERN axis2_status_t AXIS2_CALL                        
sandesha2_utils_start_invoker_for_seq(
    const axutil_env_t *env,
    axis2_conf_ctx_t *conf_ctx,
    axis2_char_t *seq_id)
{
    sandesha2_in_order_invoker_t *invoker = NULL;
    axutil_property_t *property = NULL;
    axis2_status_t status = AXIS2_FAILURE;
    
    AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, seq_id, AXIS2_FAILURE);
    
    property = axis2_ctx_get_property(axis2_conf_ctx_get_base(conf_ctx, env),
        env, SANDESHA2_INVOKER);
    if(property)
        invoker = axutil_property_get_value(property, env);
    if(!invoker)
    {
        invoker = sandesha2_in_order_invoker_create(env);
        property = axutil_property_create_with_args(env, AXIS2_SCOPE_APPLICATION, 
            AXIS2_FALSE, (void *)sandesha2_in_order_invoker_free_void_arg, 
            invoker);
        axis2_ctx_set_property(axis2_conf_ctx_get_base(conf_ctx, env),
            env, SANDESHA2_INVOKER, property);
    }
    status = sandesha2_in_order_invoker_run_for_seq(invoker, env, conf_ctx, 
        seq_id);
    return status;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL                        
sandesha2_utils_start_sender_for_seq(
    const axutil_env_t *env,
    axis2_conf_ctx_t *conf_ctx,
    axis2_char_t *seq_id,
    const axis2_bool_t persistent)
{
    AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, seq_id, AXIS2_FAILURE);
    
    /*return sandesha2_sender_run_for_seq(env, conf_ctx, seq_id, persistent);*/
    return AXIS2_SUCCESS;
}
 
AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_get_internal_sequence_id(
    const axutil_env_t *env,
    axis2_char_t *rmd_sequence_id)
{
    AXIS2_PARAM_CHECK(env->error, rmd_sequence_id, NULL);
    
    return axutil_strcat(env, SANDESHA2_INTERNAL_SEQ_PREFIX, ":", rmd_sequence_id, NULL);
}

AXIS2_EXTERN axis2_transport_out_desc_t* AXIS2_CALL
sandesha2_utils_get_transport_out(const axutil_env_t *env)
{
    axis2_transport_out_desc_t *out_desc = NULL;
    axis2_transport_sender_t *transport_sender = NULL;
    
    transport_sender = sandesha2_transport_sender_create(env);
    out_desc = axis2_transport_out_desc_create(env, AXIS2_TRANSPORT_ENUM_HTTP);
    axis2_transport_out_desc_set_sender(out_desc, env, transport_sender);
    return out_desc;
}

AXIS2_EXTERN sandesha2_storage_mgr_t* AXIS2_CALL
sandesha2_utils_get_permanent_storage_mgr(
    const axutil_env_t *env,
    axis2_char_t *dbname)
{
    sandesha2_storage_mgr_t *storage_mgr = NULL;
    
    storage_mgr = sandesha2_permanent_storage_mgr_create(env, dbname);
    return storage_mgr;
}

AXIS2_EXTERN axis2_char_t* AXIS2_CALL                       
sandesha2_utils_get_rmd_seq_id(
        const axutil_env_t *env,
        axis2_char_t *internal_sequence_id)
{
    axis2_char_t *start_str = NULL;
    axis2_char_t *ret = NULL;
    int start_len = 0;
    
    AXIS2_PARAM_CHECK(env->error, internal_sequence_id, NULL);
    
    start_str = axutil_strcat(env, SANDESHA2_INTERNAL_SEQ_PREFIX, ":", NULL);
    start_len = axutil_strlen(start_str);
    if(0 != axutil_strncmp(internal_sequence_id, start_str, start_len))
        return NULL;
    ret = axutil_strdup(env, (internal_sequence_id + start_len * sizeof(axis2_char_t)));
    
    return ret;    
}


AXIS2_EXTERN sandesha2_property_bean_t* AXIS2_CALL
sandesha2_utils_get_property_bean_from_op(
    const axutil_env_t *env,
    axis2_op_t *op)
{
        axutil_param_t *param = NULL;
    
    AXIS2_PARAM_CHECK(env->error, op, NULL);
    
    param = axis2_op_get_param(op, env, SANDESHA2_SANDESHA_PROPERTY_BEAN);
    if(!param)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
            "[sandesha2]Configuration not set.");
        AXIS2_ERROR_SET(env->error, SANDESHA2_ERROR_CONFIGURATION_NOT_SET,
            AXIS2_FAILURE);
        return NULL;
    }
    return (sandesha2_property_bean_t*)axutil_param_get_value(param, env);

}

AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_get_client_internal_sequence_id(
    const axutil_env_t *env,
    axis2_char_t *to,
    axis2_char_t *seq_key)
{
    axis2_char_t *ret = NULL;

    if(!to && !seq_key)
    {
        return NULL;
    }
    else if(!to)
    {
        return axutil_strdup(env, seq_key);
    }
    else if(!seq_key)
    {
        return axutil_strdup(env, to);
    }
    else
    {
        ret = axutil_strcat(env, SANDESHA2_INTERNAL_SEQ_PREFIX, ":", to, ":", 
            seq_key, NULL);
        return ret;
    }
    return NULL;
}

AXIS2_EXTERN axis2_msg_ctx_t *AXIS2_CALL
sandesha2_utils_create_new_related_msg_ctx(
    const axutil_env_t *env,
    sandesha2_msg_ctx_t *ref_rm_msg)
{
    axis2_msg_ctx_t *ref_msg = NULL;
    axis2_msg_ctx_t *new_msg = NULL;
    axis2_conf_ctx_t *conf_ctx = NULL;
    axis2_conf_t *conf = NULL;
    axis2_transport_out_desc_t *out_desc = NULL;
    axis2_transport_in_desc_t *in_desc = NULL;
    axis2_op_ctx_t *op_ctx = NULL;
    axiom_soap_envelope_t *soap_env = NULL;
    axutil_property_t *property = NULL;
    axis2_char_t *addr_ver = NULL;
    axis2_char_t *paused_phase_name = NULL;
    axis2_svc_grp_t *svc_grp = NULL;
    axutil_stream_t *out_stream = NULL;
    axis2_char_t *transport_to = NULL;
    
    AXIS2_PARAM_CHECK(env->error, ref_rm_msg, NULL);
    
    ref_msg = sandesha2_msg_ctx_get_msg_ctx(ref_rm_msg, env);
    conf_ctx = axis2_msg_ctx_get_conf_ctx(ref_msg, env);
    conf = axis2_conf_ctx_get_conf(conf_ctx, env);
    
    out_desc = axis2_msg_ctx_get_transport_out_desc(ref_msg, env);
    in_desc = axis2_msg_ctx_get_transport_in_desc(ref_msg, env);
    
    new_msg = axis2_msg_ctx_create(env, conf_ctx, in_desc, out_desc);
    svc_grp = axis2_msg_ctx_get_svc_grp(ref_msg, env); 
    if(svc_grp)
    {
        axis2_msg_ctx_set_svc_grp(new_msg, env, svc_grp);
    }

    if(axis2_msg_ctx_get_svc(ref_msg, env))
    {
        axis2_msg_ctx_set_svc(new_msg, env, axis2_msg_ctx_get_svc(ref_msg, env));
    }

    op_ctx = axis2_msg_ctx_get_op_ctx(ref_msg, env);
    /*axis2_op_ctx_increment_ref(op_ctx, env);*/
    axis2_msg_ctx_set_op_ctx(new_msg, env, op_ctx);
    axis2_msg_ctx_set_svc_ctx(new_msg, env, axis2_msg_ctx_get_svc_ctx(ref_msg, env));
    axis2_msg_ctx_set_svc_grp_ctx(new_msg, env, axis2_msg_ctx_get_svc_grp_ctx(ref_msg, env));

    soap_env = axiom_soap_envelope_create_default_soap_envelope(env, 
            sandesha2_utils_get_soap_version(env, axis2_msg_ctx_get_soap_envelope(ref_msg, env)));

    axis2_msg_ctx_set_soap_envelope(new_msg, env, soap_env);
    
    transport_to = axis2_msg_ctx_get_transport_url(ref_msg, env);
    if(transport_to)
    {
        axis2_msg_ctx_set_transport_url(new_msg, env, transport_to);
    }

    property = axis2_msg_ctx_get_property(ref_msg, env, AXIS2_WSA_VERSION);
    if(!property)
    {
        axis2_msg_ctx_t *req_msg = NULL;
        axis2_op_ctx_t *temp_op_ctx = NULL;
        
        temp_op_ctx = axis2_msg_ctx_get_op_ctx(ref_msg, env);
        if(temp_op_ctx)
        {
            req_msg =  axis2_op_ctx_get_msg_ctx(temp_op_ctx, env, AXIS2_WSDL_MESSAGE_LABEL_IN);
        }

        if(req_msg)
        {
            property = axis2_msg_ctx_get_property(req_msg, env, AXIS2_WSA_VERSION);
            if(property)
            {
                addr_ver = axutil_strdup(env, axutil_property_get_value(property, env));
            }
        }
    }
    else
    {
        addr_ver = axutil_strdup(env, axutil_property_get_value(property, env));
    }

    property = axutil_property_create_with_args(env, 0, AXIS2_TRUE, 0, addr_ver);
    axis2_msg_ctx_set_property(new_msg, env, AXIS2_WSA_VERSION, property);
    
    out_stream = axis2_msg_ctx_get_transport_out_stream(ref_msg, env);
    axis2_msg_ctx_set_transport_out_stream(new_msg, env, out_stream);
    property = axis2_msg_ctx_get_property(ref_msg, env, AXIS2_TRANSPORT_IN);
    if(property)
    {
        axis2_msg_ctx_set_property(new_msg, env, AXIS2_TRANSPORT_IN, sandesha2_util_property_clone(
                    env, property));
    }

    axis2_msg_ctx_set_out_transport_info(new_msg, env, axis2_msg_ctx_get_out_transport_info(ref_msg, 
                env));

    axis2_msg_ctx_set_charset_encoding(new_msg, env, axis2_msg_ctx_get_charset_encoding(ref_msg, 
                env));

    property = axis2_msg_ctx_get_property(ref_msg, env, AXIS2_TRANSPORT_HEADERS);
    if(property)
    {
        axis2_msg_ctx_set_property(new_msg, env, AXIS2_TRANSPORT_HEADERS, sandesha2_util_property_clone(
                    env, property));
    }

    paused_phase_name = (axis2_char_t*)axis2_msg_ctx_get_paused_phase_name(ref_msg, env);

    axis2_msg_ctx_set_paused_phase_name(new_msg, env, paused_phase_name);

    return new_msg;
}

AXIS2_EXTERN  int AXIS2_CALL
sandesha2_utils_get_soap_version(
    const axutil_env_t *env, 
    axiom_soap_envelope_t *envelope)
{
    AXIS2_PARAM_CHECK(env->error, envelope, -1);
    
    return axiom_soap_envelope_get_soap_version(envelope, env);
}

AXIS2_EXTERN axis2_char_t* AXIS2_CALL
sandesha2_utils_trim_string(
    const axutil_env_t *env, 
    axis2_char_t *orig_str)
{
    axis2_char_t *tmp = NULL;
    axis2_char_t *tmp2 = NULL;
    axis2_char_t *ret = NULL;
    int len = 0;
    
    AXIS2_PARAM_CHECK(env->error, orig_str, NULL);
    
    tmp = orig_str;
    while(' ' == *tmp)
        tmp++;
        
    tmp2 = orig_str + axutil_strlen(orig_str);
    while(' ' == *tmp2 && tmp2 != orig_str)
        tmp2--;
        
    len = tmp2 - tmp;
    if(len > 0)
        ret = AXIS2_MALLOC(env->allocator, len + sizeof(axis2_char_t));
        
    memcpy(ret, tmp, len);
    ret[len] = '\0';
    return ret;
}

AXIS2_EXTERN axis2_bool_t AXIS2_CALL                        
sandesha2_utils_is_retrievable_on_faults(
    const axutil_env_t *env,
    axis2_msg_ctx_t *msg_ctx)
{
    axis2_bool_t ret = AXIS2_FALSE;
    axis2_char_t *action = NULL;
    
    AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FALSE);
    
    action =  (axis2_char_t*)axis2_msg_ctx_get_wsa_action(msg_ctx, env);
    if(!action)
        return AXIS2_FALSE;
        
    if(0 == axutil_strcmp(action, SANDESHA2_SPEC_2005_02_ACTION_CREATE_SEQ))
        ret = AXIS2_TRUE;
    else if(0 == axutil_strcmp(action, SANDESHA2_SPEC_2007_02_ACTION_CREATE_SEQ))
        ret = AXIS2_TRUE;
        
    return ret;
}

AXIS2_EXTERN axis2_bool_t AXIS2_CALL
sandesha2_utils_is_rm_global_msg(
    const axutil_env_t *env,
    axis2_msg_ctx_t *msg_ctx)
{
    axis2_bool_t is_global_msg = AXIS2_FALSE;
    axis2_char_t *action = NULL;
    axiom_soap_envelope_t *soap_env = NULL;
    axiom_soap_header_t *soap_header = NULL;
    axiom_element_t *header_element = NULL;
    axiom_node_t *header_node = NULL;
    axiom_element_t *seq_element = NULL;
    axiom_node_t *seq_node = NULL;
    axutil_qname_t *qname = NULL;
    
    AXIS2_PARAM_CHECK(env->error, msg_ctx, AXIS2_FALSE);
    
    action = (axis2_char_t*)axis2_msg_ctx_get_wsa_action(msg_ctx, env);
    soap_env = axis2_msg_ctx_get_soap_envelope(msg_ctx, env);
    
    if(!soap_env)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[sandesha2] SOAP envelope is"
            " NULL");
        return AXIS2_FALSE;
    }
    soap_header = axiom_soap_envelope_get_header(soap_env, env);
    
    if(soap_header)
    {
        header_node = axiom_soap_header_get_base_node(soap_header, env);
        header_element = axiom_node_get_data_element(header_node, env);
    
        qname = axutil_qname_create(env, SANDESHA2_WSRM_COMMON_SEQ,
                        SANDESHA2_SPEC_2005_02_NS_URI, NULL);
        seq_element = axiom_element_get_first_child_with_qname(header_element, 
                        env, qname, header_node, &seq_node);
        if(qname)
            axutil_qname_free(qname, env);
        if(!seq_element)
        {
            qname = axutil_qname_create(env, SANDESHA2_WSRM_COMMON_SEQ,
                        SANDESHA2_SPEC_2007_02_NS_URI, NULL);
            seq_element = axiom_element_get_first_child_with_qname(
                        header_element, env, qname, header_node, &seq_node);
            if(qname)
                axutil_qname_free(qname, env);
        }
    }
    if(seq_element)
        is_global_msg = AXIS2_TRUE;
        
    if(0 == axutil_strcmp(action, 
                        SANDESHA2_SPEC_2005_02_ACTION_SEQ_ACKNOWLEDGEMENT))
        is_global_msg = AXIS2_TRUE;
        
    if(0 == axutil_strcmp(action, 
                        SANDESHA2_SPEC_2005_02_ACTION_CREATE_SEQ_RESPONSE))
        is_global_msg = AXIS2_TRUE;
        
    if(0 == axutil_strcmp(action, SANDESHA2_SPEC_2005_02_ACTION_TERMINATE_SEQ))
        is_global_msg = AXIS2_TRUE;    
        
    if(0 == axutil_strcmp(action, 
                        SANDESHA2_SPEC_2007_02_ACTION_SEQ_ACKNOWLEDGEMENT))
        is_global_msg = AXIS2_TRUE;
        
    if(0 == axutil_strcmp(action, 
                        SANDESHA2_SPEC_2007_02_ACTION_CREATE_SEQ_RESPONSE))
        is_global_msg = AXIS2_TRUE;
        
    if(0 == axutil_strcmp(action, SANDESHA2_SPEC_2007_02_ACTION_TERMINATE_SEQ))
        is_global_msg = AXIS2_TRUE;    
    
    return is_global_msg;
}

AXIS2_EXTERN axis2_char_t *AXIS2_CALL
sandesha2_utils_get_seq_id_from_rm_msg_ctx(
    const axutil_env_t *env, 
    sandesha2_msg_ctx_t *rm_msg_ctx)
{
    int msg_type = -1;
    axis2_char_t *seq_id = NULL;
    
    AXIS2_PARAM_CHECK(env->error, rm_msg_ctx, NULL);
    
    msg_type = sandesha2_msg_ctx_get_msg_type(rm_msg_ctx, env);
    
    if(SANDESHA2_MSG_TYPE_APPLICATION == msg_type)
    {
        sandesha2_seq_t *seq = NULL;
        seq = sandesha2_msg_ctx_get_sequence(rm_msg_ctx, env);
        seq_id = sandesha2_identifier_get_identifier(
                        sandesha2_seq_get_identifier(seq, env), env);
    }
    else if(SANDESHA2_MSG_TYPE_ACK == msg_type)
    {
        sandesha2_seq_ack_t *seq_ack = NULL;
        seq_ack = sandesha2_msg_ctx_get_seq_ack(rm_msg_ctx, env);
        seq_id = sandesha2_identifier_get_identifier(
                        sandesha2_seq_ack_get_identifier(seq_ack, env), env);
    }
    else if(SANDESHA2_MSG_TYPE_ACK_REQUEST == msg_type)
    {
        sandesha2_ack_requested_t *ack_requested = NULL;
        ack_requested = sandesha2_msg_ctx_get_ack_requested(rm_msg_ctx, env);
        seq_id = sandesha2_identifier_get_identifier(
                        sandesha2_ack_requested_get_identifier(ack_requested, 
                        env), env);
    }
    else if(SANDESHA2_MSG_TYPE_CLOSE_SEQ == msg_type)
    {
        sandesha2_close_seq_t *close_seq = NULL;
        close_seq = sandesha2_msg_ctx_get_close_seq(rm_msg_ctx, env);
        seq_id = sandesha2_identifier_get_identifier(
                        sandesha2_close_seq_get_identifier(close_seq, 
                        env), env);
    }
    else if(SANDESHA2_MSG_TYPE_CLOSE_SEQ_RESPONSE == msg_type)
    {
        sandesha2_close_seq_res_t *close_seq_res = NULL;
        close_seq_res = sandesha2_msg_ctx_get_close_seq_res(rm_msg_ctx, env);
        seq_id = sandesha2_identifier_get_identifier(
                        sandesha2_close_seq_res_get_identifier(close_seq_res, 
                        env), env);
    }
    return seq_id;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
sandesha2_utils_stop_invoker(
    const axutil_env_t *env,
    axis2_conf_ctx_t *conf_ctx)
{
    AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE);
    
    /*TODO */
    return AXIS2_SUCCESS;
}

AXIS2_EXTERN axis2_status_t AXIS2_CALL
sandesha2_utils_stop_sender(
    const axutil_env_t *env,
    axis2_conf_ctx_t *conf_ctx)
{
    AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE);
    
    /*TODO */
    return AXIS2_SUCCESS;
}
 
/**
 * Used to convert a message number list (a comma seperated list of message
 * numbers) into a set of Acknowledgement Ranges. This breaks the list, sort
 * the items and group them to create the ack_range objects.
 * 
 * @param msg_no_str
 * @return
 */
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
sandesha2_utils_get_ack_range_list(
    const axutil_env_t *env,
    axis2_char_t *msg_no_str,
    axis2_char_t *rm_ns_value)
{
    axutil_array_list_t *ack_ranges = NULL;
    axutil_array_list_t *sorted_msg_no_list = NULL;
    int i = 0, size = 0;
    long lower = 0;
    long upper = 0;
    axis2_bool_t completed = AXIS2_TRUE;

    ack_ranges = axutil_array_list_create(env, 0);
    sorted_msg_no_list = get_sorted_msg_no_list(env, msg_no_str, ",");
    if(sorted_msg_no_list)
        size = axutil_array_list_size(sorted_msg_no_list, env);
    for(i = 0; i < size; i++)
    {
        long *temp = axutil_array_list_get(sorted_msg_no_list, env, i);
        if(lower == 0)
        {
            lower = *temp;
            upper = *temp;
            completed = AXIS2_FALSE;
        }
        else if(*temp == (upper + 1))
        {
            upper = *temp;
            completed = AXIS2_FALSE;
        }
        else
        {
             sandesha2_ack_range_t *ack_range = NULL;
             
             ack_range = sandesha2_ack_range_create(env, rm_ns_value, NULL);
             sandesha2_ack_range_set_lower_value(ack_range, env, lower);
             sandesha2_ack_range_set_upper_value(ack_range, env, upper);
             axutil_array_list_add(ack_ranges, env, ack_range);
             lower = *temp;
             upper = *temp;
             completed = AXIS2_FALSE;
        }
        if(temp)
        {
            AXIS2_FREE(env->allocator, temp);
        }
    }
    if(!completed)
    {
         sandesha2_ack_range_t *ack_range = NULL;
         
         ack_range = sandesha2_ack_range_create(env, rm_ns_value, NULL);
         sandesha2_ack_range_set_lower_value(ack_range, env, lower);
         sandesha2_ack_range_set_upper_value(ack_range, env, upper);
         axutil_array_list_add(ack_ranges, env, ack_range);
         completed = AXIS2_TRUE;
    }
    if(sorted_msg_no_list)
    {
        axutil_array_list_free(sorted_msg_no_list, env);
    }
    return ack_ranges;
}

static axutil_array_list_t *
get_sorted_msg_no_list(
    const axutil_env_t *env,
    axis2_char_t *msg_no_str,
    axis2_char_t *delim)
{
    axutil_array_list_t *msg_numbers = NULL;
    axutil_array_list_t *sorted_msg_no_list = NULL;
    axis2_char_t *dup_str = NULL;
    axis2_char_t *temp_str = NULL;

    dup_str = axutil_strdup(env, msg_no_str);
    msg_numbers = axutil_array_list_create(env, 0);
    temp_str = strtok(dup_str, delim);
    while(temp_str)
    {
        long *long_val = AXIS2_MALLOC(env->allocator, sizeof(long));

        *long_val = atol(temp_str);
        axutil_array_list_add(msg_numbers, env, long_val);
        temp_str = strtok(NULL, delim);
    }
    sorted_msg_no_list = sandesha2_utils_sort(env, msg_numbers);
    if(msg_numbers)
    {
        int i = 0;
        int size = 0;

        size = axutil_array_list_size(msg_numbers, env);
        for(i = 0; i < size; i++)
        {
            long *temp_long = NULL;

            temp_long = (long *) axutil_array_list_get(msg_numbers, env, i);
            AXIS2_FREE(env->allocator, temp_long);
        }
        axutil_array_list_free(msg_numbers, env);
    }
    AXIS2_FREE(env->allocator, dup_str);
    return sorted_msg_no_list;
}

static axutil_array_list_t *
sandesha2_utils_sort(
    const axutil_env_t *env,
    axutil_array_list_t *list)
{
    axutil_array_list_t *sorted_list = NULL;
    long max = 0;
    int i = 0, size = 0;
    long j = 0;
    
    sorted_list = axutil_array_list_create(env, 0);
    if(list)
    {
        size = axutil_array_list_size(list, env);
    }

    for(i = 0; i < size; i++)
    {
        long *temp_long = NULL;

        temp_long = (long *) axutil_array_list_get(list, env, i);
        if(*temp_long > max)
        {
            max = *temp_long;
        }
    }

    for(j = 1; j <= max; j++)
    {
        long *temp = AXIS2_MALLOC(env->allocator, sizeof(long));
        axis2_bool_t contains = AXIS2_FALSE;
        
        *temp = j;
        for(i = 0; i < size; i++)
        {
            long *value = NULL;
            value = axutil_array_list_get(list, env, i);
            if(*value == *temp)
            {
                contains = AXIS2_TRUE;
                break;
            }
        }

        if(contains)
        {
            axutil_array_list_add(sorted_list, env, temp);
        }
    }
    return sorted_list;    
}

axis2_bool_t AXIS2_CALL
sandesha2_utils_is_all_msgs_acked_upto(
    const axutil_env_t *env,
    long highest_in_msg_no,
    axis2_char_t *internal_seq_id,
    sandesha2_seq_property_mgr_t *seq_prop_mgr)
{
    axis2_char_t *client_completed_msgs = NULL;
    axutil_array_list_t *acked_msgs_list = NULL;
    long smallest_msg_no = 1;
    long temp_msg_no = 0;
    axis2_bool_t ret = AXIS2_TRUE;

    client_completed_msgs = sandesha2_utils_get_seq_property(env, internal_seq_id, 
            SANDESHA2_SEQ_PROP_CLIENT_COMPLETED_MESSAGES, seq_prop_mgr);

    if(client_completed_msgs)
    {
        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[sandesha2] Client_completed_msgs:%s", 
            client_completed_msgs);

        acked_msgs_list = sandesha2_utils_get_array_list_from_string(env, client_completed_msgs);
        AXIS2_FREE(env->allocator, client_completed_msgs);
    }

    if(!acked_msgs_list)
    {
        return AXIS2_FALSE;
    }

    for(temp_msg_no = smallest_msg_no; temp_msg_no <= highest_in_msg_no; temp_msg_no++)
    {
        axis2_char_t str_msg_no[32];

        sprintf(str_msg_no, "%ld", temp_msg_no);
        if(!sandesha2_utils_array_list_contains(env, acked_msgs_list, str_msg_no))
        {
            ret = AXIS2_FALSE;
            break;
        }
    }
    
    axutil_array_list_free(acked_msgs_list, env);

    return ret; /* All messages upto the highest have been acked */
}

axis2_status_t AXIS2_CALL
sandesha2_utils_execute_and_store(
    const axutil_env_t *env,
    sandesha2_msg_ctx_t *rm_msg_ctx,
    axis2_char_t *storage_key)
{
    axis2_msg_ctx_t *msg_ctx = NULL;
    axis2_conf_ctx_t *conf_ctx = NULL;
    axis2_transport_out_desc_t *transport_out = NULL;
    axis2_transport_out_desc_t *sandesha2_transport_out = NULL;
    axutil_property_t *property = NULL;
    axis2_engine_t *engine = NULL;
    axis2_status_t status = AXIS2_FAILURE;

    msg_ctx = sandesha2_msg_ctx_get_msg_ctx(rm_msg_ctx, env);
    if(msg_ctx)
    {
        conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
    }

    sandesha2_msg_ctx_set_msg_type(rm_msg_ctx, env, SANDESHA2_MSG_TYPE_CREATE_SEQ);
    /* Message will be stored in the sandesha2_transport_sender */
    property = axutil_property_create_with_args(env, AXIS2_SCOPE_REQUEST, AXIS2_TRUE, 0, storage_key);
    axis2_msg_ctx_set_property(msg_ctx, env, SANDESHA2_MESSAGE_STORE_KEY, property);
    
    transport_out = axis2_msg_ctx_get_transport_out_desc(msg_ctx, env);
    property = axutil_property_create_with_args(env, 3, 0, 
        axis2_transport_out_desc_free_void_arg, transport_out);
    axis2_msg_ctx_set_property(msg_ctx, env, SANDESHA2_ORIGINAL_TRANSPORT_OUT_DESC, property);
    
    /*property = axutil_property_create_with_args(env, 0, 0, 0, AXIS2_VALUE_TRUE);
    axis2_msg_ctx_set_property(msg_ctx, env, SANDESHA2_SET_SEND_TO_TRUE, property);*/
    sandesha2_transport_out = sandesha2_utils_get_transport_out(env);
    axis2_msg_ctx_set_transport_out_desc(msg_ctx, env, sandesha2_transport_out);
    /*Sending the message once through the sandesha2_transport_sender */
    engine = axis2_engine_create(env, conf_ctx);
    if(axis2_msg_ctx_is_paused(msg_ctx, env))
    {
        axis2_msg_ctx_set_current_handler_index(msg_ctx, env, 
            axis2_msg_ctx_get_current_handler_index(msg_ctx, env) + 1);
        status = axis2_engine_resume_send(engine, env, msg_ctx);
    }
    else
    {
        status = axis2_engine_send(engine, env, msg_ctx);
    }

    if(engine)
    {
        axis2_engine_free(engine, env);
    }

    return status;
}

axis2_bool_t AXIS2_CALL
sandesha2_utils_is_wsrm_anon_reply_to(
    const axutil_env_t *env,
    const axis2_char_t *reply_to)
{
    if (reply_to && axutil_strstr(reply_to, "anonymous"))
        return AXIS2_TRUE;
    if (reply_to && axutil_strstr(reply_to, AXIS2_WS_RM_ANONYMOUS_URL))
        return AXIS2_TRUE;
    else
        return AXIS2_FALSE;
}

axis2_bool_t AXIS2_CALL
sandesha2_utils_is_anon_uri(
    const axutil_env_t *env,
    const axis2_char_t *address)
{
    axis2_bool_t ret = AXIS2_FALSE;

    axis2_char_t *address_l = NULL;
    if(!address)
    {
        return AXIS2_TRUE;
    }

    address_l = axutil_strtrim(env, address, NULL);

    if(!axutil_strcmp(AXIS2_WSA_ANONYMOUS_URL, address_l))
    {
        ret = AXIS2_TRUE;
    }

    if(!axutil_strcmp(AXIS2_WSA_ANONYMOUS_URL_SUBMISSION, address_l))
    {
        ret = AXIS2_TRUE;
    }
    else if (sandesha2_utils_is_wsrm_anon_reply_to(env, (axis2_char_t *) address))
    {
        ret = AXIS2_TRUE;
    }

    AXIS2_FREE(env->allocator, address_l);

    return ret;
}

axutil_array_list_t *AXIS2_CALL
sandesha2_utils_split(
    const axutil_env_t *env,
    axis2_char_t *str,
    axis2_char_t *pattern)
{
    axutil_array_list_t *list = axutil_array_list_create(env, 0);
    axis2_char_t *ptr = NULL;
    axis2_char_t *value = NULL;
    ptr = axutil_strstr(str, pattern);

    while(ptr)
    {
        ptr[0] = AXIS2_EOLN;
        /*value = axutil_strdup(env, str);*/
        value = str;
        if(value && axutil_strcmp(value, ""))
        {
            axutil_array_list_add(list, env, value);
        }

        str = ptr + 3;
        ptr = axutil_strstr(str, pattern);
    }

    /*value = axutil_strdup(env, str);*/
    value = str;
    if(value && axutil_strcmp(value, ""))
    {
        axutil_array_list_add(list, env, value);
    }

    return list;
}

axis2_bool_t AXIS2_CALL
sandesha2_utils_is_rm_1_0_anonymous_acks_to(
    const axutil_env_t *env,
    const axis2_char_t *rm_version,
    const axis2_char_t *acks_to_addr)
{
    if(sandesha2_utils_is_anon_uri(env, acks_to_addr) &&
        (!axutil_strcmp(SANDESHA2_SPEC_VERSION_1_0, rm_version)))
    {
        return AXIS2_TRUE;
    }

    else return AXIS2_FALSE;
}

AXIS2_EXTERN axis2_msg_ctx_t * AXIS2_CALL
sandesha2_utils_create_out_msg_ctx(
    const axutil_env_t *env,
    axis2_msg_ctx_t *in_msg_ctx)
{
    axis2_ctx_t *ctx = NULL;
    axis2_msg_ctx_t *new_msg_ctx = NULL;
    axis2_conf_ctx_t *conf_ctx = NULL;
    axis2_transport_in_desc_t *transport_in = NULL;
    axis2_transport_out_desc_t *transport_out = NULL;
    axis2_msg_info_headers_t *old_msg_info_headers = NULL;
    axis2_msg_info_headers_t *msg_info_headers = NULL;
    axis2_endpoint_ref_t *reply_to = NULL;
    axis2_endpoint_ref_t *fault_to = NULL;
    axis2_endpoint_ref_t *to = NULL;
    const axis2_char_t *msg_id = NULL;
    axis2_relates_to_t *relates_to = NULL;
    const axis2_char_t *action = NULL;
    axis2_op_ctx_t *op_ctx = NULL;
    axis2_svc_ctx_t *svc_ctx = NULL;
    axis2_bool_t doing_rest = AXIS2_FALSE;
    axis2_bool_t doing_mtom = AXIS2_FALSE;
    axis2_bool_t server_side = AXIS2_FALSE;
    axis2_svc_grp_ctx_t *svc_grp_ctx = NULL;
    axis2_char_t *msg_uuid = NULL;
    axutil_stream_t *out_stream = NULL;

    AXIS2_PARAM_CHECK(env->error, in_msg_ctx, NULL);

    conf_ctx =  axis2_msg_ctx_get_conf_ctx(in_msg_ctx, env);
    transport_in =  axis2_msg_ctx_get_transport_in_desc(in_msg_ctx, env);
    transport_out =  axis2_msg_ctx_get_transport_out_desc(in_msg_ctx, env);

    new_msg_ctx = axis2_msg_ctx_create(env, conf_ctx, transport_in, transport_out);
    if (!new_msg_ctx)
    {
        return NULL;
    }
    old_msg_info_headers =  axis2_msg_ctx_get_msg_info_headers(in_msg_ctx, env);
    if (!old_msg_info_headers)
    {
        return NULL;
    }
    msg_info_headers =  axis2_msg_ctx_get_msg_info_headers(new_msg_ctx, env);
    if (!msg_info_headers)
    {
        /* if there is no msg info header in ew msg ctx, then create one */
        msg_info_headers = axis2_msg_info_headers_create(env, NULL, NULL);
        if (!msg_info_headers)
            return NULL;
         axis2_msg_ctx_set_msg_info_headers(new_msg_ctx, env, msg_info_headers);
    }

    msg_uuid =  axutil_uuid_gen(env);
    axis2_msg_info_headers_set_message_id(msg_info_headers, env, msg_uuid);
    if (msg_uuid)
    {
        AXIS2_FREE(env->allocator, msg_uuid);
        msg_uuid = NULL;
    }

    reply_to = axis2_msg_info_headers_get_reply_to(old_msg_info_headers, env);
    axis2_msg_info_headers_set_to(msg_info_headers, env, reply_to);

    fault_to = axis2_msg_info_headers_get_fault_to(old_msg_info_headers, env);
    axis2_msg_info_headers_set_fault_to(msg_info_headers, env, sandesha2_util_endpoint_ref_clone(
                env, fault_to));

    to = axis2_msg_info_headers_get_to(old_msg_info_headers, env);
    axis2_msg_info_headers_set_from(msg_info_headers, env, to);

    msg_id = axis2_msg_info_headers_get_message_id(old_msg_info_headers, env);
    relates_to = axis2_relates_to_create(env, msg_id,
            AXIS2_WSA_RELATES_TO_RELATIONSHIP_TYPE_DEFAULT_VALUE);
    axis2_msg_info_headers_set_relates_to(msg_info_headers, env, relates_to);

    action = axis2_msg_info_headers_get_action(old_msg_info_headers, env);
    axis2_msg_info_headers_set_action(msg_info_headers, env, action);

    op_ctx =  axis2_msg_ctx_get_op_ctx(in_msg_ctx, env);
    axis2_msg_ctx_set_op_ctx(new_msg_ctx, env, op_ctx);

    svc_ctx =  axis2_msg_ctx_get_svc_ctx(in_msg_ctx, env);
     axis2_msg_ctx_set_svc_ctx(new_msg_ctx, env, svc_ctx);

    ctx = axis2_msg_ctx_get_base(in_msg_ctx, env);
    if (ctx)
    {
        axis2_ctx_t *new_ctx = axis2_msg_ctx_get_base(new_msg_ctx, env);
        if (new_ctx)
        {
            axis2_ctx_set_property_map(new_ctx, env, axis2_ctx_get_property_map(ctx, env));
        }
    }

    out_stream = axis2_msg_ctx_get_transport_out_stream(in_msg_ctx, env);
    axis2_msg_ctx_set_transport_out_stream(new_msg_ctx, env, out_stream);
    axis2_msg_ctx_set_out_transport_info(new_msg_ctx, env,
        axis2_msg_ctx_get_out_transport_info(in_msg_ctx, env));

    /* Setting the charater set encoding */
    doing_rest =  axis2_msg_ctx_get_doing_rest(in_msg_ctx, env);
    axis2_msg_ctx_set_doing_rest(new_msg_ctx, env, doing_rest);

    doing_mtom =  axis2_msg_ctx_get_doing_mtom(in_msg_ctx, env);
    axis2_msg_ctx_set_doing_mtom(new_msg_ctx, env, doing_mtom);

    server_side =  axis2_msg_ctx_get_server_side(in_msg_ctx, env);
    axis2_msg_ctx_set_server_side(new_msg_ctx, env, server_side);

    svc_grp_ctx =  axis2_msg_ctx_get_svc_grp_ctx(in_msg_ctx, env);
    axis2_msg_ctx_set_svc_grp_ctx(new_msg_ctx, env, svc_grp_ctx);

     axis2_msg_ctx_set_is_soap_11(new_msg_ctx, env,
             axis2_msg_ctx_get_is_soap_11(in_msg_ctx, env));
     /*axis2_msg_ctx_set_keep_alive(new_msg_ctx, env,
             axis2_msg_ctx_is_keep_alive(in_msg_ctx, env));*/

    axis2_msg_ctx_set_charset_encoding(new_msg_ctx, env,
        axis2_msg_ctx_get_charset_encoding(in_msg_ctx, env));
    return new_msg_ctx;
}

AXIS2_EXTERN void AXIS2_CALL
sandesha2_util_dummy_prop_free()
{
    return;
}

AXIS2_EXTERN axis2_char_t *AXIS2_CALL
sandesha2_util_get_dbname(
    const axutil_env_t *env,
    axis2_conf_ctx_t *conf_ctx)
{
    axis2_conf_t *conf = NULL;
    axis2_module_desc_t *module_desc = NULL;
    axutil_qname_t *qname = NULL;
    axis2_char_t *dbname = "./sandesha2_db";
    if(conf_ctx)
        conf = axis2_conf_ctx_get_conf((const axis2_conf_ctx_t *) conf_ctx, env);
    else
    {
        return NULL;
    }
    qname = axutil_qname_create(env, SANDESHA2_MODULE, NULL, NULL);
    module_desc = axis2_conf_get_module(conf, env, qname);
    if(module_desc)
    {
        axutil_param_t *dbparam = NULL;
        dbparam = axis2_module_desc_get_param(module_desc, env, SANDESHA2_DB);
        if(dbparam)
        {
            dbname = axutil_param_get_value(dbparam, env);
        }
    }
    if(qname)
        axutil_qname_free(qname, env);
    /*AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "dbname:%s", dbname);*/
    return dbname;
}

axis2_bool_t AXIS2_CALL
sandesha2_util_is_fault_envelope(
    const axutil_env_t *env, 
    axiom_soap_envelope_t *soap_envelope)
{
    axiom_soap_fault_t *fault = NULL;

    AXIS2_PARAM_CHECK(env->error, soap_envelope, AXIS2_FAILURE);
    
    fault = axiom_soap_body_get_fault(axiom_soap_envelope_get_body(soap_envelope, env), env);
    if(fault)
    {
        return AXIS2_TRUE;
    }
        
    return AXIS2_FALSE;
}

axis2_bool_t AXIS2_CALL
sandesha2_util_is_ack_already_piggybacked(
    const axutil_env_t *env, 
    sandesha2_msg_ctx_t *rm_msg_ctx)
{
    AXIS2_PARAM_CHECK(env->error, rm_msg_ctx, AXIS2_FAILURE);
    
    if(sandesha2_msg_ctx_get_seq_ack(rm_msg_ctx, env))
    {
        return AXIS2_TRUE;
    }
    
    return AXIS2_FALSE;
}

axis2_bool_t AXIS2_CALL
sandesha2_util_is_piggybackable_msg_type(
    const axutil_env_t *env, 
    int msg_type)
{
    if(SANDESHA2_MSG_TYPE_ACK == msg_type)
    {
        return AXIS2_FALSE;
    }

    return AXIS2_TRUE;
}

axutil_property_t *AXIS2_CALL
sandesha2_util_property_clone(
    const axutil_env_t * env,
    axutil_property_t * property)
{
    axutil_property_t *new_property = NULL;

    new_property = axutil_property_clone(property, env);
    axutil_property_set_own_value(new_property, env, 0);

    return new_property;
}

axis2_endpoint_ref_t *AXIS2_CALL
sandesha2_util_endpoint_ref_clone(
    const axutil_env_t * env,
    axis2_endpoint_ref_t * endpoint_ref)
{
    axis2_endpoint_ref_t *new_endpoint_ref = NULL;
    const axis2_char_t *address = NULL;

    if(endpoint_ref)
    {
        address = axis2_endpoint_ref_get_address(endpoint_ref, env);
        new_endpoint_ref = axis2_endpoint_ref_create(env, address);
    }

    return new_endpoint_ref;
}

