/*
 * 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_wsdl_desc.h>
#include <axis2_wsdl_types.h>
#include <axis2_wsdl_component.h>
#include <axis2_wsdl_binding.h>
#include <axis2_wsdl_import.h>
#include <axis2_wsdl_include.h>
#include <axis2_wsdl_extensible_attribute.h>
#include <axis2_wsdl_binding_fault.h>


/**
 * @brief Wsdl Description struct impl
 *   Axis2 Wsdl Description Implementation
 */
typedef struct axis2_wsdl_desc_impl
{
    axis2_wsdl_desc_t wsdl_desc;
    /**
     * The name token of WSDL 1.1 Definition.
     */
    axis2_qname_t *wsdl1_def_name;
    /* TODO local name and the naspace name to be made static or through a
     * Constant class.*/
    /* TODO required; thus check it up */
    /**
     * Field targetNameSpace
     */
    axis2_char_t *target_namespace;
    /* TODO The object structure of some external xml data binding is going to
     *be pluged here eventually.*/
    /**
     * Field types
     */
    axis2_wsdl_types_t *types;
    /**
     * This List will be a list of <code>WSDLInterface</code> objects.
     */
    axis2_hash_t *interfaces;
    /**
     * This <code>HashMap </code> is a Map of <code>WSDLBinding </code> objects.
     */
    axis2_hash_t *bindings;
    /**
     * This <code>HashMap </code> is a list of <code>WSDLService </code> objects.
     * Support of multiple is backed by the requirements in the specification.
     */
    axis2_hash_t *svcs;
    /**
     * WSDL imports
     */
    axis2_array_list_t *imports;
    /**
     * WSDL Includes.
     */
    axis2_array_list_t *includes;
    /**
     * Will keep a map of all the Namespaces associated with the
     * Definition Component and will be keyed by the Namespace prefix.
     */
    axis2_hash_t *namespaces;

}
axis2_wsdl_desc_impl_t;

#define AXIS2_INTF_TO_IMPL(wsdl_desc) ((axis2_wsdl_desc_impl_t *)wsdl_desc)

/*************************** Function headers *********************************/

