/*
 * 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;
    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;
}
