blob: 106d11c490350cafb9a7d75f0377bc707d3b4b6b [file] [log] [blame]
/*
* 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_svc_builder.h>
#include <axis2_class_loader.h>
#include <axis2_utils.h>
#include <axis2_property.h>
/**
* This struct is to convert OM->ServiceDescrption , where it first create OM
* from services.xml and then populate service description by using OM
*/
typedef struct axis2_svc_builder_impl
{
axis2_svc_builder_t svc_builder;
axis2_svc_t *svc;
}
axis2_svc_builder_impl_t;
#define AXIS2_INTF_TO_IMPL(svc_builder) \
((axis2_svc_builder_impl_t *) svc_builder)
/************************* Function prototypes ********************************/
axis2_status_t AXIS2_CALL
axis2_svc_builder_free(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env);
/**
* top most method that is used to populate service from corresponding OM
*/
axis2_status_t AXIS2_CALL
axis2_svc_builder_populate_svc(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_node_t *svc_node);
static axis2_array_list_t *
axis2_svc_builder_process_ops(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *op_itr);
axis2_status_t AXIS2_CALL
axis2_svc_builder_process_svc_module_conf(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *module_confs,
axis2_param_container_t *parent,
axis2_svc_t *svc);
/**
* To get the list og modules that is requird to be engage globally
*/
axis2_status_t AXIS2_CALL
axis2_svc_builder_process_module_refs(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *module_refs);
/************************** End of function prototypes ************************/
axis2_svc_builder_t *AXIS2_CALL
axis2_svc_builder_create(
const axis2_env_t *env)
{
axis2_svc_builder_impl_t *svc_builder_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
svc_builder_impl = (axis2_svc_builder_impl_t *) AXIS2_MALLOC(env->
allocator, sizeof(axis2_svc_builder_impl_t));
if (NULL == svc_builder_impl)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
svc_builder_impl->svc_builder.desc_builder = NULL;
svc_builder_impl->svc = NULL;
svc_builder_impl->svc_builder.ops = NULL;
svc_builder_impl->svc_builder.ops =
AXIS2_MALLOC(env->allocator, sizeof(axis2_svc_builder_ops_t));
if (NULL == svc_builder_impl->svc_builder.ops)
{
axis2_svc_builder_free(&(svc_builder_impl->svc_builder), env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return NULL;
}
svc_builder_impl->svc_builder.ops->free = axis2_svc_builder_free;
svc_builder_impl->svc_builder.ops->populate_svc =
axis2_svc_builder_populate_svc;
svc_builder_impl->svc_builder.ops->process_module_refs =
axis2_svc_builder_process_module_refs;
return &(svc_builder_impl->svc_builder);
}
axis2_svc_builder_t *AXIS2_CALL
axis2_svc_builder_create_with_file_and_dep_engine_and_svc(
const axis2_env_t *env,
axis2_char_t *file_name,
struct axis2_dep_engine *dep_engine,
axis2_svc_t *svc)
{
axis2_svc_builder_impl_t *builder_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, file_name, NULL);
AXIS2_PARAM_CHECK(env->error, dep_engine, NULL);
AXIS2_PARAM_CHECK(env->error, svc, NULL);
builder_impl = (axis2_svc_builder_impl_t *) axis2_svc_builder_create(env);
if (NULL == builder_impl)
{
return NULL;
}
builder_impl->svc_builder.desc_builder =
axis2_desc_builder_create_with_file_and_dep_engine(env, file_name,
dep_engine);
if (!builder_impl->svc_builder.desc_builder)
{
axis2_svc_builder_free(&(builder_impl->svc_builder), env);
return NULL;
}
builder_impl->svc = svc;
return &(builder_impl->svc_builder);
}
axis2_svc_builder_t *AXIS2_CALL
axis2_svc_builder_create_with_dep_engine_and_svc(
const axis2_env_t *env,
axis2_dep_engine_t *dep_engine,
axis2_svc_t *svc)
{
axis2_svc_builder_impl_t *builder_impl = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, dep_engine, NULL);
AXIS2_PARAM_CHECK(env->error, svc, NULL);
builder_impl = (axis2_svc_builder_impl_t *) axis2_svc_builder_create(env);
if (NULL == builder_impl)
{
return NULL;
}
builder_impl->svc_builder.desc_builder =
axis2_desc_builder_create_with_dep_engine(env, dep_engine);
if (!builder_impl->svc_builder.desc_builder)
{
axis2_svc_builder_free(&(builder_impl->svc_builder), env);
return NULL;
}
builder_impl->svc = svc;
return &(builder_impl->svc_builder);
}
/***************************Function implementation****************************/
axis2_status_t AXIS2_CALL
axis2_svc_builder_free(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env)
{
axis2_svc_builder_impl_t *svc_builder_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
svc_builder_impl = AXIS2_INTF_TO_IMPL(svc_builder);
if (svc_builder->desc_builder)
{
AXIS2_DESC_BUILDER_FREE(svc_builder->desc_builder, env);
svc_builder->desc_builder = NULL;
}
svc_builder_impl->svc = NULL;
if (svc_builder->ops)
{
AXIS2_FREE(env->allocator, svc_builder->ops);
svc_builder->ops = NULL;
}
if (svc_builder_impl)
{
AXIS2_FREE(env->allocator, svc_builder_impl);
svc_builder_impl = NULL;
}
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_svc_builder_populate_svc(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_node_t *svc_node)
{
axis2_svc_builder_impl_t *builder_impl = NULL;
axiom_element_t *svc_element = NULL;
axiom_children_qname_iterator_t *itr = NULL;
axiom_children_qname_iterator_t *operation_itr = NULL;
/*axiom_children_qname_iterator_t *module_configs_itr = NULL; */
axis2_qname_t *qparamst = NULL;
axis2_qname_t *qdesc = NULL;
axis2_qname_t *qmodulest = NULL;
axis2_qname_t *qinflowst = NULL;
axis2_qname_t *qoutflowst = NULL;
axis2_qname_t *qin_faultflowst = NULL;
axis2_qname_t *qout_faultflowst = NULL;
axis2_qname_t *qopst = NULL;
axis2_qname_t *qattname = NULL;
/*axis2_qname_t *qmodule_config = NULL; */
axis2_status_t status = AXIS2_FAILURE;
axis2_svc_grp_t *parent = NULL;
axiom_element_t *desc_element = NULL;
axiom_node_t *desc_node = NULL;
axiom_children_qname_iterator_t *module_refs = NULL;
axiom_node_t *in_flow_node = NULL;
axiom_element_t *in_flow_element = NULL;
axiom_node_t *out_flow_node = NULL;
axiom_element_t *out_flow_element = NULL;
axiom_node_t *in_faultflow_node = NULL;
axiom_element_t *in_faultflow_element = NULL;
axiom_node_t *out_faultflow_node = NULL;
axiom_element_t *out_faultflow_element = NULL;
axiom_attribute_t *name_attr = NULL;
axis2_array_list_t *ops = NULL;
axis2_char_t *svc_name = NULL;
axis2_char_t *class_name = NULL;
axis2_char_t *svc_dll_name = NULL;
axis2_dll_desc_t *dll_desc = NULL;
axis2_param_t *impl_info_param = NULL;
axis2_arch_file_data_t *arch_file_data = NULL;
axis2_file_t *svc_folder = NULL;
axis2_char_t *dll_path = NULL;
axis2_char_t *svc_folder_path = NULL;
int i = 0;
int size = 0;
AXIS2_TIME_T timestamp = 0;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, svc_node, AXIS2_FAILURE);
builder_impl = AXIS2_INTF_TO_IMPL(svc_builder);
svc_element = AXIOM_NODE_GET_DATA_ELEMENT(svc_node, env);
/* Processing service level paramters */
qparamst = axis2_qname_create(env, AXIS2_PARAMETERST, NULL, NULL);
if (!qparamst)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
return AXIS2_FAILURE;
}
itr = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(svc_element, env, qparamst,
svc_node);
AXIS2_QNAME_FREE(qparamst, env);
qparamst = NULL;
parent = AXIS2_SVC_GET_PARENT(builder_impl->svc, env);
status = AXIS2_DESC_BUILDER_PROCESS_PARAMS(svc_builder->desc_builder, env,
itr, builder_impl->svc->param_container, parent->param_container);
if (AXIS2_SUCCESS != status)
{
return status;
}
/* process service description */
/* TODO this code is changed in new version of axis2. Until that logic
* is incorporated I comment out this part and add my own logic to set svc
* name
*/
/* -------------------------service description-------------------- */
qdesc = axis2_qname_create(env, AXIS2_DESCRIPTION, NULL, NULL);
desc_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(svc_element, env,
qdesc, svc_node, &desc_node);
AXIS2_QNAME_FREE(qdesc, env) ;
qdesc = NULL;
if( desc_element)
{
axiom_element_t *desc_value_element = NULL;
axiom_node_t *desc_value_node = NULL;
axis2_char_t *description_text = NULL;
desc_value_element = AXIOM_ELEMENT_GET_FIRST_ELEMENT(desc_element,
env, desc_node, &desc_value_node);
description_text = AXIOM_ELEMENT_GET_TEXT (desc_element, env, desc_node);
if (description_text)
{
AXIS2_SVC_SET_SVC_DESC (builder_impl->svc, env, description_text);
}
}
/* --------------------services description end -------------------- */
/* my logic to get set service name */
qattname = axis2_qname_create(env, AXIS2_ATTNAME, NULL, NULL);
name_attr = AXIOM_ELEMENT_GET_ATTRIBUTE(svc_element, env, qattname);
svc_name = AXIOM_ATTRIBUTE_GET_VALUE(name_attr, env);
AXIS2_SVC_SET_NAME(builder_impl->svc, env, svc_name);
AXIS2_QNAME_FREE(qattname, env);
/* create dll_desc and set it in a parameter. then set that param in param
* container taken from svc
*/
dll_desc = axis2_dll_desc_create(env);
impl_info_param = AXIS2_PARAM_CONTAINER_GET_PARAM(
builder_impl->svc->param_container, env,
AXIS2_SERVICE_CLASS);
if (!impl_info_param)
{
AXIS2_DLL_DESC_FREE(dll_desc, env);
return AXIS2_FAILURE;
}
class_name = AXIS2_PARAM_GET_VALUE(impl_info_param, env);
svc_dll_name =
AXIS2_DLL_DESC_CREATE_PLATFORM_SPECIFIC_DLL_NAME(dll_desc, env,
class_name);
arch_file_data = AXIS2_DEP_ENGINE_GET_CURRENT_FILE_ITEM(builder_impl->
svc_builder.desc_builder->engine, env);
svc_folder = AXIS2_ARCH_FILE_DATA_GET_FILE(arch_file_data, env);
timestamp = AXIS2_FILE_GET_TIMESTAMP(svc_folder, env);
AXIS2_DLL_DESC_SET_TIMESTAMP(dll_desc, env, timestamp);
svc_folder_path = AXIS2_FILE_GET_PATH(svc_folder, env);
dll_path = axis2_strcat(env, svc_folder_path, AXIS2_PATH_SEP_STR,
svc_dll_name, NULL);
AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "dll path is : %s", dll_path);
status = AXIS2_DLL_DESC_SET_NAME(dll_desc, env, dll_path);
if (AXIS2_SUCCESS != status)
{
AXIS2_DLL_DESC_FREE(dll_desc, env);
return status;
}
AXIS2_FREE(env->allocator, dll_path);
dll_path = NULL;
AXIS2_DLL_DESC_SET_TYPE(dll_desc, env, AXIS2_SVC_DLL);
status = AXIS2_PARAM_SET_VALUE(impl_info_param, env, dll_desc);
impl_info_param->ops->value_free = axis2_dll_desc_free_void_arg;
if (AXIS2_SUCCESS != status)
{
AXIS2_DLL_DESC_FREE(dll_desc, env);
return status;
}
/* end of my logic */
/* processing service wide modules which required to engage globally */
qmodulest = axis2_qname_create(env, AXIS2_MODULEST, NULL, NULL);
module_refs = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(svc_element, env,
qmodulest, svc_node);
AXIS2_QNAME_FREE(qmodulest, env) ;
qmodulest = NULL;
status = axis2_svc_builder_process_module_refs(svc_builder, env, module_refs);
if (AXIS2_SUCCESS != status)
{
return status;
}
/* process IN_FLOW */
qinflowst = axis2_qname_create(env, AXIS2_IN_FLOW_START, NULL, NULL);
in_flow_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(svc_element,
env, qinflowst, svc_node, &in_flow_node);
AXIS2_QNAME_FREE(qinflowst, env) ;
qinflowst = NULL;
if (in_flow_element && in_flow_node)
{
axis2_flow_t *flow = NULL;
flow = AXIS2_DESC_BUILDER_PROCESS_FLOW(svc_builder->desc_builder, env,
in_flow_element, builder_impl->svc->param_container, in_flow_node);
status = AXIS2_SVC_SET_IN_FLOW(builder_impl->svc, env, flow);
if (AXIS2_SUCCESS != status)
{
AXIS2_FLOW_FREE(flow, env);
return status;
}
}
qoutflowst = axis2_qname_create(env, AXIS2_OUT_FLOW_START, NULL, NULL);
out_flow_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(svc_element,
env, qoutflowst, svc_node, &out_flow_node);
AXIS2_QNAME_FREE(qoutflowst, env) ;
qoutflowst = NULL;
if (out_flow_element && NULL != out_flow_node)
{
axis2_flow_t *flow = NULL;
flow = AXIS2_DESC_BUILDER_PROCESS_FLOW(svc_builder->desc_builder, env,
out_flow_element, builder_impl->svc->param_container, out_flow_node);
status = AXIS2_SVC_SET_OUT_FLOW(builder_impl->svc, env, flow);
if (AXIS2_SUCCESS != status)
{
AXIS2_FLOW_FREE(flow, env);
return status;
}
}
qin_faultflowst = axis2_qname_create(env, AXIS2_IN_FAILTFLOW, NULL, NULL);
in_faultflow_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(svc_element,
env, qin_faultflowst, svc_node, &in_faultflow_node);
AXIS2_QNAME_FREE(qin_faultflowst, env) ;
qin_faultflowst = NULL;
if (in_faultflow_element && in_faultflow_node)
{
axis2_flow_t *flow = NULL;
flow = AXIS2_DESC_BUILDER_PROCESS_FLOW(svc_builder->desc_builder, env,
in_faultflow_element, builder_impl->svc->param_container,
in_faultflow_node);
status = AXIS2_SVC_SET_FAULT_IN_FLOW(builder_impl->svc, env, flow);
if (AXIS2_SUCCESS != status)
{
AXIS2_FLOW_FREE(flow, env);
return status;
}
}
qout_faultflowst = axis2_qname_create(env, AXIS2_OUT_FAILTFLOW, NULL, NULL);
out_faultflow_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(svc_element,
env, qoutflowst, svc_node, &out_faultflow_node);
AXIS2_QNAME_FREE(qout_faultflowst, env) ;
qout_faultflowst = NULL;
if (out_faultflow_element && NULL != out_faultflow_node)
{
axis2_flow_t *flow = NULL;
flow = AXIS2_DESC_BUILDER_PROCESS_FLOW(svc_builder->desc_builder, env,
out_faultflow_element, builder_impl->svc->param_container,
out_faultflow_node);
status = AXIS2_SVC_SET_FAULT_OUT_FLOW(builder_impl->svc, env, flow);
if (AXIS2_SUCCESS != status)
{
AXIS2_FLOW_FREE(flow, env);
return status;
}
}
/* processing operations */
qopst = axis2_qname_create(env, AXIS2_OPERATIONST, NULL, NULL);
operation_itr = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(svc_element, env,
qopst, svc_node);
AXIS2_QNAME_FREE(qopst, env) ;
qopst = NULL;
ops = axis2_svc_builder_process_ops(svc_builder, env, operation_itr);
if (ops)
{
size = AXIS2_ARRAY_LIST_SIZE(ops, env);
}
for (i = 0; i < size; i++)
{
axis2_op_t *op_desc = NULL;
axis2_array_list_t *params = NULL;
int j = 0;
int sizej = 0;
op_desc = (axis2_op_t *) AXIS2_ARRAY_LIST_GET(ops, env, i);
params = AXIS2_OP_GET_ALL_PARAMS(op_desc, env);
/* Adding wsa-mapping into service */
sizej = AXIS2_ARRAY_LIST_SIZE(params, env);
for (j = 0; j < sizej; j++)
{
axis2_param_t *param = NULL;
axis2_char_t *param_name = NULL;
param = AXIS2_ARRAY_LIST_GET(params, env, j);
param_name = AXIS2_PARAM_GET_NAME(param, env);
if (0 == AXIS2_STRCMP(param_name, AXIS2_WSA_MAPPING))
{
axis2_char_t *key = NULL;
key = (axis2_char_t *) AXIS2_PARAM_GET_VALUE(param, env);
AXIS2_SVC_ADD_MAPPING(builder_impl->svc, env, key, op_desc);
}
}
AXIS2_SVC_ADD_OP(builder_impl->svc, env, op_desc);
}
AXIS2_ARRAY_LIST_FREE(ops, env);
/*
qmodule_config = axis2_qname_create(env, AXIS2_MODULECONFIG, NULL, NULL);
module_configs_itr = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(svc_element,
env, qmodule_config, svc_node);
AXIS2_QNAME_FREE(qmodule_config, env) ;
status = axis2_svc_builder_process_svc_module_conf(svc_builder, env,
module_configs_itr, builder_impl->svc->param_container, builder_impl->svc);
*/
return AXIS2_SUCCESS;
}
static axis2_array_list_t *
axis2_svc_builder_process_ops(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *op_itr)
{
axis2_svc_builder_impl_t *builder_impl = NULL;
axis2_array_list_t *ops = NULL;
AXIS2_ENV_CHECK(env, NULL);
AXIS2_PARAM_CHECK(env->error, op_itr, NULL);
builder_impl = AXIS2_INTF_TO_IMPL(svc_builder);
ops = axis2_array_list_create(env, 0);
while (AXIS2_TRUE == AXIOM_CHILDREN_QNAME_ITERATOR_HAS_NEXT(op_itr, env))
{
axiom_element_t *op_element = NULL;
axiom_node_t *op_node = NULL;
axiom_attribute_t *op_name_att = NULL;
axiom_attribute_t *op_mep_att = NULL;
axis2_qname_t *qmep = NULL;
axis2_qname_t *qopname = NULL;
axis2_qname_t *qparamst = NULL;
axis2_qname_t *qmsgrecv = NULL;
axis2_qname_t *qmodulest = NULL;
axis2_qname_t *qattname = NULL;
axis2_char_t *mep_url = NULL;
axis2_char_t *op_name = NULL;
axis2_wsdl_op_t *wsdl_op = NULL;
axis2_op_t *op_desc = NULL;
axiom_children_qname_iterator_t *params_itr = NULL;
axiom_children_qname_iterator_t *module_itr = NULL;
axiom_element_t *recv_element = NULL;
axiom_node_t *recv_node = NULL;
axis2_status_t status = AXIS2_FAILURE;
op_node = AXIOM_CHILDREN_QNAME_ITERATOR_NEXT(op_itr, env);
/* getting operation name */
op_element = AXIOM_NODE_GET_DATA_ELEMENT(op_node, env);
qattname = axis2_qname_create(env, AXIS2_ATTNAME, NULL, NULL);
op_name_att = AXIOM_ELEMENT_GET_ATTRIBUTE(op_element, env, qattname);
AXIS2_QNAME_FREE(qattname, env);
qattname = NULL;
if (NULL == op_name_att)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_OP_NAME_MISSING,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
/* set the mep of the operation */
qmep = axis2_qname_create(env, AXIS2_MEP, NULL, NULL);
op_mep_att = AXIOM_ELEMENT_GET_ATTRIBUTE(op_element, env, qmep);
AXIS2_QNAME_FREE(qmep, env);
qmep = NULL;
if (op_mep_att)
{
mep_url = AXIOM_ATTRIBUTE_GET_VALUE(op_mep_att, env);
/*
TODO value has to be validate
TODO
op_descrip.setMessageExchangePattern(mep);
*/
}
op_name = AXIOM_ATTRIBUTE_GET_VALUE(op_name_att, env);
qopname = axis2_qname_create(env, op_name, NULL, NULL);
wsdl_op = AXIS2_SVC_GET_WSDL_OP(builder_impl->svc, env, qopname);
if (NULL == wsdl_op)
{
if (NULL == mep_url)
{
/* assumed MEP is in-out */
op_desc = axis2_op_create(env);
}
else
{
op_desc = axis2_op_create(env);
AXIS2_OP_SET_MSG_EXCHANGE_PATTERN(op_desc, env, mep_url);
}
AXIS2_OP_SET_QNAME(op_desc, env, qopname);
}
else
{
axis2_char_t *mep = NULL;
/* Creating operation from existing operation */
mep = AXIS2_WSDL_OP_GET_MSG_EXCHANGE_PATTERN(wsdl_op, env);
if (NULL == mep)
{
op_desc = axis2_op_create_with_wsdl_op(env, wsdl_op);
}
else
{
op_desc = axis2_op_create(env);
AXIS2_OP_SET_MSG_EXCHANGE_PATTERN(op_desc, env, mep);
AXIS2_OP_SET_WSDL_OP(op_desc, env, wsdl_op);
}
}
AXIS2_QNAME_FREE(qopname, env);
qopname = NULL;
/* operation parameters */
qparamst = axis2_qname_create(env, AXIS2_PARAMETERST, NULL, NULL);
params_itr = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(op_element, env,
qparamst, op_node);
AXIS2_QNAME_FREE(qparamst, env);
qparamst = NULL;
status = AXIS2_DESC_BUILDER_PROCESS_PARAMS(svc_builder->desc_builder,
env, params_itr, op_desc->param_container, builder_impl->svc->
param_container);
/* loading the message receivers */
qmsgrecv = axis2_qname_create(env, AXIS2_MESSAGERECEIVER, NULL, NULL);
recv_element = AXIOM_ELEMENT_GET_FIRST_CHILD_WITH_QNAME(op_element,
env, qmsgrecv, op_node, &recv_node);
AXIS2_QNAME_FREE(qmsgrecv, env);
qmsgrecv = NULL;
if (recv_element && NULL != recv_node)
{
axis2_msg_recv_t *msg_recv = NULL;
msg_recv = AXIS2_DESC_BUILDER_LOAD_MSG_RECV(svc_builder->desc_builder,
env, recv_element);
AXIS2_OP_SET_MSG_RECV(op_desc, env, msg_recv);
}
else
{
axis2_msg_recv_t *msg_recv = NULL;
/* setting the default messgae receiver */
msg_recv = axis2_desc_builder_load_default_msg_recv(env);
AXIS2_OP_SET_MSG_RECV(op_desc, env, msg_recv);
}
/* process module refs */
qmodulest = axis2_qname_create(env, AXIS2_MODULEST, NULL, NULL);
module_itr = AXIOM_ELEMENT_GET_CHILDREN_WITH_QNAME(op_element, env,
qmodulest, op_node);
AXIS2_QNAME_FREE(qmodulest, env);
qmodulest = NULL;
status = AXIS2_DESC_BUILDER_PROCESS_OP_MODULE_REFS(svc_builder->
desc_builder, env, module_itr, op_desc);
if (AXIS2_SUCCESS != status)
{
return AXIS2_FAILURE;
}
/* setting operation phase */
if (svc_builder->desc_builder->engine)
{
axis2_phases_info_t *info = AXIS2_DEP_ENGINE_GET_PHASES_INFO(
svc_builder->desc_builder->engine, env);
AXIS2_PHASES_INFO_SET_OP_PHASES(info, env, op_desc);
}
/* adding operation */
status = AXIS2_ARRAY_LIST_ADD(ops, env, op_desc);
}
return ops;
}
axis2_status_t AXIS2_CALL
axis2_svc_builder_process_svc_module_conf(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *module_confs,
axis2_param_container_t *parent,
axis2_svc_t *svc)
{
while (AXIS2_TRUE == AXIOM_CHILDREN_ITERATOR_HAS_NEXT(module_confs, env))
{
axiom_element_t *module_conf_element = NULL;
axiom_node_t *module_conf_node = NULL;
axiom_attribute_t *module_name_att = NULL;
axis2_qname_t *qattname = NULL;
module_conf_node = AXIOM_CHILDREN_ITERATOR_NEXT(module_confs, env);
module_conf_element = AXIOM_NODE_GET_DATA_ELEMENT(module_conf_node,
env);
qattname = axis2_qname_create(env, AXIS2_ATTNAME, NULL, NULL);
module_name_att = AXIOM_ELEMENT_GET_ATTRIBUTE(module_conf_element,
env, qattname);
AXIS2_QNAME_FREE(qattname, env);
qattname = NULL;
if (NULL == module_name_att)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_MODULE_CONF,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
}
return AXIS2_SUCCESS;
}
axis2_status_t AXIS2_CALL
axis2_svc_builder_process_module_refs(
axis2_svc_builder_t *svc_builder,
const axis2_env_t *env,
axiom_children_qname_iterator_t *
module_refs)
{
axis2_svc_builder_impl_t *builder_impl = NULL;
AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, module_refs, AXIS2_FAILURE);
builder_impl = AXIS2_INTF_TO_IMPL(svc_builder);
while (AXIS2_TRUE == AXIOM_CHILDREN_ITERATOR_HAS_NEXT(module_refs, env))
{
axiom_element_t *module_ref_element = NULL;
axiom_node_t *module_ref_node = NULL;
axiom_attribute_t *module_ref_att = NULL;
axis2_qname_t *qref = NULL;
module_ref_node = AXIOM_CHILDREN_ITERATOR_NEXT(module_refs, env);
module_ref_element = AXIOM_NODE_GET_DATA_ELEMENT(module_ref_node,
env);
qref = axis2_qname_create(env, AXIS2_REF, NULL, NULL);
module_ref_att = AXIOM_ELEMENT_GET_ATTRIBUTE(module_ref_element,
env, qref);
AXIS2_QNAME_FREE(qref, env);
if (module_ref_att)
{
axis2_char_t *ref_name = NULL;
axis2_qname_t *qrefname = NULL;
ref_name = AXIOM_ATTRIBUTE_GET_VALUE(module_ref_att, env);
qrefname = axis2_qname_create(env, ref_name, NULL, NULL);
if (NULL == AXIS2_DEP_ENGINE_GET_MODULE(svc_builder->desc_builder->
engine, env, qrefname))
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_MODULE_NOT_FOUND,
AXIS2_FAILURE);
return AXIS2_FAILURE;
}
else
{
AXIS2_SVC_ADD_MODULE_QNAME(builder_impl->svc, env, qrefname);
}
AXIS2_QNAME_FREE(qrefname, env);
}
}
return AXIS2_SUCCESS;
}