axis2_status_t AXIS2_CALL
axis2_wsdl_desc_free(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Returns a Map of <code>wsdl_bindings</code> Objects keyed by the
 * <code>axis2_qname_t</code> of the Binding.
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_bindings(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Sets the whole new set of Bindings to the axis2_wsd_desc.
 *
 * @param bindings
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_bindings(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *bindings);

/**
 * The axis2_wsdl_binding Will be added to the map keyed  with its own qname.
 * If the  axis2_wsdl_binding is null it will not be added.
 * If the axis2_wsdl_binding is not null and  Binding name is null then
 * error is set.
 *
 * @param binding <code>axis2_wsdl_binding</code> Object
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_binding(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_binding_t *binding);

/**
 * Retrives the <code>axis2_wsdl_binding_t</code> by its qname. Wil return NULL
 * if <code>axis2_wsdl_binding_t</code> is not found.
 *
 * @param qname The qname of the Binding.
 * @return
 */
axis2_wsdl_binding_t *AXIS2_CALL
axis2_wsdl_desc_get_binding(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname);

/**
 * The Interface component will be added to the map keyed with its own name.
 * If the Interface is NULL it will not be added.
 * If the interface name is NULL an Error will be set and return.
 *
 * @param interface
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_interface(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_interface_t *interface);

/**
 * The Interface will be returned if it exsists,
 * otherwise null will be returned.
 *
 * @param qname qname of the Interface.
 * @return The Interface with the relavent qname
 */
axis2_wsdl_interface_t *AXIS2_CALL
axis2_wsdl_desc_get_interface(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname);

/**
 * Method get_interfaces
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_interfaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Method axis2_wsdl_desc_set_interfaces
 *
 * @param interfaces
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_interfaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *interfaces);

/**
 * Method get_svcs
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_svcs(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Method axis2_wsdl_desc_set_svcs
 *
 * @param svcs
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_svcs(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *svcs);

/**
 * Will return the <code>axis2_wsdl_svc </code> if found otherwise return NULL.
 *
 * @param qname <code>qname</code> of the svc
 * @return The svc with the relevant qname
 */
axis2_wsdl_svc_t *AXIS2_CALL
axis2_wsdl_desc_get_svc(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname);

/**
 * Will add the <code>axis2_wsdl_svc_t</code> to the map.
 * If svc is NULL it will not be added.
 * If the <code>axis2_wsdl_svc_t</code> name is NULL an error will be set.
 *
 * @param svc
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_svc(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_svc_t *svc);

/**
 * Method get_target_namespace
 *
 * @return
 */
axis2_char_t *AXIS2_CALL
axis2_wsdl_desc_get_target_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Method set_target_namespace
 *
 * @param target_namespace
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_target_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_char_t *target_namespace);

/**
 * Method get_types
 *
 * @return
 */
axis2_wsdl_types_t *AXIS2_CALL
axis2_wsdl_desc_get_types(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Method axis2_wsdl_desc_set_types
 *
 * @param types
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_types(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_types_t *types);

/**
 * Gets the name attribute of the WSDL 1.1 Definitions Element
 *
 * @return
 */
axis2_qname_t *AXIS2_CALL
axis2_wsdl_desc_get_wsdl1_def_name(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Sets the name attribute of the WSDL 1.1 Definitions Element
 *
 * @param wsdl1_def_name
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_wsdl1_def_name(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *wsdl1_def_name);

/**
 * Will return the Namespace URI as a String if there exists an
 * Namespace URI associated with the given prefix, in the Definition
 * Component, Will return NULL if not found.
 *
 * @param prefix Prefix defined in the Definitions elemet in the WSDL file
 * @return The Namespace URI for the prefix.
 */
axis2_char_t *AXIS2_CALL
axis2_wsdl_desc_get_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_char_t *prefix);

/**
 * Will return all the Namespaces associated with the Definition
 * Component and will be keyed by the Napespace Prefix.
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_namespaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Sets the Namespaces associated with the Difinition Component
 * and they should be keyed by its Namespace Prefix.
 *
 * @param namespaces
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_namespaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *namespaces);

/**
 * Returns the WSDL Imports in an <code>axis2_array_list_t</code>
 *
 * @return
 */
axis2_array_list_t *AXIS2_CALL
axis2_wsdl_desc_get_imports(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Sets the imports as an <code>axis2_array_list_t</code>
 *
 * @param imports
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_imports(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_array_list_t *imports);

/**
 * Adds an import to the list.
 *
 * @param wsdl_import
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_import(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_import_t *wsdl_import);

/**
 * Returns the Includes in an <code>axis2_array_list_t</code>
 *
 * @return
 */
axis2_array_list_t *AXIS2_CALL
axis2_wsdl_desc_get_includes(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env);

/**
 * Sets the includes as an <code>axis2_array_list_t</code>
 *
 * @param includes
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_includes(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_array_list_t *includes);

/**
 * Adds an wsdl include to the list.
 *
 * @param wsdl_include
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_include(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_include_t *wsdl_include);


/************************* End of function headers ****************************/

axis2_wsdl_desc_t * AXIS2_CALL
axis2_wsdl_desc_create(const axis2_env_t *env)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    wsdl_desc_impl = (axis2_wsdl_desc_impl_t *) AXIS2_MALLOC(env->
            allocator, sizeof(axis2_wsdl_desc_impl_t));

    if (NULL == wsdl_desc_impl)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    wsdl_desc_impl->wsdl1_def_name = NULL;
    wsdl_desc_impl->target_namespace = NULL;
    wsdl_desc_impl->types = NULL;
    wsdl_desc_impl->interfaces = NULL;
    wsdl_desc_impl->bindings = NULL;
    wsdl_desc_impl->svcs = NULL;
    wsdl_desc_impl->imports = NULL;
    wsdl_desc_impl->includes = NULL;
    wsdl_desc_impl->namespaces = NULL;
    wsdl_desc_impl->wsdl_desc.ops = NULL;

    wsdl_desc_impl->wsdl_desc.component = axis2_wsdl_component_create(env);

    if (NULL == wsdl_desc_impl->wsdl_desc.component)
    {
        axis2_wsdl_desc_free(&(wsdl_desc_impl->wsdl_desc), env);
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    wsdl_desc_impl->wsdl_desc.ops = AXIS2_MALLOC(env->allocator,
            sizeof(axis2_wsdl_desc_ops_t));
    if (NULL == wsdl_desc_impl->wsdl_desc.ops)
    {
        axis2_wsdl_desc_free(&(wsdl_desc_impl->wsdl_desc), env);
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    wsdl_desc_impl->wsdl_desc.ops->free = axis2_wsdl_desc_free;
    wsdl_desc_impl->wsdl_desc.ops->get_bindings = axis2_wsdl_desc_get_bindings;
    wsdl_desc_impl->wsdl_desc.ops->set_bindings = axis2_wsdl_desc_set_bindings;
    wsdl_desc_impl->wsdl_desc.ops->add_binding = axis2_wsdl_desc_add_binding;
    wsdl_desc_impl->wsdl_desc.ops->get_binding = axis2_wsdl_desc_get_binding;
    wsdl_desc_impl->wsdl_desc.ops->add_interface = axis2_wsdl_desc_add_interface;
    wsdl_desc_impl->wsdl_desc.ops->get_interface = axis2_wsdl_desc_get_interface;
    wsdl_desc_impl->wsdl_desc.ops->get_interfaces = axis2_wsdl_desc_get_interfaces;
    wsdl_desc_impl->wsdl_desc.ops->set_interfaces = axis2_wsdl_desc_set_interfaces;
    wsdl_desc_impl->wsdl_desc.ops->get_svcs = axis2_wsdl_desc_get_svcs;
    wsdl_desc_impl->wsdl_desc.ops->set_svcs = axis2_wsdl_desc_set_svcs;
    wsdl_desc_impl->wsdl_desc.ops->get_svc = axis2_wsdl_desc_get_svc;
    wsdl_desc_impl->wsdl_desc.ops->add_svc = axis2_wsdl_desc_add_svc;
    wsdl_desc_impl->wsdl_desc.ops->get_target_namespace =
        axis2_wsdl_desc_get_target_namespace;
    wsdl_desc_impl->wsdl_desc.ops->set_target_namespace =
        axis2_wsdl_desc_set_target_namespace;
    wsdl_desc_impl->wsdl_desc.ops->get_types = axis2_wsdl_desc_get_types;
    wsdl_desc_impl->wsdl_desc.ops->set_types = axis2_wsdl_desc_set_types;
    wsdl_desc_impl->wsdl_desc.ops->get_wsdl1_def_name =
        axis2_wsdl_desc_get_wsdl1_def_name;
    wsdl_desc_impl->wsdl_desc.ops->set_wsdl1_def_name =
        axis2_wsdl_desc_set_wsdl1_def_name;
    wsdl_desc_impl->wsdl_desc.ops->get_namespace = axis2_wsdl_desc_get_namespace;
    wsdl_desc_impl->wsdl_desc.ops->get_namespaces = axis2_wsdl_desc_get_namespaces;
    wsdl_desc_impl->wsdl_desc.ops->set_namespaces = axis2_wsdl_desc_set_namespaces;
    wsdl_desc_impl->wsdl_desc.ops->get_imports = axis2_wsdl_desc_get_imports;
    wsdl_desc_impl->wsdl_desc.ops->set_imports = axis2_wsdl_desc_set_imports;
    wsdl_desc_impl->wsdl_desc.ops->add_import = axis2_wsdl_desc_add_import;
    wsdl_desc_impl->wsdl_desc.ops->get_includes = axis2_wsdl_desc_get_includes;
    wsdl_desc_impl->wsdl_desc.ops->set_includes = axis2_wsdl_desc_set_includes;
    wsdl_desc_impl->wsdl_desc.ops->add_include = axis2_wsdl_desc_add_include;

    return &(wsdl_desc_impl->wsdl_desc);
}

/*************************Function implementations*****************************/

axis2_status_t AXIS2_CALL
axis2_wsdl_desc_free(
    axis2_wsdl_desc_t *wsdl_desc,
    const axis2_env_t *env)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    if (wsdl_desc->ops)
    {
        AXIS2_FREE(env->allocator, wsdl_desc->ops);
        wsdl_desc->ops = NULL;
    }

    if (wsdl_desc->component)
    {
        AXIS2_WSDL_COMPONENT_FREE(wsdl_desc->component, env);
        wsdl_desc->component = NULL;
    }

    if (wsdl_desc_impl)
        AXIS2_FREE(env->allocator, wsdl_desc_impl);
    wsdl_desc_impl = NULL;

    return AXIS2_SUCCESS;
}

/**
 * Returns a Map of <code>wsdl_bindings</code> Objects keyed by the
 * <code>axis2_qname_t</code> of the Binding.
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_bindings(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);

    return AXIS2_INTF_TO_IMPL(wsdl_desc)->bindings;
}

/**
 * Sets the whole new set of Bindings to the axis2_wsd_desc.
 *
 * @param bindings
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_bindings(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *bindings)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    /* TODO free previous bindings before assign new bindings */
    wsdl_desc_impl->bindings = bindings;

    return AXIS2_SUCCESS;
}

/**
 * The axis2_wsdl_binding Will be added to the map keyed  with its own qname.
 * If the  axis2_wsdl_binding is null it will not be added.
 * If the axis2_wsdl_binding is not null and  Binding name is null then
 * error is set.
 *
 * @param binding <code>axis2_wsdl_binding</code> Object
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_binding(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_binding_t *binding)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_qname_t *binding_qname = NULL;
    axis2_char_t *binding_name = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, binding, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    binding_qname = AXIS2_WSDL_BINDING_GET_NAME(binding, env);
    if (NULL == binding_qname)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_WSDL_BINDING_NAME_IS_REQUIRED,
                AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    binding_name = AXIS2_QNAME_TO_STRING(binding_qname, env);
    if (!wsdl_desc_impl->bindings)
    {
        wsdl_desc_impl->bindings = axis2_hash_make(env);
        if (!wsdl_desc_impl->bindings)
        {
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
            return AXIS2_FAILURE;
        }
    }
    axis2_hash_set(wsdl_desc_impl->bindings, binding_name, AXIS2_HASH_KEY_STRING,
            binding);
    return AXIS2_SUCCESS;
}

/**
 * Retrives the <code>axis2_wsdl_binding_t</code> by its qname. Wil return NULL
 * if <code>axis2_wsdl_binding_t</code> is not found.
 *
 * @param qname The qname of the Binding.
 * @return
 */
axis2_wsdl_binding_t *AXIS2_CALL
axis2_wsdl_desc_get_binding(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_char_t *name = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    name = AXIS2_QNAME_TO_STRING(qname, env);
    if (wsdl_desc_impl->bindings)
    {
        return (axis2_wsdl_binding_t *) axis2_hash_get(wsdl_desc_impl->bindings,
                name, AXIS2_HASH_KEY_STRING);
    }
    return NULL;
}

/**
 * The Interface component will be added to the map keyed with its own name.
 * If the Interface is NULL it will not be added.
 * If the interface name is NULL an Error will be set and return.
 *
 * @param interface
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_interface(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_interface_t *interface)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_qname_t *interface_qname = NULL;
    axis2_char_t *interface_name = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, interface, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    interface_qname = AXIS2_WSDL_INTERFACE_GET_NAME(interface, env);
    if (NULL == interface_qname)
    {
        AXIS2_ERROR_SET(env->error,
                AXIS2_ERROR_WSDL_INTERFACE_NAME_IS_REQUIRED, AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    interface_name = AXIS2_QNAME_TO_STRING(interface_qname, env);
    if (!wsdl_desc_impl->interfaces)
    {
        wsdl_desc_impl->interfaces = axis2_hash_make(env);
        if (!wsdl_desc_impl->interfaces)
        {
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
            return AXIS2_FAILURE;
        }
    }
    axis2_hash_set(wsdl_desc_impl->interfaces, interface_name,
            AXIS2_HASH_KEY_STRING, interface);
    return AXIS2_SUCCESS;
}

/**
 * The Interface will be returned if it exsists,
 * otherwise null will be returned.
 *
 * @param qname qname of the Interface.
 * @return The Interface with the relavent qname
 */
axis2_wsdl_interface_t *AXIS2_CALL
axis2_wsdl_desc_get_interface(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_char_t *name = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    name = AXIS2_QNAME_TO_STRING(qname, env);
    if (wsdl_desc_impl->interfaces)
    {
        return (axis2_wsdl_interface_t *) axis2_hash_get(wsdl_desc_impl->interfaces,
                name, AXIS2_HASH_KEY_STRING);
    }
    return NULL;
}

/**
 * Method get_interfaces
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_interfaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->interfaces;
}

/**
 * Method axis2_wsdl_desc_set_interfaces
 *
 * @param interfaces
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_interfaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *interfaces)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    /*TODO free existing interfaces before setting new map */
    wsdl_desc_impl->interfaces = interfaces;

    return AXIS2_SUCCESS;
}

/**
 * Method get_svcs
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_svcs(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->svcs;
}

/**
 * Method axis2_wsdl_desc_set_svcs
 *
 * @param svcs
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_svcs(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *svcs)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    /*TODO free existing svcs before setting new map */
    wsdl_desc_impl->svcs = svcs;

    return AXIS2_SUCCESS;
}

