Author: damitha Date: Sun Jun 10 22:34:45 2007 New Revision: 546019 URL: http://svn.apache.org/viewvc?view=rev&rev=546019 Log: I have implemented the functionlity for initiliasing services at the load time of the axis2c engine.
Modified: webservices/axis2/trunk/c/include/axis2_conf.h webservices/axis2/trunk/c/src/core/deployment/conf_init.c webservices/axis2/trunk/c/src/core/engine/conf.c Modified: webservices/axis2/trunk/c/include/axis2_conf.h URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/include/axis2_conf.h?view=diff&rev=546019&r1=546018&r2=546019 ============================================================================== --- webservices/axis2/trunk/c/include/axis2_conf.h (original) +++ webservices/axis2/trunk/c/include/axis2_conf.h Sun Jun 10 22:34:45 2007 @@ -382,6 +382,19 @@ axis2_conf_get_all_svcs(const axis2_conf_t *conf, const axutil_env_t *env); + /** + * Gets all the list of services that need to be loaded into configuration + * at the start up of the axis2 engine. + * @param conf pointer to conf struct + * @param env pointer to environment struct + * @return a pointer to the hash table of services. Returns a + * reference, not a cloned copy + */ + AXIS2_EXTERN axutil_hash_t *AXIS2_CALL + axis2_conf_get_all_init_svcs( + const axis2_conf_t *conf, + const axutil_env_t *env); + /** * Checks is the named module is engaged. * @param conf pointer to conf struct Modified: webservices/axis2/trunk/c/src/core/deployment/conf_init.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/deployment/conf_init.c?view=diff&rev=546019&r1=546018&r2=546019 ============================================================================== --- webservices/axis2/trunk/c/src/core/deployment/conf_init.c (original) +++ webservices/axis2/trunk/c/src/core/deployment/conf_init.c Sun Jun 10 22:34:45 2007 @@ -21,6 +21,7 @@ #include <axis2_const.h> #include <axutil_error.h> #include <axutil_allocator.h> +#include <axutil_class_loader.h> #include <axis2_dep_engine.h> #include <axis2_module.h> @@ -28,6 +29,11 @@ axis2_init_modules(const axutil_env_t *env, axis2_conf_ctx_t *conf_ctx); +static axis2_status_t AXIS2_CALL +axis2_init_services( + const axutil_env_t *env, + axis2_conf_ctx_t *conf_ctx); + axis2_status_t AXIS2_CALL axis2_init_transports(const axutil_env_t *env, axis2_conf_ctx_t *conf_ctx); @@ -67,6 +73,7 @@ axis2_phase_resolver_build_chains(phase_resolver, env); axis2_init_modules(env, conf_ctx); + axis2_init_services(env, conf_ctx); axis2_init_transports(env, conf_ctx); axis2_phase_resolver_free(phase_resolver, env); @@ -113,6 +120,7 @@ axis2_phase_resolver_build_chains(phase_resolver, env); axis2_init_modules(env, conf_ctx); + axis2_init_services(env, conf_ctx); axis2_init_transports(env, conf_ctx); axis2_phase_resolver_free(phase_resolver, env); @@ -152,6 +160,60 @@ { AXIS2_MODULE_INIT(mod, env, conf_ctx, mod_desc); } + } + } + } + } + status = AXIS2_SUCCESS; + } + + return status; +} + +static axis2_status_t AXIS2_CALL +axis2_init_services( + const axutil_env_t *env, + axis2_conf_ctx_t *conf_ctx) +{ + axis2_conf_t *conf = NULL; + axis2_status_t status = AXIS2_FAILURE; + + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + AXIS2_PARAM_CHECK(env->error, conf_ctx, AXIS2_FAILURE); + + conf = axis2_conf_ctx_get_conf(conf_ctx, env); + if (conf) + { + axutil_hash_t *svc_map = axis2_conf_get_all_init_svcs(conf, env); + if (svc_map) + { + axutil_hash_index_t *hi = NULL; + void *svc = NULL; + for (hi = axutil_hash_first(svc_map, env); + hi; hi = axutil_hash_next(env, hi)) + { + axutil_hash_this(hi, NULL, NULL, &svc); + if (svc) + { + axis2_svc_t *svc_desc = (axis2_svc_t*)svc; + if (svc_desc) + { + axutil_param_t *impl_info_param = NULL; + void *impl_class = NULL; + impl_info_param = axis2_svc_get_param(svc_desc, env, + AXIS2_SERVICE_CLASS); + if (!impl_info_param) + { + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_STATE_SVC, + AXIS2_FAILURE); + return AXIS2_FAILURE; + } + axutil_allocator_switch_to_global_pool(env->allocator); + axutil_class_loader_init(env); + impl_class = axutil_class_loader_create_dll(env, impl_info_param); + axis2_svc_set_impl_class(svc_desc, env, impl_class); + AXIS2_SVC_SKELETON_INIT((axis2_svc_skeleton_t *)impl_class, env); + axutil_allocator_switch_to_local_pool(env->allocator); } } } Modified: webservices/axis2/trunk/c/src/core/engine/conf.c URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/src/core/engine/conf.c?view=diff&rev=546019&r1=546018&r2=546019 ============================================================================== --- webservices/axis2/trunk/c/src/core/engine/conf.c (original) +++ webservices/axis2/trunk/c/src/core/engine/conf.c Sun Jun 10 22:34:45 2007 @@ -44,6 +44,7 @@ axutil_array_list_t *in_phases_upto_and_including_post_dispatch; axis2_phases_info_t *phases_info; axutil_hash_t *all_svcs; + axutil_hash_t *all_init_svcs; axutil_hash_t *msg_recvs; axutil_hash_t *faulty_svcs; axutil_hash_t *faulty_modules; @@ -91,6 +92,7 @@ conf->out_fault_phases = NULL; conf->phases_info = NULL; conf->all_svcs = NULL; + conf->all_init_svcs = NULL; conf->msg_recvs = NULL; conf->faulty_svcs = NULL; conf->faulty_modules = NULL; @@ -221,6 +223,14 @@ return NULL; } + conf->all_init_svcs = axutil_hash_make(env); + if (! conf->all_init_svcs) + { + axis2_conf_free(conf, env); + AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); + return NULL; + } + conf->msg_recvs = axutil_hash_make(env); if (! conf->msg_recvs) { @@ -432,6 +442,11 @@ { axutil_hash_free(conf->all_svcs, env); } + + if (conf->all_init_svcs) + { + axutil_hash_free(conf->all_init_svcs, env); + } if (conf->msg_recvs) { @@ -963,6 +978,51 @@ index_i = axutil_hash_next(env, index_i); } return conf->all_svcs; +} + +AXIS2_EXTERN axutil_hash_t *AXIS2_CALL +axis2_conf_get_all_init_svcs( + const axis2_conf_t *conf, + const axutil_env_t *env) +{ + axutil_hash_t *sgs = NULL; + axutil_hash_index_t *index_i = NULL; + axutil_hash_index_t *index_j = NULL; + void *value = NULL; + void *value2 = NULL; + axis2_svc_grp_t *axis_svc_grp = NULL; + axutil_hash_t *svcs = NULL; + axis2_svc_t *svc = NULL; + axis2_char_t *svc_name = NULL; + + AXIS2_ENV_CHECK(env, NULL); + + sgs = axis2_conf_get_all_svc_grps(conf, env); + index_i = axutil_hash_first(sgs, env); + while (index_i) + { + axutil_hash_this(index_i, NULL, NULL, &value); + axis_svc_grp = (axis2_svc_grp_t *) value; + svcs = axis2_svc_grp_get_all_svcs(axis_svc_grp, env); + index_j = axutil_hash_first(svcs, env); + while (index_j) + { + axutil_param_t *param = NULL; + axutil_hash_this(index_j, NULL, NULL, &value2); + svc = (axis2_svc_t *) value2; + svc_name = + axutil_qname_get_localpart(axis2_svc_get_qname(svc, env), env); + param = axis2_svc_get_param(svc, env, "Axis2InitService"); + if(param) + axutil_hash_set(conf->all_init_svcs, svc_name, + AXIS2_HASH_KEY_STRING, svc); + + index_j = axutil_hash_next(env, index_j); + } + + index_i = axutil_hash_next(env, index_i); + } + return conf->all_init_svcs; } AXIS2_EXTERN axis2_bool_t AXIS2_CALL --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]