blob: ab2429512460855578c780c98bc969c74d3f011c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.h>
#include <axis2_addr.h>
#include <axutil_property.h>
#include <axis2_module.h>
#include "../deployment/axis2_desc_builder.h"
#include <axis2_svc_skeleton.h>
#include <axutil_thread.h>
#include <axis2_core_utils.h>
struct axis2_svc
{
axis2_svc_grp_t *parent;
axis2_char_t *axis_svc_name;
/** To keep last update time of the service */
long last_update;
axis2_char_t *filename;
/** To store module descriptions at deploy time parsing */
axutil_array_list_t *module_list;
/** Service description */
axis2_char_t *svc_desc;
/** wsdl file path */
axis2_char_t *wsdl_path;
/** service folder path */
axis2_char_t *folder_path;
/**
* WSDL related stuff
*/
axutil_hash_t *ns_map;
/* Count of the entries in the namespace map */
int ns_count;
/* To keep the XML scheama either from WSDL or
* C2WSDL(in the future)
*/
axutil_array_list_t *schema_list;
/**
* A table that keeps a mapping of unique XSD names (Strings)
* against the schema objects. This is populated in the first
* instance the schemas are asked for and then used to serve
* the subsequent requests
*/
axutil_hash_t *schema_mapping_table;
/**
* This is where operations are kept
*/
axutil_hash_t *op_alias_map;
/**
* This is where action mappings are kept
*/
axutil_hash_t *op_action_map;
/**
* This is where REST mappings are kept
*/
axutil_hash_t *op_rest_map;
/**
* Keeps track whether the schema locations are adjusted
*/
axis2_bool_t schema_loc_adjusted;
/**
* A custom schema name prefix. if set this will be used to
* modify the schema names
*/
axis2_char_t *custom_schema_name_prefix;
/**
* A custom schema name suffix. will be attached to the
* schema file name when the files are uniquely named.
* A good place to add a file extension if needed
*/
axis2_char_t *custom_schema_name_suffix;
/* To store the target namespace for the schema */
axis2_char_t *schema_target_ns;
axis2_char_t *schema_target_ns_prefix;
/* To keep the service target name space */
axis2_char_t *target_ns;
axis2_char_t *target_ns_prefix;
/* Used for schema name calculations */
int sc_calc_count;
void *impl_class;
axutil_qname_t *qname;
axis2_char_t *style;
axutil_array_list_t *engaged_module_list;
/** Parameter container to hold service related parameters */
struct axutil_param_container *param_container;
/** Flow container that encapsulates the flow related data */
struct axis2_flow_container *flow_container;
/** Base description struct */
axis2_desc_t *base;
/* Mutex to avoid loading the same service dll twice */
axutil_thread_mutex_t *mutex;
};
AXIS2_EXTERN axis2_svc_t *AXIS2_CALL
axis2_svc_create(
const axutil_env_t * env)
{
axis2_svc_t *svc = NULL;
svc = (axis2_svc_t *) AXIS2_MALLOC(env->allocator, sizeof(axis2_svc_t));
if (!svc)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory");
return NULL;
}
svc->parent = NULL;
svc->axis_svc_name = NULL;
svc->filename = NULL;
svc->svc_desc = NULL;
svc->wsdl_path = NULL;
svc->folder_path = NULL;
svc->last_update = 0;
svc->param_container = NULL;
svc->flow_container = NULL;
svc->op_alias_map = NULL;
svc->op_action_map = NULL;
svc->op_rest_map = NULL;
svc->module_list = NULL;
svc->ns_map = NULL;
svc->ns_count = 0;
svc->schema_list = NULL;
svc->schema_mapping_table = NULL;
svc->schema_loc_adjusted = AXIS2_FALSE;
svc->custom_schema_name_prefix = NULL;
svc->custom_schema_name_suffix = NULL;
svc->schema_target_ns = NULL;
svc->schema_target_ns_prefix = NULL;
svc->target_ns = NULL;
svc->target_ns_prefix = NULL;
svc->sc_calc_count = 0;
svc->impl_class = NULL;
svc->qname = NULL;
svc->style = NULL;
svc->base = NULL;
svc->param_container = axutil_param_container_create(env);
if (!svc->param_container)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service param container creation failed");
return NULL;
}
svc->flow_container = axis2_flow_container_create(env);
if (!svc->flow_container)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service flow container creation failed");
return NULL;
}
svc->op_alias_map = axutil_hash_make(env);
if (!svc->op_alias_map)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service operation alias map creation failed");
return NULL;
}
svc->op_action_map = axutil_hash_make(env);
if (!svc->op_action_map)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service operation action map creation failed");
return NULL;
}
svc->op_rest_map = axutil_hash_make(env);
if (!svc->op_rest_map)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service operation rest map creation failed");
return NULL;
}
/** Create module list of default size */
svc->module_list = axutil_array_list_create(env, 0);
if (!svc->module_list)
{
axis2_svc_free(svc, env);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service module list creation failed");
return NULL;
}
svc->schema_list = axutil_array_list_create(env,
AXIS2_ARRAY_LIST_DEFAULT_CAPACITY);
if (!svc->schema_list)
{
axis2_svc_free(svc, env);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service schema list creation failed");
return NULL;
}
svc->engaged_module_list = axutil_array_list_create(env,
AXIS2_ARRAY_LIST_DEFAULT_CAPACITY);
if (!svc->engaged_module_list)
{
axis2_svc_free(svc, env);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service engaged modules list creation failed");
return NULL;
}
svc->schema_loc_adjusted = AXIS2_FALSE;
if (svc->schema_target_ns_prefix)
{
AXIS2_FREE(env->allocator, svc->schema_target_ns_prefix);
svc->schema_target_ns_prefix = NULL;
}
svc->schema_target_ns_prefix = axutil_strdup(env, "ns");
if (svc->target_ns)
{
AXIS2_FREE(env->allocator, svc->target_ns);
svc->target_ns = NULL;
}
svc->target_ns = axutil_strdup(env, "http://ws.apache.org/axis2");
if (svc->target_ns_prefix)
{
AXIS2_FREE(env->allocator, svc->target_ns_prefix);
svc->target_ns_prefix = NULL;
}
svc->target_ns_prefix = axutil_strdup(env, "tns");
svc->sc_calc_count = 0;
svc->base = axis2_desc_create(env);
if (!svc->base)
{
axis2_svc_free(svc, env);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Service base creation failed");
return NULL;
}
svc->mutex = axutil_thread_mutex_create(env->allocator, AXIS2_THREAD_MUTEX_DEFAULT);
if (!svc->mutex)
{
axis2_svc_free(svc, env);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Service mutex creation failed");
return NULL;
}
return svc;
}
AXIS2_EXTERN axis2_svc_t *AXIS2_CALL
axis2_svc_create_with_qname(
const axutil_env_t * env,
const axutil_qname_t * qname)
{
axis2_svc_t *svc = NULL;
axis2_status_t status = AXIS2_FAILURE;
AXIS2_PARAM_CHECK(env->error, qname, NULL);
svc = axis2_svc_create(env);
if (!svc)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Service creation failed for name %s",
axutil_qname_get_localpart(qname, env));
return NULL;
}
status = axis2_svc_set_qname(svc, env, qname);
if (AXIS2_FAILURE == status)
{
axis2_svc_free(svc, env);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Setting name %s to service failed",
axutil_qname_get_localpart(qname, env));
return NULL;
}
return svc;
}
AXIS2_EXTERN void AXIS2_CALL
axis2_svc_free(
axis2_svc_t * svc,
const axutil_env_t * env)
{
if (svc->impl_class)
{
AXIS2_SVC_SKELETON_FREE((axis2_svc_skeleton_t *) svc->impl_class, env);
}
if (svc->param_container)
{
axutil_param_container_free(svc->param_container, env);
}
if (svc->flow_container)
{
axis2_flow_container_free(svc->flow_container, env);
}
if (svc->filename)
{
AXIS2_FREE(env->allocator, svc->filename);
svc->filename = NULL;
}
if (svc->svc_desc)
{
AXIS2_FREE(env->allocator, svc->svc_desc);
svc->svc_desc = NULL;
}
svc->parent = NULL;
if (svc->module_list)
{
int i = 0;
int size = 0;
size = axutil_array_list_size(svc->module_list, env);
for (i = 0; i < size; i++)
{
axutil_qname_t *qname = NULL;
qname = axutil_array_list_get(svc->module_list, env, i);
if (qname)
{
axutil_qname_free(qname, env);
}
}
axutil_array_list_free(svc->module_list, env);
}
if (svc->schema_list)
{
axutil_array_list_free(svc->schema_list, env);
}
if (svc->engaged_module_list)
{
axutil_array_list_free(svc->engaged_module_list, env);
}
if (svc->axis_svc_name)
{
AXIS2_FREE(env->allocator, svc->axis_svc_name);
svc->axis_svc_name = NULL;
}
if (svc->op_alias_map)
{
axutil_hash_index_t *hi = NULL;
void *val = NULL;
for (hi = axutil_hash_first(svc->op_alias_map, env); hi;
hi = axutil_hash_next(env, hi))
{
axutil_hash_this(hi, NULL, NULL, &val);
if (val)
{
if (axis2_op_is_from_module((axis2_op_t *) val, env) ==
AXIS2_FALSE)
{
axis2_op_free((axis2_op_t *) val, env);
}
val = NULL;
}
}
axutil_hash_free(svc->op_alias_map, env);
}
if (svc->op_action_map)
{
axutil_hash_index_t *hi = NULL;
const void *key = NULL;
for (hi = axutil_hash_first(svc->op_action_map, env); hi;
hi = axutil_hash_next(env, hi))
{
axutil_hash_this(hi, &key, NULL, NULL);
if (key)
{
AXIS2_FREE(env->allocator, (axis2_char_t *) key);
key = NULL;
}
}
axutil_hash_free(svc->op_action_map, env);
}
if (svc->op_rest_map)
{
axis2_core_utils_free_rest_map(env, svc->op_rest_map);
}
if (svc->schema_target_ns_prefix)
{
AXIS2_FREE(env->allocator, svc->schema_target_ns_prefix);
svc->schema_target_ns_prefix = NULL;
}
if (svc->target_ns)
{
AXIS2_FREE(env->allocator, svc->target_ns);
svc->target_ns = NULL;
}
if (svc->wsdl_path)
{
AXIS2_FREE(env->allocator, svc->wsdl_path);
svc->wsdl_path = NULL;
}
if (svc->folder_path)
{
AXIS2_FREE(env->allocator, svc->folder_path);
svc->folder_path = NULL;
}
if (svc->target_ns_prefix)
{
AXIS2_FREE(env->allocator, svc->target_ns_prefix);
svc->target_ns_prefix = NULL;
}
if (svc->qname)
{
axutil_qname_free(svc->qname, env);
}
if (svc->style)
{
AXIS2_FREE(env->allocator, svc->style);
}
if (svc->base)
{
axis2_desc_free(svc->base, env);
}
if (svc->mutex)
{
axutil_thread_mutex_destroy(svc->mutex);
}
if (svc)
{
AXIS2_FREE(env->allocator, svc);
svc = NULL;
}
return;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_op(
axis2_svc_t * svc,
const axutil_env_t * env,
axis2_op_t * op)
{
axis2_status_t status = AXIS2_FAILURE;
axis2_msg_recv_t *msg_recv = NULL;
const axutil_qname_t *qname = NULL;
axis2_char_t *key = NULL;
const axis2_char_t *svcname = NULL;
axutil_array_list_t *mappings_list = NULL;
int size = 0;
int j = 0;
AXIS2_PARAM_CHECK(env->error, op, AXIS2_FAILURE);
svcname = axis2_svc_get_name(svc, env);
qname = axis2_op_get_qname(op, env);
if (qname)
key = axutil_qname_get_localpart(qname, env);
mappings_list = axis2_op_get_wsamapping_list(op, env);
/* Adding action mappings into service */
if (mappings_list)
size = axutil_array_list_size(mappings_list, env);
for (j = 0; j < size; j++)
{
axis2_char_t *mapping = NULL;
mapping =
(axis2_char_t *) axutil_array_list_get(mappings_list, env, j);
status = axis2_svc_add_mapping(svc, env, mapping, op);
if (AXIS2_SUCCESS != status)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Adding operation %s to service %s mapping list failed",
svcname, key);
return status;
}
}
status = axis2_op_set_parent(op, env, svc);
if (AXIS2_SUCCESS != status)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Setting service %s as operation %s parent failed", svcname, key);
return status;
}
msg_recv = axis2_op_get_msg_recv(op, env);
if (msg_recv == NULL)
{
msg_recv = axis2_desc_builder_load_default_msg_recv(env);
axis2_op_set_msg_recv(op, env, msg_recv);
}
if (key)
{
/* If service defines the operation, then we should not override with module level
* operation. Module operations are global. If any setting to be modified, those operations
* can be defined in service */
if(!axutil_hash_get(svc->op_alias_map, key, AXIS2_HASH_KEY_STRING))
{
axutil_hash_set(svc->op_alias_map, key, AXIS2_HASH_KEY_STRING, op);
}
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_op_t *AXIS2_CALL
axis2_svc_get_op_with_qname(
const axis2_svc_t * svc,
const axutil_env_t * env,
const axutil_qname_t * op_qname)
{
axis2_op_t *op = NULL;
axis2_char_t *nc_name = NULL;
axis2_char_t *nc_tmp = NULL;
/* This is just for the sake of comparison,
* and must not be used to change the passed value
*/
axis2_bool_t is_matched = AXIS2_FALSE;
AXIS2_PARAM_CHECK(env->error, op_qname, NULL);
nc_name = axutil_qname_get_localpart(op_qname, env);
nc_tmp = nc_name;
op = axutil_hash_get(svc->op_alias_map, nc_tmp, AXIS2_HASH_KEY_STRING);
if (op)
{
return op;
}
op = axutil_hash_get(svc->op_action_map, nc_tmp, AXIS2_HASH_KEY_STRING);
if (op)
{
return op;
}
if (*nc_tmp && svc->op_action_map)
{
axutil_hash_index_t *hi = NULL;
const void *key = NULL;
for (hi = axutil_hash_first(svc->op_action_map, env); hi;
hi = axutil_hash_next(env, hi))
{
axutil_hash_this(hi, &key, NULL, NULL);
nc_tmp = nc_name;
if (key)
{
axis2_char_t *search = NULL;
axis2_bool_t match_start = AXIS2_TRUE;
axis2_char_t *search_tmp = NULL;
search = (axis2_char_t *)key;
if (!axutil_strchr(search, '*'))
{
if (axutil_strstr(nc_tmp, search))
{
axis2_char_t *comp_tmp = NULL;
comp_tmp = axutil_strstr(nc_tmp, search);
if (strlen(comp_tmp) == strlen (search))
{
nc_tmp = (axis2_char_t *)key;
is_matched = AXIS2_TRUE;
break;
}
}
continue;
}
if (search[0] == '*')
{
search++;
if (!*search)
{
nc_tmp = (axis2_char_t *)key;
is_matched = AXIS2_TRUE;
break;
}
else if (axutil_strchr(search, '*'))
{
continue;
}
match_start = AXIS2_FALSE;
}
while (search && *search)
{
int length = 0;
axis2_char_t *loc_tmp = NULL;
if (search_tmp)
{
AXIS2_FREE(env->allocator, search_tmp);
search_tmp = NULL;
}
loc_tmp = axutil_strchr(search, '*');
if (loc_tmp && *loc_tmp)
{
if (!loc_tmp[1])
{
is_matched = AXIS2_TRUE;
break;
}
length = (int)(loc_tmp - search);
/* We are sure that the difference lies within the int range */
search_tmp = (axis2_char_t *) (AXIS2_MALLOC (env->allocator,
sizeof (axis2_char_t) * (length + 1)));
strncpy(search_tmp, search, length);
search_tmp[length] = '\0';
}
else if (axutil_strstr(nc_tmp, search))
{
axis2_char_t *comp_tmp = NULL;
comp_tmp = axutil_strstr(nc_tmp, search);
if (strlen(comp_tmp) == strlen (search))
{
nc_tmp = (axis2_char_t *)key;
is_matched = AXIS2_TRUE;
break;
}
break;
}
else
{
break;
}
if (search_tmp && axutil_strstr(nc_tmp, search_tmp))
{
if (match_start && !(axutil_strncmp(nc_tmp, search, length) == 0))
{
break;
}
else if (!match_start)
{
match_start = AXIS2_TRUE;
}
}
else
{
break;
}
search += axutil_strlen(search_tmp) + 1;
nc_tmp = axutil_strstr(nc_tmp, search_tmp) + axutil_strlen(search_tmp);
}
if (search_tmp)
{
AXIS2_FREE(env->allocator, search_tmp);
search_tmp = NULL;
}
if (is_matched || !*search)
{
nc_tmp = (axis2_char_t *)key;
is_matched = AXIS2_TRUE;
break;
}
}
}
}
if (!is_matched)
{
nc_tmp = nc_name;
}
op = axutil_hash_get(svc->op_alias_map, nc_tmp, AXIS2_HASH_KEY_STRING);
if (op)
{
return op;
}
return (axis2_op_t *)axutil_hash_get(svc->op_action_map, nc_tmp, AXIS2_HASH_KEY_STRING);
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_svc_get_rest_op_list_with_method_and_location(
const axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * method,
const axis2_char_t * location)
{
axutil_array_list_t *op_list = NULL;
axis2_char_t *key = NULL;
axis2_char_t *loc_str = NULL;
axis2_char_t *loc_str_tmp = NULL;
axis2_char_t *rindex = NULL;
int plen;
AXIS2_PARAM_CHECK(env->error, method, NULL);
AXIS2_PARAM_CHECK(env->error, location, NULL);
loc_str_tmp = (axis2_char_t *) location; /* Casted to facilitate loop */
if (loc_str_tmp[1] == '/')
{
loc_str_tmp++;
} /* ignore any '/' at the beginning */
if (strchr(loc_str_tmp, '?'))
{
axis2_char_t *temp = NULL;
temp = strchr(loc_str_tmp, '?');
temp[0] = '\0';
} /* ignore block after '?' */
do
{
axis2_char_t *temp = NULL;
temp = strchr(loc_str_tmp, '{');
if (temp)
{
loc_str_tmp = temp;
}
else
{
loc_str_tmp += strlen(loc_str_tmp);
break;
}
} while (loc_str_tmp[1] &&
loc_str_tmp[1] == '{');
loc_str = (axis2_char_t *) axutil_strmemdup(location, (loc_str_tmp - location), env);
rindex = axutil_rindex(loc_str, '/');
if (rindex && *rindex)
{
loc_str_tmp = axutil_string_substring_ending_at(loc_str, (int)(rindex - loc_str));
/* We are sure that the difference lies within the int range */
}
else
{
loc_str_tmp = loc_str;
}
plen = axutil_strlen (method) + axutil_strlen (loc_str_tmp) + 2;
key = (axis2_char_t *) (AXIS2_MALLOC (env->allocator,
sizeof (axis2_char_t) * plen));
sprintf (key, "%s:%s", method, loc_str_tmp);
AXIS2_FREE (env->allocator, loc_str);
op_list = (axutil_array_list_t *) axutil_hash_get(svc->op_rest_map,
key, AXIS2_HASH_KEY_STRING);
AXIS2_FREE (env->allocator, key);
return op_list;
}
AXIS2_EXTERN axis2_op_t *AXIS2_CALL
axis2_svc_get_op_with_name(
const axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * nc_name)
{
AXIS2_PARAM_CHECK(env->error, nc_name, NULL);
return (axis2_op_t *) axutil_hash_get(svc->op_alias_map, nc_name,
AXIS2_HASH_KEY_STRING);
}
AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
axis2_svc_get_all_ops(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->op_alias_map;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_parent(
axis2_svc_t * svc,
const axutil_env_t * env,
axis2_svc_grp_t * svc_grp)
{
AXIS2_PARAM_CHECK(env->error, svc_grp, AXIS2_FAILURE);
svc->parent = svc_grp;
if (svc_grp)
{
axis2_desc_set_parent(svc->base, env,
axis2_svc_grp_get_base(svc_grp, env));
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_svc_grp_t *AXIS2_CALL
axis2_svc_get_parent(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->parent;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_qname(
axis2_svc_t * svc,
const axutil_env_t * env,
const axutil_qname_t * qname)
{
AXIS2_PARAM_CHECK(env->error, qname, AXIS2_FAILURE);
if (svc->qname)
{
axutil_qname_free(svc->qname, env);
}
if (qname)
{
svc->qname = axutil_qname_clone((axutil_qname_t *) qname, env);
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axutil_qname_t *AXIS2_CALL
axis2_svc_get_qname(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->qname;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_param(
axis2_svc_t * svc,
const axutil_env_t * env,
axutil_param_t * param)
{
axis2_char_t *paramname = NULL;
const axis2_char_t *svcname = axis2_svc_get_name(svc, env);
AXIS2_PARAM_CHECK(env->error, param, AXIS2_FAILURE);
paramname = axutil_param_get_name(param, env);
if (axis2_svc_is_param_locked(svc, env, axutil_param_get_name(param, env)))
{
AXIS2_ERROR_SET(env->error,
AXIS2_ERROR_PARAMETER_LOCKED_CANNOT_OVERRIDE,
AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Parameter %s is locked for service %s", paramname, svcname);
return AXIS2_FAILURE;
}
return axutil_param_container_add_param(svc->param_container, env,
param);
}
AXIS2_EXTERN axutil_param_t *AXIS2_CALL
axis2_svc_get_param(
const axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * name)
{
axutil_param_t *param = NULL;
AXIS2_PARAM_CHECK(env->error, name, NULL);
param = axutil_param_container_get_param(svc->param_container, env, name);
if (!param && svc->parent)
{
param = axis2_svc_grp_get_param(svc->parent, env, name);
}
return param;
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_svc_get_all_params(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return axutil_param_container_get_params(svc->param_container, env);
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axis2_svc_is_param_locked(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * param_name)
{
axis2_bool_t locked = AXIS2_FALSE;
axutil_param_t *param = NULL;
axis2_svc_grp_t *parent = NULL;
axis2_bool_t ret = AXIS2_FALSE;
AXIS2_PARAM_CHECK(env->error, param_name, AXIS2_FALSE);
/* Checking the locked value of parent */
parent = axis2_svc_get_parent(svc, env);
if (parent)
locked = axis2_svc_grp_is_param_locked(parent, env, param_name);
if (parent && locked)
{
return AXIS2_TRUE;
}
param = axis2_svc_get_param(svc, env, param_name);
if (param)
{
ret = axutil_param_is_locked(param, env);
}
return ret;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_engage_module(
axis2_svc_t * svc,
const axutil_env_t * env,
axis2_module_desc_t * module_desc,
axis2_conf_t * conf)
{
axis2_phase_resolver_t *phase_resolver = NULL;
axis2_status_t status = AXIS2_FAILURE;
const axis2_char_t *svcname = NULL;
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Entry:axis2_svc_engage_module");
AXIS2_PARAM_CHECK(env->error, module_desc, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, conf, AXIS2_FAILURE);
svcname = axis2_svc_get_name(svc, env);
phase_resolver = axis2_phase_resolver_create_with_config(env, conf);
if (!phase_resolver)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Creating phase resolver failed for service %s", svcname);
return AXIS2_FAILURE;
}
status = axis2_phase_resolver_engage_module_to_svc(phase_resolver, env, svc, module_desc);
if (status)
{
const axutil_qname_t *qname = NULL;
status = axutil_array_list_add(svc->engaged_module_list, env, module_desc);
qname = axis2_module_desc_get_qname(module_desc, env);
axis2_svc_add_module_qname(svc, env, qname);
}
if (phase_resolver)
{
axis2_phase_resolver_free(phase_resolver, env);
}
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Exit:axis2_svc_engage_module");
return status;
}
AXIS2_EXTERN axis2_bool_t AXIS2_CALL
axis2_svc_is_module_engaged(
axis2_svc_t * svc,
const axutil_env_t * env,
axutil_qname_t * module_qname)
{
int i = 0,
size = 0;
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Entry:axis2_svc_is_module_engaged");
size = axutil_array_list_size(svc->engaged_module_list, env);
for (i = 0; i < size; i++)
{
const axutil_qname_t *module_qname_l = NULL;
axis2_module_desc_t *module_desc_l = NULL;
module_desc_l =
(axis2_module_desc_t *) axutil_array_list_get(svc->engaged_module_list,
env, i);
module_qname_l = axis2_module_desc_get_qname(module_desc_l, env);
if (axutil_qname_equals(module_qname, env, module_qname_l))
{
return AXIS2_TRUE;
}
}
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Exit:axis2_svc_is_module_engaged");
return AXIS2_FALSE;
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_svc_get_engaged_module_list(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->engaged_module_list;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_disengage_module(
axis2_svc_t * svc,
const axutil_env_t * env,
axis2_module_desc_t * module_desc,
axis2_conf_t * conf)
{
axis2_phase_resolver_t *phase_resolver = NULL;
axis2_status_t status = AXIS2_FAILURE;
const axis2_char_t *svcname = NULL;
AXIS2_PARAM_CHECK(env->error, module_desc, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, conf, AXIS2_FAILURE);
svcname = axis2_svc_get_name(svc, env);
phase_resolver = axis2_phase_resolver_create_with_config(env, conf);
if (!phase_resolver)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Creating phase resolver failed for service %s", svcname);
return AXIS2_FAILURE;
}
status =
axis2_phase_resolver_disengage_module_from_svc(phase_resolver, env, svc,
module_desc);
axis2_phase_resolver_free(phase_resolver, env);
return status;
}
/**
* Here we extract all operations defined in module.xml and built execution
* chains for them by calling axis2_phase_resolver_build_execution_chains_for_module_op()
* function. Within that function handlers of the modules defined for that
* operation are added to module operation chains appropriately.
*/
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_module_ops(
axis2_svc_t * svc,
const axutil_env_t * env,
axis2_module_desc_t * module_desc,
axis2_conf_t * conf)
{
axutil_hash_t *map = NULL;
axutil_hash_index_t *index = NULL;
axis2_phase_resolver_t *phase_resolver = NULL;
axis2_op_t *op_desc = NULL;
axis2_status_t status = AXIS2_FAILURE;
const axis2_char_t *svcname = NULL;
axis2_char_t *modname = NULL;
axis2_char_t *opname = NULL;
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Entry:axis2_svc_add_module_ops");
AXIS2_PARAM_CHECK(env->error, module_desc, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, conf, AXIS2_FAILURE);
svcname = axis2_svc_get_name(svc, env);
modname = axutil_qname_get_localpart(axis2_module_desc_get_qname(module_desc,
env), env);
map = axis2_module_desc_get_all_ops(module_desc, env);
phase_resolver = axis2_phase_resolver_create_with_config_and_svc(env, conf,
svc);
if (!phase_resolver)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Creating phase resolver failed for service %s", svcname);
return AXIS2_FAILURE;
}
for (index = axutil_hash_first(map, env); index; index =
axutil_hash_next(env, index))
{
void *v = NULL;
axutil_hash_this(index, NULL, NULL, &v);
op_desc = (axis2_op_t *) v;
opname = axutil_qname_get_localpart(axis2_op_get_qname(op_desc, env),
env);
status =
axis2_phase_resolver_build_execution_chains_for_module_op(phase_resolver, env, op_desc);
if (AXIS2_SUCCESS != status)
{
if (phase_resolver)
{
axis2_phase_resolver_free(phase_resolver, env);
}
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Builidng module operation %s failed for module %s", opname,
modname);
return status;
}
status = axis2_svc_add_op(svc, env, op_desc);
if (AXIS2_SUCCESS != status)
{
if (phase_resolver)
{
axis2_phase_resolver_free(phase_resolver, env);
}
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Adding operation %s to service %s failed", opname, svcname);
return status;
}
}
if (phase_resolver)
{
axis2_phase_resolver_free(phase_resolver, env);
}
AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Exit:axis2_svc_add_module_ops");
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_name(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
if (svc->qname)
{
return axutil_qname_get_localpart(svc->qname, env);
}
return NULL;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_name(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * axis_svc_name)
{
AXIS2_PARAM_CHECK(env->error, axis_svc_name, AXIS2_FAILURE);
if (svc->axis_svc_name)
{
AXIS2_FREE(env->allocator, svc->axis_svc_name);
svc->axis_svc_name = NULL;
}
svc->axis_svc_name = axutil_strdup(env, axis_svc_name);
if (!svc->axis_svc_name)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory");
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_last_update(
axis2_svc_t * svc,
const axutil_env_t * env)
{
return AXIS2_SUCCESS;
}
AXIS2_EXTERN long AXIS2_CALL
axis2_svc_get_last_update(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->last_update;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_file_name(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->filename;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_file_name(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * filename)
{
AXIS2_PARAM_CHECK(env->error, filename, AXIS2_FAILURE);
if (svc->filename)
{
AXIS2_FREE(env->allocator, svc->filename);
svc->filename = NULL;
}
svc->filename = (axis2_char_t *) axutil_strdup(env, filename);
if (!svc->filename)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory");
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_svc_desc(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->svc_desc;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_svc_desc(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * svc_desc)
{
AXIS2_PARAM_CHECK(env->error, svc_desc, AXIS2_FAILURE);
if (svc->svc_desc)
{
AXIS2_FREE(env->allocator, svc->svc_desc);
svc->svc_desc = NULL;
}
svc->svc_desc = (axis2_char_t *) axutil_strdup(env, svc_desc);
if (!svc->svc_desc)
{
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory");
return AXIS2_FAILURE;
}
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_mapping(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * mapping_key,
axis2_op_t * op_desc)
{
AXIS2_PARAM_CHECK(env->error, mapping_key, AXIS2_FAILURE);
AXIS2_PARAM_CHECK(env->error, op_desc, AXIS2_FAILURE);
axutil_hash_set(svc->op_action_map, axutil_strdup(env, mapping_key),
AXIS2_HASH_KEY_STRING, op_desc);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_rest_mapping(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * method,
const axis2_char_t * location,
axis2_op_t * op_desc)
{
axis2_char_t *mapping_url = NULL;
int key_len = 0;
axis2_char_t* question_char = NULL;
axis2_char_t* local_location_str = NULL;
axis2_status_t status = AXIS2_SUCCESS;
local_location_str = (axis2_char_t *) location; /* Casted to facilitate loop */
/* skip the beginning '/' */
if(*local_location_str == '/')
{
local_location_str ++;
}
question_char = axutil_strchr(local_location_str, '?');
if(question_char)
{
*question_char = '\0';
}
key_len = axutil_strlen(method) + axutil_strlen(local_location_str) + 2;
mapping_url = (axis2_char_t *) (AXIS2_MALLOC (env->allocator,
sizeof (axis2_char_t) * key_len));
if(!mapping_url) {
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"No memory. Cannot create the rest mapping url");
return AXIS2_FAILURE;
}
sprintf(mapping_url, "%s:%s", method, local_location_str);
status = axis2_core_utils_prepare_rest_mapping(env,
mapping_url,
svc->op_rest_map,
op_desc);
if(mapping_url) {
AXIS2_FREE(env->allocator, mapping_url);
}
/* restore the question character */
if(question_char) {
*question_char = '?';
}
return status;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_add_module_qname(
axis2_svc_t * svc,
const axutil_env_t * env,
const axutil_qname_t * module_qname)
{
axutil_qname_t *qmodule_qname_l = NULL;
AXIS2_PARAM_CHECK(env->error, module_qname, AXIS2_FAILURE);
qmodule_qname_l = axutil_qname_clone((axutil_qname_t *) module_qname, env);
return axutil_array_list_add(svc->module_list, env, qmodule_qname_l);
}
AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL
axis2_svc_get_all_module_qnames(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->module_list;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_target_ns(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->target_ns;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_target_ns(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * ns)
{
AXIS2_PARAM_CHECK(env->error, ns, AXIS2_FAILURE);
if (svc->target_ns)
{
AXIS2_FREE(env->allocator, svc->target_ns);
svc->target_ns = NULL;
}
svc->target_ns = axutil_strdup(env, ns);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_target_ns_prefix(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->target_ns_prefix;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_target_ns_prefix(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * prefix)
{
AXIS2_PARAM_CHECK(env->error, prefix, AXIS2_FAILURE);
if (svc->target_ns_prefix)
{
AXIS2_FREE(env->allocator, svc->target_ns_prefix);
svc->target_ns_prefix = NULL;
}
svc->target_ns_prefix = axutil_strdup(env, prefix);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
axis2_svc_get_ns_map(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->ns_map;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_ns_map(
axis2_svc_t * svc,
const axutil_env_t * env,
axutil_hash_t * ns_map)
{
axutil_hash_index_t *hi = NULL;
AXIS2_PARAM_CHECK(env->error, ns_map, AXIS2_FAILURE);
if (svc->ns_map)
{
for (hi = axutil_hash_first(svc->ns_map, env); hi;
hi = axutil_hash_next(env, hi))
{
void *value = NULL;
void *key = NULL;
axutil_hash_this(hi, (const void **) &key, NULL, (void **) &value);
if (key)
{
AXIS2_FREE(env->allocator, key);
key = NULL;
}
if (value)
{
AXIS2_FREE(env->allocator, value);
value = NULL;
}
}
axutil_hash_free(svc->ns_map, env);
}
svc->ns_map = ns_map;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
axis2_svc_swap_mapping_table(
axis2_svc_t * svc,
const axutil_env_t * env,
axutil_hash_t * orig_table)
{
axutil_hash_t *new_table = NULL;
axutil_hash_index_t *hi = NULL;
AXIS2_PARAM_CHECK(env->error, orig_table, NULL);
new_table = axutil_hash_make(env);
for (hi = axutil_hash_first(orig_table, env); env;
hi = axutil_hash_next(env, hi))
{
void *value = NULL;
void *key = NULL;
axutil_hash_this(hi, (const void **) &key, NULL, (void **) &value);
axutil_hash_set(new_table, value, AXIS2_HASH_KEY_STRING, key);
}
return new_table;
}
AXIS2_EXTERN void *AXIS2_CALL
axis2_svc_get_impl_class(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->impl_class;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_impl_class(
axis2_svc_t * svc,
const axutil_env_t * env,
void *impl_class)
{
svc->impl_class = impl_class;
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axutil_param_container_t *AXIS2_CALL
axis2_svc_get_param_container(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->param_container;
}
AXIS2_EXTERN axis2_flow_container_t *AXIS2_CALL
axis2_svc_get_flow_container(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->flow_container;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_svc_wsdl_path(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->wsdl_path;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_svc_wsdl_path(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * wsdl_path)
{
AXIS2_PARAM_CHECK(env->error, wsdl_path, AXIS2_FAILURE);
svc->wsdl_path = (axis2_char_t *) axutil_strdup(env, wsdl_path);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN const axis2_char_t *AXIS2_CALL
axis2_svc_get_svc_folder_path(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->folder_path;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_svc_set_svc_folder_path(
axis2_svc_t * svc,
const axutil_env_t * env,
const axis2_char_t * folder_path)
{
AXIS2_PARAM_CHECK(env->error, folder_path, AXIS2_FAILURE);
svc->folder_path = (axis2_char_t *) axutil_strdup(env, folder_path);
return AXIS2_SUCCESS;
}
AXIS2_EXTERN axis2_desc_t *AXIS2_CALL
axis2_svc_get_base(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->base;
}
AXIS2_EXTERN axutil_thread_mutex_t * AXIS2_CALL
axis2_svc_get_mutex(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->mutex;
}
AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
axis2_svc_get_rest_map(
const axis2_svc_t * svc,
const axutil_env_t * env)
{
return svc->op_rest_map;
}