/**
 * Will return the <code>axis2_wsdl_svc </code> if found otherwise return NULL.
 *
 * @param qname <code>qname</code> of the svc
 * @return The svc with the relevant qname
 */
axis2_wsdl_svc_t *AXIS2_CALL
axis2_wsdl_desc_get_svc(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *qname)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_char_t *name = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    name = AXIS2_QNAME_TO_STRING(qname, env);
    if (wsdl_desc_impl->svcs)
    {
        return (axis2_wsdl_svc_t *) axis2_hash_get(wsdl_desc_impl->svcs,
                name, AXIS2_HASH_KEY_STRING);
    }
    return NULL;
}

/**
 * Will add the <code>axis2_wsdl_svc_t</code> to the map.
 * If svc is NULL it will not be added.
 * If the <code>axis2_wsdl_svc_t</code> name is NULL an error will be set.
 *
 * @param svc
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_svc(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_svc_t *svc)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    const axis2_qname_t *svc_qname = NULL;
    axis2_char_t *svc_name = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, svc, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    svc_qname = AXIS2_WSDL_SVC_GET_QNAME(svc, env);
    if (NULL == svc_qname)
    {
        AXIS2_ERROR_SET(env->error,
                AXIS2_ERROR_WSDL_SVC_NAME_IS_REQUIRED, AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    svc_name = AXIS2_QNAME_TO_STRING(svc_qname, env);
    if (!wsdl_desc_impl->svcs)
    {
        wsdl_desc_impl->svcs = axis2_hash_make(env);
        if (!wsdl_desc_impl->svcs)
        {
            AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
            return AXIS2_FAILURE;
        }
    }
    axis2_hash_set(wsdl_desc_impl->svcs, svc_name,
            AXIS2_HASH_KEY_STRING, svc);
    return AXIS2_SUCCESS;
}

/**
 * Method get_target_namespace
 *
 * @return
 */
