/* * 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 #include #include struct axis2_repos_listener { /** * Referance to a ws info list */ axis2_ws_info_list_t *info_list; /** * The parent directory of the modules and services directories * that the listener should listen */ axis2_char_t *folder_name; axis2_conf_t *conf; }; static axis2_status_t axis2_repos_listener_search( axis2_repos_listener_t * repos_listener, const axutil_env_t * env, axis2_char_t * folder_name, int type); AXIS2_EXTERN axis2_repos_listener_t *AXIS2_CALL axis2_repos_listener_create( const axutil_env_t * env) { axis2_repos_listener_t *repos_listener = NULL; repos_listener = (axis2_repos_listener_t *)AXIS2_MALLOC(env->allocator, sizeof(axis2_repos_listener_t)); if(!repos_listener) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return NULL; } repos_listener->folder_name = NULL; repos_listener->info_list = NULL; repos_listener->folder_name = AXIS2_FALSE; return repos_listener; } /** * This constructor take two argumnets, folder name and referance to * deployment engine. Fisrt it initilize the sysetm , by loading all the * modules in the /modules directory and also create a ws info list to * keep info about available modules and services. * @param folderName path to parent directory that the repos_listener * should listens * @param deploy_engine refearnce to engine registry inorder to * inform the updates */ AXIS2_EXTERN axis2_repos_listener_t *AXIS2_CALL axis2_repos_listener_create_with_folder_name_and_dep_engine( const axutil_env_t * env, axis2_char_t * folder_name, axis2_dep_engine_t * dep_engine) { axis2_repos_listener_t *repos_listener = NULL; axis2_status_t status = AXIS2_FAILURE; axis2_conf_t *conf; axis2_bool_t file_flag; repos_listener = (axis2_repos_listener_t *)axis2_repos_listener_create(env); if(!repos_listener) { return NULL; } file_flag = axis2_dep_engine_get_file_flag(dep_engine, env); if(!file_flag) { repos_listener->folder_name = axutil_strdup(env, folder_name); if(!repos_listener->folder_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); return NULL; } } repos_listener->info_list = axis2_ws_info_list_create_with_dep_engine(env, dep_engine); if(!repos_listener->info_list) { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Creating ws info list failed"); return NULL; } /* Here dep_engine's conf will set to repo_listner. Then we could get * details of the axis2.xml through axis2 configuration. */ conf = axis2_dep_engine_get_axis_conf(dep_engine, env); if(!conf) { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Deployment engines axis2 configuration not available"); return NULL; } axis2_repos_listener_set_conf(repos_listener, env, conf); status = axis2_repos_listener_init(repos_listener, env); if(AXIS2_SUCCESS != status) { axis2_repos_listener_free(repos_listener, env); AXIS2_ERROR_SET(env->error, AXIS2_ERROR_REPOS_LISTENER_INIT_FAILED, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Repository listener initialization failed"); return NULL; } return repos_listener; } AXIS2_EXTERN void AXIS2_CALL axis2_repos_listener_free( axis2_repos_listener_t * repos_listener, const axutil_env_t * env) { if(!repos_listener) return; if(repos_listener->folder_name) { AXIS2_FREE(env->allocator, repos_listener->folder_name); } if(repos_listener->info_list) { axis2_ws_info_list_free(repos_listener->info_list, env); } AXIS2_FREE(env->allocator, repos_listener); return; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_repos_listener_check_modules( axis2_repos_listener_t * repos_listener, const axutil_env_t * env) { axis2_char_t *module_path = NULL; axis2_char_t *temp_path = NULL; axis2_status_t status = AXIS2_FAILURE; axis2_bool_t axis2_flag = AXIS2_FALSE; axis2_conf_t *conf; axutil_param_t *module_param; axis2_char_t *module_dir; AXIS2_PARAM_CHECK(env->error, repos_listener, AXIS2_FAILURE); conf = axis2_repos_listener_get_conf(repos_listener, env); /* Configuration is needed only to decide we are using axis2.xml. Other * case we don't need. Hence even if conf is NULL we can continue. */ if(conf) { axis2_flag = axis2_conf_get_axis2_flag(conf, env); } if(!axis2_flag) { temp_path = axutil_stracat(env, repos_listener->folder_name, AXIS2_PATH_SEP_STR); module_path = axutil_stracat(env, temp_path, AXIS2_MODULE_PATH); AXIS2_FREE(env->allocator, temp_path); } else { module_param = axis2_conf_get_param(conf, env, AXIS2_MODULE_DIR); if(module_param) { module_dir = (axis2_char_t *)axutil_param_get_value(module_param, env); module_path = axutil_strdup(env, module_dir); } else { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "While creating axis2 configuration using " "axis2.xml, modulesDir parameter not available."); } } status = axis2_repos_listener_search(repos_listener, env, module_path, AXIS2_MODULE); AXIS2_FREE(env->allocator, module_path); return status; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_repos_listener_check_svcs( axis2_repos_listener_t * repos_listener, const axutil_env_t * env) { axis2_char_t *svc_path = NULL; axis2_char_t *temp_path = NULL; axis2_status_t status = AXIS2_FAILURE; axis2_conf_t *conf; axis2_bool_t axis2_flag = AXIS2_FALSE; axutil_param_t *svc_param; axis2_char_t *svc_dir; AXIS2_PARAM_CHECK(env->error, repos_listener, AXIS2_FAILURE); conf = axis2_repos_listener_get_conf(repos_listener, env); if(conf) axis2_flag = axis2_conf_get_axis2_flag(conf, env); if(!axis2_flag) { temp_path = axutil_stracat(env, repos_listener->folder_name, AXIS2_PATH_SEP_STR); svc_path = axutil_stracat(env, temp_path, AXIS2_SVC_PATH); AXIS2_FREE(env->allocator, temp_path); } else { svc_param = axis2_conf_get_param(conf, env, AXIS2_SERVICE_DIR); if(svc_param) { svc_dir = axutil_param_get_value(svc_param, env); svc_path = axutil_strdup(env, svc_dir); } else { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "While creating axis2 configuration using axis2.xml, servicesDir" " parameter not available."); } } status = axis2_repos_listener_search(repos_listener, env, svc_path, AXIS2_SVC); AXIS2_FREE(env->allocator, svc_path); return status; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_repos_listener_update( axis2_repos_listener_t * repos_listener, const axutil_env_t * env) { AXIS2_PARAM_CHECK(env->error, repos_listener, AXIS2_FAILURE); return axis2_ws_info_list_update(repos_listener->info_list, env); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_repos_listener_init( axis2_repos_listener_t * repos_listener, const axutil_env_t * env) { axis2_status_t status = AXIS2_FAILURE; AXIS2_PARAM_CHECK(env->error, repos_listener, AXIS2_FAILURE); status = axis2_ws_info_list_init(repos_listener->info_list, env); if(AXIS2_SUCCESS != status) { return status; } /* if check_modules return AXIS2_FAILURE that means * there are no modules to load */ axis2_repos_listener_check_modules(repos_listener, env); /* if check_svcs return AXIS2_FAILURE that means * there are no services to load */ axis2_repos_listener_check_svcs(repos_listener, env); return axis2_repos_listener_update(repos_listener, env); } /** * Folder name could be a repository modules or services folder. If it is modules * folder then current_info_list contain the list of axis2 files corresponding to * the modules within it. For services folder it should be understood similarly. */ static axis2_status_t axis2_repos_listener_search( axis2_repos_listener_t * repos_listener, const axutil_env_t * env, axis2_char_t * folder_name, int type) { int size = 0; int i = 0; axutil_array_list_t *current_info_list = NULL; axis2_status_t status = AXIS2_FAILURE; AXIS2_PARAM_CHECK(env->error, repos_listener, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, folder_name, AXIS2_FAILURE); current_info_list = axutil_dir_handler_list_service_or_module_dirs(env, folder_name); if(!current_info_list) { axis2_status_t status_code = AXIS2_FAILURE; status_code = AXIS2_ERROR_GET_STATUS_CODE(env->error); if(AXIS2_SUCCESS != status) { return status; } AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "No %s in the folder.", folder_name); return AXIS2_SUCCESS; } size = axutil_array_list_size(current_info_list, env); for(i = 0; i < size; i++) /* Loop until empty */ { axutil_file_t *file = NULL; file = axutil_array_list_get(current_info_list, env, i); status = axis2_ws_info_list_add_ws_info_item(repos_listener->info_list, env, file, type); if(AXIS2_SUCCESS != status) { int size_j = 0; int j = 0; axis2_char_t* file_name = axutil_file_get_name(file, env); size_j = axutil_array_list_size(current_info_list, env); for(j = 0; j < size_j; j++) { axutil_file_t *del_file = NULL; del_file = axutil_array_list_get(current_info_list, env, j); axutil_file_free(del_file, env); } axutil_array_list_free(current_info_list, env); current_info_list = NULL; AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Adding file %s to ws info list failed", file_name); return status; } } for(i = 0; i < size; i++) { axutil_file_t *del_file = NULL; del_file = axutil_array_list_get(current_info_list, env, i); axutil_file_free(del_file, env); } axutil_array_list_free(current_info_list, env); current_info_list = NULL; return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_repos_listener_set_conf( axis2_repos_listener_t *repo_listener, const axutil_env_t * env, axis2_conf_t *conf) { AXIS2_PARAM_CHECK(env->error, repo_listener, AXIS2_FAILURE); AXIS2_PARAM_CHECK(env->error, conf, AXIS2_FAILURE); repo_listener->conf = conf; return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_conf_t *AXIS2_CALL axis2_repos_listener_get_conf( axis2_repos_listener_t *repo_listener, const axutil_env_t * env) { AXIS2_PARAM_CHECK(env->error, repo_listener, NULL); return repo_listener->conf; }