axis2_char_t *AXIS2_CALL
axis2_wsdl_desc_get_target_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->target_namespace;
}

/**
 * Method set_target_namespace
 *
 * @param target_namespace
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_target_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_char_t *target_namespace)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, target_namespace, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    if (wsdl_desc_impl->target_namespace)
    {
        AXIS2_FREE(env->allocator, wsdl_desc_impl->target_namespace);
        wsdl_desc_impl->target_namespace = NULL;
    }
    wsdl_desc_impl->target_namespace = AXIS2_STRDUP(target_namespace, env);
    if (wsdl_desc_impl->target_namespace)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return AXIS2_FAILURE;
    }
    return AXIS2_SUCCESS;
}

/**
 * Method get_types
 *
 * @return
 */
axis2_wsdl_types_t *AXIS2_CALL
axis2_wsdl_desc_get_types(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->types;
}

/**
 * Method axis2_wsdl_desc_set_types
 *
 * @param types
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_types(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_types_t *types)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);
    AXIS2_PARAM_CHECK(env->error, types, AXIS2_FAILURE);

    if (wsdl_desc_impl->types)
    {
        AXIS2_WSDL_TYPES_FREE(wsdl_desc_impl->types, env);
        wsdl_desc_impl->types = NULL;
    }
    wsdl_desc_impl->types = types;

    return AXIS2_SUCCESS;
}


/**
 * Gets the name attribute of the WSDL 1.1 Definitions Element
 *
 * @return
 */
axis2_qname_t *AXIS2_CALL
axis2_wsdl_desc_get_wsdl1_def_name(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->wsdl1_def_name;
}

/**
 * Sets the name attribute of the WSDL 1.1 Definitions Element
 *
 * @param wsdl1_def_name
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_wsdl1_def_name(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_qname_t *wsdl1_def_name)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    if (wsdl_desc_impl->wsdl1_def_name)
    {
        AXIS2_QNAME_FREE(wsdl_desc_impl->wsdl1_def_name, env);
        wsdl_desc_impl->wsdl1_def_name = NULL;
    }
    wsdl_desc_impl->wsdl1_def_name = AXIS2_QNAME_CLONE(wsdl1_def_name, env);

    return AXIS2_SUCCESS;
}

/**
 * Will return the Namespace URI as a String if there exists an
 * Namespace URI associated with the given prefix, in the Definition
 * Component, Will return NULL if not found.
 *
 * @param prefix Prefix defined in the Definitions elemet in the WSDL file
 * @return The Namespace URI for the prefix.
 */
axis2_char_t *AXIS2_CALL
axis2_wsdl_desc_get_namespace(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_char_t *prefix)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK(env->error, prefix, NULL);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    return (axis2_char_t *) axis2_hash_get(wsdl_desc_impl->namespaces, prefix,
            AXIS2_HASH_KEY_STRING);
}

/**
 * Will return all the Namespaces associated with the Definition
 * Component and will be keyed by the Napespace Prefix.
 *
 * @return
 */
axis2_hash_t *AXIS2_CALL
axis2_wsdl_desc_get_namespaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    AXIS2_ENV_CHECK(env, NULL);

    return AXIS2_INTF_TO_IMPL(wsdl_desc)->namespaces;
}

/**
 * Sets the Namespaces associated with the Difinition Component
 * and they should be keyed by its Namespace Prefix.
 *
 * @param namespaces
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_namespaces(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_hash_t *namespaces)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    /*TODO free existing namespaces before setting new map */
    wsdl_desc_impl->namespaces = namespaces;

    return AXIS2_SUCCESS;
}

/**
 * Returns the WSDL Imports in an <code>axis2_array_list_t</code>
 *
 * @return
 */
axis2_array_list_t *AXIS2_CALL
axis2_wsdl_desc_get_imports(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->imports;
}

/**
 * Sets the imports as an <code>axis2_array_list_t</code>
 *
 * @param imports
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_imports(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_array_list_t *imports)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);
    AXIS2_PARAM_CHECK(env->error, imports, AXIS2_FAILURE);

    if (wsdl_desc_impl->imports)
    {
        /* TODO Free elements of the array */
        AXIS2_ARRAY_LIST_FREE(wsdl_desc_impl->imports, env);
        wsdl_desc_impl->imports = NULL;
    }
    wsdl_desc_impl->imports = imports;

    return AXIS2_SUCCESS;
}

/**
 * Adds an import to the list.
 *
 * @param wsdl_import
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_import(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_import_t *wsdl_import)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, wsdl_import, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    return AXIS2_ARRAY_LIST_ADD(wsdl_desc_impl->imports, env, wsdl_import);
}

/**
 * Returns the Includes in an <code>axis2_array_list_t</code>
 *
 * @return
 */
axis2_array_list_t *AXIS2_CALL
axis2_wsdl_desc_get_includes(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    return AXIS2_INTF_TO_IMPL(wsdl_desc)->includes;
}

/**
 * Sets the includes as an <code>axis2_array_list_t</code>
 *
 * @param includes
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_set_includes(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_array_list_t *includes)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);
    AXIS2_PARAM_CHECK(env->error, includes, AXIS2_FAILURE);

    if (wsdl_desc_impl->includes)
    {
        /* TODO Free elements of the array */
        AXIS2_ARRAY_LIST_FREE(wsdl_desc_impl->includes, env);
        wsdl_desc_impl->includes = NULL;
    }
    wsdl_desc_impl->includes = includes;

    return AXIS2_SUCCESS;
}

/**
 * Adds an wsdl include to the list.
 *
 * @param wsdl_include
 */
axis2_status_t AXIS2_CALL
axis2_wsdl_desc_add_include(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env,
        axis2_wsdl_include_t *wsdl_include)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
    AXIS2_PARAM_CHECK(env->error, wsdl_include, AXIS2_FAILURE);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    return AXIS2_ARRAY_LIST_ADD(wsdl_desc_impl->includes, env, wsdl_include);
}

axis2_wsdl_binding_t *AXIS2_CALL
axis2_wsdl_desc_get_first_binding(axis2_wsdl_desc_t *wsdl_desc,
        const axis2_env_t *env)
{
    axis2_wsdl_desc_impl_t *wsdl_desc_impl = NULL;
    axis2_hash_index_t *index = NULL;
    void *v = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    wsdl_desc_impl = AXIS2_INTF_TO_IMPL(wsdl_desc);

    index = axis2_hash_first(wsdl_desc_impl->bindings, env);
    axis2_hash_this(index, NULL, NULL, &v);
    if (v)
        return (axis2_wsdl_binding_t *)v;
    return NULL;
}
