| /* |
| * 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_msg_info_headers.h> |
| #include <axis2_options.h> |
| #include <axis2_engine.h> |
| #include <axis2_core_utils.h> |
| #include <axis2_endpoint_ref.h> |
| #include <axis2_svc_client.h> |
| #include <axis2_addr.h> |
| #include <platforms/axutil_platform_auto_sense.h> |
| #include <axiom_soap.h> |
| #include <axiom_soap_const.h> |
| #include <axiom_soap_envelope.h> |
| #include <axiom_element.h> |
| #include <axiom_node.h> |
| |
| #include <savan_util.h> |
| #include <savan_msg_recv.h> |
| #include <savan_error.h> |
| #include <savan_storage_mgr.h> |
| |
| axis2_status_t AXIS2_CALL |
| savan_util_create_fault_envelope( |
| axis2_msg_ctx_t *msg_ctx, |
| const axutil_env_t *env, |
| axis2_char_t *code, |
| axis2_char_t *subcode, |
| axis2_char_t *reason, |
| axis2_char_t *detail) |
| { |
| |
| axiom_soap_envelope_t *envelope = NULL; |
| /*axiom_node_t* detail_om_node = NULL; |
| axiom_element_t * detail_om_ele = NULL; |
| axis2_msg_info_headers_t* info_header = NULL; |
| int soap_version = AXIOM_SOAP12; |
| axutil_array_list_t *sub_codes = NULL; |
| axiom_namespace_t *soap_ns = NULL; |
| axiom_namespace_t *ns1 = NULL;*/ |
| axiom_soap_body_t *body = NULL; |
| axiom_node_t *body_node = NULL; |
| axiom_node_t *fault_node = NULL; |
| |
| envelope = axiom_soap_envelope_create_default_soap_envelope(env, |
| AXIOM_SOAP12); |
| |
| /*info_header = axis2_msg_ctx_get_msg_info_headers(msg_ctx, env); |
| axis2_msg_info_headers_set_action(info_header, env, SAVAN_ACTIONS_FAULT); |
| |
| axis2_msg_ctx_set_msg_info_headers(msg_ctx, env, info_header);*/ |
| |
| body = axiom_soap_envelope_get_body(envelope, env); |
| body_node = axiom_soap_body_get_base_node(body, env); |
| |
| fault_node = savan_util_build_fault_msg(env, code, subcode, reason, detail); |
| |
| axiom_node_add_child(body_node , env, fault_node); |
| axis2_msg_ctx_set_fault_soap_envelope(msg_ctx, env, envelope); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| axiom_node_t * AXIS2_CALL |
| savan_util_build_fault_msg( |
| const axutil_env_t *env, |
| axis2_char_t * code, |
| axis2_char_t * subcode, |
| axis2_char_t * reason, |
| axis2_char_t * detail) |
| { |
| axiom_node_t *fault_node = NULL; |
| axiom_element_t *fault_ele = NULL; |
| axiom_node_t *code_node = NULL; |
| axiom_element_t *code_ele = NULL; |
| axiom_node_t *code_value_node = NULL; |
| axiom_element_t *code_value_ele = NULL; |
| axiom_node_t *sub_code_node = NULL; |
| axiom_element_t *sub_code_ele = NULL; |
| axiom_node_t *sub_code_value_node = NULL; |
| axiom_element_t *sub_code_value_ele = NULL; |
| axiom_node_t *reason_node = NULL; |
| axiom_element_t *reason_ele = NULL; |
| axiom_node_t *reason_text_node = NULL; |
| axiom_element_t *reason_text_ele = NULL; |
| axiom_node_t *detail_node = NULL; |
| axiom_element_t *detail_ele = NULL; |
| |
| fault_ele = axiom_element_create(env, NULL, "Fault", NULL, &fault_node); |
| |
| code_ele = axiom_element_create(env, fault_node, "Code", NULL, &code_node); |
| code_value_ele = axiom_element_create(env, code_node, "Value", NULL, &code_value_node); |
| axiom_element_set_text(code_value_ele, env, code, code_value_node); |
| sub_code_ele = axiom_element_create(env, code_node, "Subcode", NULL, &sub_code_node); |
| sub_code_value_ele = axiom_element_create(env, sub_code_node, "Value", NULL, |
| &sub_code_value_node); |
| |
| axiom_element_set_text(sub_code_value_ele, env, subcode, sub_code_value_node); |
| reason_ele = axiom_element_create(env, fault_node, "Reason", NULL, &reason_node); |
| reason_text_ele = axiom_element_create(env, reason_node, "Text", NULL, &reason_text_node); |
| axiom_element_set_text(reason_text_ele, env, reason, reason_text_node); |
| detail_ele = axiom_element_create(env, fault_node, "Detail", NULL, &detail_node); |
| axiom_element_set_text(detail_ele, env, detail, detail_node); |
| |
| return fault_node; |
| } |
| |
| savan_message_types_t AXIS2_CALL |
| savan_util_get_message_type( |
| axis2_msg_ctx_t *msg_ctx, |
| const axutil_env_t *env) |
| { |
| const axis2_char_t *action = NULL; |
| axis2_msg_info_headers_t *info_header = NULL; |
| |
| info_header = axis2_msg_ctx_get_msg_info_headers(msg_ctx, env); |
| if (!info_header) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Cannot extract message info headers"); |
| return SAVAN_MSG_TYPE_UNKNOWN; |
| } |
| |
| action = axis2_msg_info_headers_get_action(info_header, env); |
| if( ! action) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Cannot extract soap action"); |
| AXIS2_ERROR_SET(env->error, SAVAN_ERROR_SOAP_ACTION_NULL, AXIS2_FAILURE); |
| return SAVAN_MSG_TYPE_UNKNOWN; |
| } |
| |
| if (axutil_strcmp(action, SAVAN_ACTIONS_SUB) == 0) |
| return SAVAN_MSG_TYPE_SUB; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_SUB_RESPONSE) == 0) |
| return SAVAN_MSG_TYPE_SUB_RESPONSE; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_UNSUB) == 0) |
| return SAVAN_MSG_TYPE_UNSUB; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_UNSUB_RESPONSE) == 0) |
| return SAVAN_MSG_TYPE_UNSUB_RESPONSE; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_GET_STATUS) == 0) |
| return SAVAN_MSG_TYPE_GET_STATUS; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_GET_STATUS_RESPONSE) == 0) |
| return SAVAN_MSG_TYPE_GET_STATUS_RESPONSE; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_RENEW) == 0) |
| return SAVAN_MSG_TYPE_RENEW; |
| else if (axutil_strcmp(action, SAVAN_ACTIONS_RENEW_RESPONSE) == 0) |
| return SAVAN_MSG_TYPE_RENEW_RESPONSE; |
| |
| return SAVAN_MSG_TYPE_UNKNOWN; |
| } |
| |
| axis2_char_t * AXIS2_CALL |
| savan_util_get_subscription_id_from_msg( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx) |
| { |
| axis2_char_t *sub_id = NULL; |
| axiom_soap_envelope_t *envelope = NULL; |
| axiom_soap_header_t *header = NULL; |
| axutil_qname_t *qname = NULL; |
| axiom_node_t *header_node = NULL; |
| axiom_node_t *id_node = NULL; |
| axiom_element_t *header_elem = NULL; |
| axiom_element_t *id_elem = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, |
| "[savan] Entry:savan_util_get_subscription_id_from_msg"); |
| |
| /* Get soap envelop and extract the subscription id */ |
| |
| envelope = axis2_msg_ctx_get_soap_envelope(msg_ctx, env); |
| if (!envelope) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to extract the soap envelop"); |
| return NULL; |
| } |
| |
| header = axiom_soap_envelope_get_header(envelope, env); |
| if (!header) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, |
| "[savan] Failed to extract the soap header"); |
| return NULL; |
| } |
| |
| /* Get header element from header node */ |
| header_node = axiom_soap_header_get_base_node(header, env); |
| header_elem = (axiom_element_t*)axiom_node_get_data_element(header_node, env); |
| |
| /* Get Identifier element from header */ |
| qname = axutil_qname_create(env, ELEM_NAME_ID, EVENTING_NAMESPACE, NULL); |
| id_elem = axiom_element_get_first_child_with_qname(header_elem, env, qname, |
| header_node, &id_node); |
| axutil_qname_free(qname, env); |
| |
| /* Now read the id */ |
| sub_id = axiom_element_get_text(id_elem, env, id_node); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, |
| "[savan] Exit:savan_util_get_subscription_id_from_msg"); |
| return sub_id; |
| } |
| |
| savan_subscriber_t * AXIS2_CALL |
| savan_util_get_subscriber_from_msg( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx, |
| savan_storage_mgr_t *storage_mgr, |
| const axis2_char_t *sub_id) |
| { |
| savan_subscriber_t *subscriber = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_get_subscriber_from_msg"); |
| |
| /* Extract subscription id from msg if not already given */ |
| if (!sub_id) |
| { |
| sub_id = savan_util_get_subscription_id_from_msg(env, msg_ctx); |
| } |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| subscriber = savan_storage_mgr_retrieve_subscriber(storage_mgr, env, sub_id); |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_get_subscriber_from_msg"); |
| |
| return subscriber; |
| } |
| |
| savan_subscriber_t * AXIS2_CALL |
| savan_util_get_subscriber_from_renew_msg( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx, |
| savan_storage_mgr_t *storage_mgr, |
| const axis2_char_t *sub_id) |
| { |
| savan_subscriber_t *subscriber = NULL; |
| axiom_soap_envelope_t *envelope = NULL; |
| axiom_soap_header_t *header = NULL; |
| axutil_qname_t *qname = NULL; |
| axiom_node_t *header_node = NULL; |
| axiom_node_t *id_node = NULL; |
| axiom_element_t *id_elem = NULL; |
| axiom_node_t *expires_node = NULL; |
| axiom_element_t *expires_elem = NULL; |
| axiom_node_t *renew_node = NULL; |
| axiom_element_t *renew_elem = NULL; |
| axiom_element_t *header_elem = NULL; |
| axis2_char_t *expires = NULL; |
| axis2_char_t *renewed_expires = NULL; |
| axiom_soap_body_t *body = NULL; |
| axiom_node_t *body_node = NULL; |
| axiom_element_t *body_elem = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_get_subscriber_from_renew_msg"); |
| |
| /* Extract subscription id from msg if not already given */ |
| if (!sub_id) |
| { |
| sub_id = savan_util_get_subscription_id_from_msg(env, msg_ctx); |
| } |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| subscriber = savan_storage_mgr_retrieve_subscriber(storage_mgr, env, sub_id); |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| if(!subscriber) |
| { |
| AXIS2_HANDLE_ERROR(env, SAVAN_ERROR_SUBSCRIBER_RETRIEVE_ERROR, AXIS2_FAILURE); |
| return NULL; |
| } |
| /* Get soap envelop and extract the subscription id */ |
| |
| envelope = axis2_msg_ctx_get_soap_envelope(msg_ctx, env); |
| if (!envelope) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to extract the soap envelop"); |
| return NULL; |
| } |
| |
| header = axiom_soap_envelope_get_header(envelope, env); |
| if (!header) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to extract the soap header"); |
| return NULL; |
| } |
| |
| /* Get header element from header node */ |
| header_node = axiom_soap_header_get_base_node(header, env); |
| header_elem = (axiom_element_t*)axiom_node_get_data_element(header_node, env); |
| |
| /* Get Identifier element from header */ |
| qname = axutil_qname_create(env, ELEM_NAME_ID, EVENTING_NAMESPACE, NULL); |
| id_elem = axiom_element_get_first_child_with_qname(header_elem, env, qname, |
| header_node, &id_node); |
| axutil_qname_free(qname, env); |
| |
| /* Now read the id */ |
| sub_id = axiom_element_get_text(id_elem, env, id_node); |
| |
| /* Get Expires element from body */ |
| body = axiom_soap_envelope_get_body(envelope, env); |
| if (!body) |
| { |
| AXIS2_HANDLE_ERROR(env, AXIS2_ERROR_SOAP_ENVELOPE_OR_SOAP_BODY_NULL, AXIS2_FAILURE); |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to extract the soap body"); |
| return NULL; |
| } |
| |
| body_node = axiom_soap_body_get_base_node(body, env); |
| body_elem = (axiom_element_t*)axiom_node_get_data_element(body_node, env); |
| |
| /* Get Subscribe element from Body */ |
| qname = axutil_qname_create(env, ELEM_NAME_RENEW, EVENTING_NAMESPACE, NULL); |
| renew_elem = axiom_element_get_first_child_with_qname(body_elem, env, qname, body_node, |
| &renew_node); |
| axutil_qname_free(qname, env); |
| |
| qname = axutil_qname_create(env, ELEM_NAME_EXPIRES, EVENTING_NAMESPACE, NULL); |
| expires_elem = axiom_element_get_first_child_with_qname(renew_elem, env, qname, renew_node, |
| &expires_node); |
| axutil_qname_free(qname, env); |
| if(expires_elem) |
| { |
| expires = axiom_element_get_text(expires_elem, env, expires_node); |
| if(expires) |
| { |
| /* Check whether the subscription can be renewed. If renewable, set the new |
| * expiry time in the subscriber */ |
| savan_subscriber_set_expires(subscriber, env, expires); |
| renewed_expires = savan_util_get_renewed_expiry_time(env, expires); |
| savan_subscriber_set_expires(subscriber, env, renewed_expires); |
| } |
| } |
| |
| savan_subscriber_set_renew_status(subscriber, env, AXIS2_TRUE); |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_get_subscriber_from_renew_msg"); |
| |
| return subscriber; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| savan_util_add_subscriber( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx, |
| savan_storage_mgr_t *storage_mgr, |
| savan_subscriber_t *subscriber) |
| { |
| axis2_status_t status = AXIS2_FAILURE; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_add_subscriber"); |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| status = savan_storage_mgr_insert_subscriber(storage_mgr, env, subscriber); |
| if(status) |
| { |
| axutil_property_t *subs_prop = NULL; |
| subs_prop = axutil_property_create_with_args(env, 0, 0, |
| savan_subscriber_free_void_arg, subscriber); |
| axis2_msg_ctx_set_property(msg_ctx, env, SAVAN_SUBSCRIBER, subs_prop); |
| } |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:savan_util_add_subscriber"); |
| return status; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| savan_util_update_subscriber( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx, |
| savan_storage_mgr_t *storage_mgr, |
| savan_subscriber_t *subscriber) |
| { |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_update_subscriber"); |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| savan_storage_mgr_update_subscriber(storage_mgr, env, subscriber); |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:savan_util_update_subscriber"); |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| savan_util_remove_subscriber( |
| const axutil_env_t *env, |
| axis2_msg_ctx_t *msg_ctx, |
| savan_storage_mgr_t *storage_mgr, |
| savan_subscriber_t *subscriber) |
| { |
| const axis2_char_t *subs_id = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_remove_subscriber"); |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| subs_id = savan_subscriber_get_id(subscriber, env); |
| |
| savan_storage_mgr_remove_subscriber(storage_mgr, env, subs_id); |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:savan_util_remove_subscriber"); |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_status_t AXIS2_CALL |
| savan_util_set_store( |
| axis2_svc_t *svc, |
| const axutil_env_t *env, |
| axis2_char_t *store_name) |
| { |
| axutil_hash_t *store = NULL; |
| axutil_param_t *param = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:set_sub_store"); |
| |
| /* Create a hash map */ |
| store = axutil_hash_make(env); |
| if (!store) |
| { |
| /* TODO : error reporting */ |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Could not create subscriber store"); |
| return AXIS2_FAILURE; |
| } |
| |
| /* Add the hash map as a parameter to the given service */ |
| param = axutil_param_create(env, store_name, (void*)store); |
| if (!param) |
| { |
| /* TODO : error reporting */ |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Could not create subscriber store param"); |
| return AXIS2_FAILURE; |
| } |
| |
| axis2_svc_add_param(svc, env, param); |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:set_sub_store"); |
| |
| return AXIS2_SUCCESS; |
| } |
| |
| axis2_char_t * AXIS2_CALL |
| savan_util_get_expiry_time( |
| const axutil_env_t *env) |
| { |
| /* TODO: decide how to set expiry time */ |
| |
| return "*"; |
| } |
| |
| axis2_char_t * AXIS2_CALL |
| savan_util_get_renewed_expiry_time( |
| const axutil_env_t *env, |
| axis2_char_t *expiry) |
| { |
| /* TODO: Decide how to renew expiry time, may be using policy. Currently honor the requested. */ |
| |
| return expiry; |
| } |
| |
| axis2_char_t *AXIS2_CALL |
| savan_util_get_topic_name_from_topic_url( |
| const axutil_env_t *env, |
| axis2_char_t *topic_url) |
| { |
| axis2_char_t *topic = NULL; |
| axis2_char_t *temp = NULL; |
| |
| temp = axutil_rindex(topic_url, AXIS2_PATH_SEP_CHAR) + 1; |
| AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "topic:%s", temp); |
| AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "topic2:%s", topic_url); |
| if(temp) |
| { |
| if(axutil_strchr(temp, '"')) |
| { |
| int len = axutil_strlen(temp) -1; |
| temp[len] = '\0'; |
| } |
| |
| topic = axutil_strdup(env, temp); |
| } |
| |
| return topic; |
| } |
| |
| void *AXIS2_CALL |
| savan_util_get_svc_client( |
| const axutil_env_t *env) |
| { |
| const axis2_char_t *client_home = NULL; |
| axis2_options_t *options = NULL; |
| axis2_svc_client_t *svc_client = NULL; |
| |
| client_home = AXIS2_GETENV("AXIS2C_HOME"); |
| if (!client_home) |
| { |
| client_home = "../../deploy"; |
| } |
| |
| options = axis2_options_create(env); |
| axis2_options_set_xml_parser_reset(options, env, AXIS2_FALSE); |
| svc_client = axis2_svc_client_create(env, client_home); |
| if (!svc_client) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, |
| "[savan] Stub invoke FAILED: Error code:" |
| " %d :: %s", env->error->error_number, |
| AXIS2_ERROR_GET_MESSAGE(env->error)); |
| return NULL; |
| } |
| axis2_svc_client_set_options(svc_client, env, options); |
| axis2_svc_client_engage_module(svc_client, env, AXIS2_MODULE_ADDRESSING); |
| return svc_client; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_util_get_resource_connection_string( |
| const axutil_env_t *env, |
| axis2_conf_t *conf) |
| { |
| axis2_char_t *resource_str = "./savan_db"; |
| axis2_module_desc_t *module_desc = NULL; |
| axutil_qname_t *qname = NULL; |
| |
| qname = axutil_qname_create(env, SAVAN_MODULE, NULL, NULL); |
| module_desc = axis2_conf_get_module(conf, env, qname); |
| if(module_desc) |
| { |
| axutil_param_t *resource_param = NULL; |
| resource_param = axis2_module_desc_get_param(module_desc, env, SAVAN_RESOURCE); |
| if(resource_param) |
| { |
| resource_str = (axis2_char_t *) axutil_param_get_value(resource_param, env); |
| } |
| } |
| axutil_qname_free(qname, env); |
| |
| return resource_str; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_util_get_resource_username( |
| const axutil_env_t *env, |
| axis2_conf_t *conf) |
| { |
| axis2_char_t *username = "admin"; |
| axis2_module_desc_t *module_desc = NULL; |
| axutil_qname_t *qname = NULL; |
| |
| qname = axutil_qname_create(env, SAVAN_MODULE, NULL, NULL); |
| module_desc = axis2_conf_get_module(conf, env, qname); |
| if(module_desc) |
| { |
| axutil_param_t *param = NULL; |
| param = axis2_module_desc_get_param(module_desc, env, SAVAN_RESOURCE_USERNAME); |
| if(param) |
| { |
| username = (axis2_char_t *) axutil_param_get_value(param, env); |
| } |
| } |
| axutil_qname_free(qname, env); |
| |
| return username; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_util_get_resource_password( |
| const axutil_env_t *env, |
| axis2_conf_t *conf) |
| { |
| axis2_char_t *password = "password"; |
| axis2_module_desc_t *module_desc = NULL; |
| axutil_qname_t *qname = NULL; |
| |
| qname = axutil_qname_create(env, SAVAN_MODULE, NULL, NULL); |
| module_desc = axis2_conf_get_module(conf, env, qname); |
| if(module_desc) |
| { |
| axutil_param_t *param = NULL; |
| param = axis2_module_desc_get_param(module_desc, env, SAVAN_RESOURCE_PASSWORD); |
| if(param) |
| { |
| password = (axis2_char_t *) axutil_param_get_value(param, env); |
| } |
| } |
| axutil_qname_free(qname, env); |
| |
| return password; |
| } |
| |
| AXIS2_EXTERN axis2_char_t *AXIS2_CALL |
| savan_util_get_module_param( |
| const axutil_env_t *env, |
| axis2_conf_t *conf, |
| axis2_char_t *name) |
| { |
| axis2_char_t *value = NULL; |
| axis2_module_desc_t *module_desc = NULL; |
| axutil_qname_t *qname = NULL; |
| |
| qname = axutil_qname_create(env, SAVAN_MODULE, NULL, NULL); |
| module_desc = axis2_conf_get_module(conf, env, qname); |
| if(module_desc) |
| { |
| axutil_param_t *param = NULL; |
| param = axis2_module_desc_get_param(module_desc, env, name); |
| if(param) |
| { |
| value = (axis2_char_t *) axutil_param_get_value(param, env); |
| } |
| } |
| axutil_qname_free(qname, env); |
| |
| return value; |
| } |
| |
| AXIS2_EXTERN axis2_status_t AXIS2_CALL |
| savan_util_process_subscriber_node( |
| const axutil_env_t *env, |
| axiom_node_t *sub_node, |
| axiom_element_t *sub_elem, |
| savan_subscriber_t *subscriber) |
| { |
| axutil_qname_t *qname = NULL; |
| axiom_node_t *endto_node = NULL; |
| axiom_node_t *delivery_node = NULL; |
| axiom_node_t *notify_node = NULL; |
| axiom_node_t *address_node = NULL; |
| axiom_node_t *filter_node = NULL; |
| axiom_node_t *expires_node = NULL; |
| |
| axiom_element_t *endto_elem = NULL; |
| axiom_element_t *delivery_elem = NULL; |
| axiom_element_t *notify_elem = NULL; |
| axiom_element_t *address_elem = NULL; |
| axiom_element_t *expires_elem = NULL; |
| axiom_element_t *filter_elem = NULL; |
| |
| axis2_char_t *endto = NULL; |
| axis2_char_t *notify = NULL; |
| axis2_char_t *expires = NULL; |
| axis2_char_t *filter = NULL; |
| axis2_char_t *filter_dialect = NULL; |
| |
| axis2_endpoint_ref_t *endto_epr = NULL; |
| axis2_endpoint_ref_t *notify_epr = NULL; |
| |
| axis2_status_t status = AXIS2_SUCCESS; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_process_subscriber_node"); |
| |
| if(sub_elem) |
| { |
| /* EndTo */ |
| qname = axutil_qname_create(env, ELEM_NAME_ENDTO, EVENTING_NAMESPACE, NULL); |
| endto_elem = axiom_element_get_first_child_with_qname(sub_elem, env, qname, sub_node, |
| &endto_node); |
| axutil_qname_free(qname, env); |
| |
| if(endto_elem) |
| { |
| endto = axiom_element_get_text(endto_elem, env, endto_node); |
| if(endto) |
| { |
| endto_epr = axis2_endpoint_ref_create(env, endto); |
| savan_subscriber_set_end_to(subscriber, env, endto_epr); |
| } |
| } |
| |
| /* Get Delivery element and read NotifyTo */ |
| qname = axutil_qname_create(env, ELEM_NAME_DELIVERY, EVENTING_NAMESPACE, NULL); |
| delivery_elem = axiom_element_get_first_child_with_qname(sub_elem, env, qname, sub_node, |
| &delivery_node); |
| |
| axutil_qname_free(qname, env); |
| if(delivery_elem) |
| { |
| qname = axutil_qname_create(env, ELEM_NAME_NOTIFYTO, EVENTING_NAMESPACE, NULL); |
| notify_elem = axiom_element_get_first_child_with_qname(delivery_elem, env, qname, |
| delivery_node, ¬ify_node); |
| axutil_qname_free(qname, env); |
| if(notify_elem) |
| { |
| qname = axutil_qname_create(env, ELEM_NAME_ADDR, AXIS2_WSA_NAMESPACE_SUBMISSION, NULL); |
| address_elem = axiom_element_get_first_child_with_qname(notify_elem, env, qname, |
| notify_node, &address_node); |
| axutil_qname_free(qname, env); |
| |
| notify = axiom_element_get_text(address_elem, env, address_node); |
| if(notify) |
| { |
| notify_epr = axis2_endpoint_ref_create(env, notify); |
| savan_subscriber_set_notify_to(subscriber, env, notify_epr); |
| } |
| } |
| } |
| |
| /* Expires */ |
| qname = axutil_qname_create(env, ELEM_NAME_EXPIRES, EVENTING_NAMESPACE, NULL); |
| expires_elem = axiom_element_get_first_child_with_qname(sub_elem, env, qname, |
| sub_node, &expires_node); |
| axutil_qname_free(qname, env); |
| if(expires_elem) |
| { |
| expires = axiom_element_get_text(expires_elem, env, expires_node); |
| if(expires) |
| { |
| savan_subscriber_set_expires(subscriber, env, expires); |
| } |
| } |
| |
| /* Filter */ |
| qname = axutil_qname_create(env, ELEM_NAME_FILTER, EVENTING_NAMESPACE, NULL); |
| filter_elem = axiom_element_get_first_child_with_qname(sub_elem, env, |
| qname, |
| sub_node, |
| &filter_node); |
| axutil_qname_free(qname, env); |
| if(filter_elem) |
| { |
| qname = axutil_qname_create(env, SAVAN_FILTER_DIALECT, NULL, NULL); |
| filter = axiom_element_get_text(filter_elem, env, filter_node); |
| filter_dialect = axiom_element_get_attribute_value(filter_elem, |
| env, qname); |
| axutil_qname_free(qname, env); |
| if(filter_dialect) |
| { |
| savan_subscriber_set_filter_dialect(subscriber, env, |
| filter_dialect); |
| } |
| |
| if(filter) |
| { |
| savan_subscriber_set_filter(subscriber, env, filter); |
| } |
| } |
| } |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:savan_util_process_subscriber_node"); |
| return status; |
| } |
| |
| AXIS2_EXTERN axiom_node_t * AXIS2_CALL |
| savan_util_create_subscriber_node( |
| const axutil_env_t *env, |
| savan_subscriber_t *subscriber, |
| axiom_node_t *parent_node) |
| { |
| axiom_attribute_t *dialect = NULL; |
| axiom_namespace_t *ns = NULL; |
| axiom_namespace_t *addr_ns = NULL; |
| axiom_node_t *sub_node = NULL; |
| axiom_node_t *endto_node = NULL; |
| axiom_node_t *delivery_node = NULL; |
| axiom_node_t *notify_node = NULL; |
| axiom_node_t *address_node = NULL; |
| axiom_node_t *filter_node = NULL; |
| axiom_node_t *expires_node = NULL; |
| axiom_element_t* sub_elem = NULL; |
| axiom_element_t* endto_elem = NULL; |
| axiom_element_t* delivery_elem = NULL; |
| axiom_element_t* notify_elem = NULL; |
| axiom_element_t* address_elem = NULL; |
| axiom_element_t* filter_elem = NULL; |
| axiom_element_t* expires_elem = NULL; |
| axis2_char_t *endto = NULL; |
| axis2_char_t *notify = NULL; |
| axis2_char_t *filter = NULL; |
| axis2_char_t *filter_dialect = NULL; |
| axis2_char_t *expires = NULL; |
| axis2_endpoint_ref_t *endpoint_ref = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Entry:savan_util_create_subscriber_node"); |
| if(!subscriber) |
| { |
| AXIS2_ERROR_SET(env->error, SAVAN_ERROR_SUBSCRIBER_NOT_FOUND, AXIS2_FAILURE); |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Subscriber structure passed is NULL"); |
| return NULL; |
| } |
| |
| endpoint_ref = savan_subscriber_get_end_to(subscriber, env); |
| if(endpoint_ref) |
| { |
| endto = (axis2_char_t *) axis2_endpoint_ref_get_address(endpoint_ref, env); |
| } |
| endpoint_ref = savan_subscriber_get_notify_to(subscriber, env); |
| notify = (axis2_char_t *) axis2_endpoint_ref_get_address(endpoint_ref, env); |
| filter = savan_subscriber_get_filter(subscriber, env); |
| filter_dialect = savan_subscriber_get_filter_dialect(subscriber, env); |
| expires = savan_subscriber_get_expires(subscriber, env); |
| |
| /* create the body of the Subscribe request */ |
| ns = axiom_namespace_create (env, EVENTING_NAMESPACE, EVENTING_NS_PREFIX); |
| sub_elem = axiom_element_create(env, parent_node, ELEM_NAME_SUBSCRIBE, ns, &sub_node); |
| |
| /* EndTo element */ |
| if(endto) |
| { |
| endto_elem = axiom_element_create(env, sub_node, ELEM_NAME_ENDTO, ns, &endto_node); |
| axiom_element_set_text(endto_elem, env, endto, endto_node); |
| } |
| |
| /* Delivery element */ |
| delivery_elem = axiom_element_create(env, sub_node, ELEM_NAME_DELIVERY, ns, &delivery_node); |
| |
| notify_elem = axiom_element_create(env, delivery_node, ELEM_NAME_NOTIFYTO, ns, ¬ify_node); |
| addr_ns = axiom_namespace_create (env, AXIS2_WSA_NAMESPACE_SUBMISSION, ADDRESSING_NS_PREFIX); |
| address_elem = axiom_element_create(env, notify_node, ELEM_NAME_ADDR, addr_ns, &address_node); |
| axiom_element_set_text(address_elem, env, notify, address_node); |
| |
| /* Expires element */ |
| if(expires) |
| { |
| expires_elem = axiom_element_create(env, sub_node, ELEM_NAME_EXPIRES, ns, &expires_node); |
| axiom_element_set_text(expires_elem, env, expires, expires_node); |
| } |
| |
| /* Filter element */ |
| filter_elem = axiom_element_create(env, sub_node, ELEM_NAME_FILTER, ns, &filter_node); |
| axiom_element_set_text(filter_elem, env, filter, filter_node); |
| |
| if(!filter_dialect) |
| { |
| dialect = axiom_attribute_create(env, "Dialect", DEFAULT_FILTER_DIALECT, NULL); |
| } |
| else |
| { |
| dialect = axiom_attribute_create(env, "Dialect", filter_dialect, NULL); |
| } |
| |
| axiom_element_add_attribute(filter_elem, env, dialect ,filter_node); |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "[savan] Exit:savan_util_create_subscriber_node"); |
| return sub_node; |
| } |
| |
| AXIS2_EXTERN axiom_node_t * AXIS2_CALL |
| savan_util_create_savan_specific_subscriber_node( |
| const axutil_env_t *env, |
| savan_subscriber_t *subscriber, |
| axiom_node_t *parent_node) |
| { |
| axiom_node_t *subs_node = NULL; |
| axis2_status_t status = AXIS2_FAILURE; |
| axiom_namespace_t *ns1 = NULL; |
| axiom_namespace_t *ns2 = NULL; |
| axiom_namespace_t *ns3 = NULL; |
| axiom_node_t *sub_node = NULL; |
| axiom_node_t *id_node = NULL; |
| axiom_node_t *topic_node = NULL; |
| axiom_element_t *subs_elem = NULL; |
| axiom_element_t* id_elem = NULL; |
| axiom_element_t* topic_elem = NULL; |
| axis2_char_t *id = NULL; |
| axis2_char_t *topic_name = NULL; |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, |
| "[savan] Entry:savan_util_create_savan_specific_subscriber_node"); |
| |
| if(!subscriber) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Subscriber structure must be present"); |
| AXIS2_ERROR_SET(env->error, SAVAN_ERROR_SUBSCRIBER_NOT_FOUND, AXIS2_FAILURE); |
| return NULL; |
| } |
| |
| ns1 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX); |
| subs_elem = axiom_element_create(env, parent_node, ELEM_NAME_SUBSCRIBER, ns1, &subs_node); |
| if(!subs_node) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, |
| "[savan] Could not create Savan specific subscriber node"); |
| status = axutil_error_get_status_code(env->error); |
| if(AXIS2_SUCCESS != status) |
| { |
| return NULL; |
| } |
| } |
| |
| /* Id element */ |
| id = savan_subscriber_get_id(subscriber, env); |
| ns2 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX); |
| id_elem = axiom_element_create(env, subs_node, ELEM_NAME_ID, ns2, &id_node); |
| axiom_element_set_text(id_elem, env, id, id_node); |
| |
| /* Topic Url element */ |
| topic_name = savan_subscriber_get_filter(subscriber, env); |
| ns3 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX); |
| topic_elem = axiom_element_create(env, subs_node, ELEM_NAME_FILTER, ns3, &topic_node); |
| axiom_element_set_text(topic_elem, env, topic_name, topic_node); |
| |
| sub_node = savan_util_create_subscriber_node(env, subscriber, subs_node); |
| if(!sub_node) |
| { |
| AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Creating subscriber node failed"); |
| return NULL; |
| } |
| |
| AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, |
| "[savan] Exit:savan_util_create_savan_specific_subscriber_node"); |
| return subs_node; |
| } |
| |
| AXIS2_EXTERN savan_storage_mgr_t * AXIS2_CALL |
| savan_util_get_storage_mgr( |
| const axutil_env_t *env, |
| axis2_conf_ctx_t *conf_ctx, |
| axis2_conf_t *conf) |
| { |
| axutil_property_t *storage_mgr_prop = NULL; |
| savan_storage_mgr_t *storage_mgr = NULL; |
| |
| axutil_allocator_switch_to_global_pool(env->allocator); |
| if(conf_ctx) |
| { |
| storage_mgr_prop = axis2_conf_ctx_get_property(conf_ctx, env, SAVAN_STORAGE_MANAGER); |
| if(storage_mgr_prop) |
| { |
| storage_mgr = (savan_storage_mgr_t *) axutil_property_get_value(storage_mgr_prop, env); |
| } |
| } |
| |
| if(!storage_mgr) |
| { |
| storage_mgr = savan_storage_mgr_create(env, conf); |
| |
| if(storage_mgr && conf_ctx) |
| { |
| storage_mgr_prop = axutil_property_create_with_args(env, 0, 0, 0, storage_mgr); |
| axis2_conf_ctx_set_property(conf_ctx, env, SAVAN_STORAGE_MANAGER, storage_mgr_prop); |
| } |
| } |
| |
| axutil_allocator_switch_to_local_pool(env->allocator); |
| |
| return storage_mgr; |
| } |
| |
| AXIS2_EXTERN savan_filter_mod_t * AXIS2_CALL |
| savan_util_get_filter_module( |
| const axutil_env_t *env, |
| axis2_conf_t *conf) |
| { |
| axutil_param_t *filter_param = NULL; |
| savan_filter_mod_t *filtermod = NULL; |
| |
| if(conf) |
| { |
| filter_param = axis2_conf_get_param(conf, env, SAVAN_FILTER); |
| if(filter_param) |
| { |
| filtermod = (savan_filter_mod_t *) axutil_param_get_value(filter_param, env); |
| } |
| } |
| |
| if(!filtermod) |
| { |
| #ifdef SAVAN_FILTERING |
| filtermod = savan_filter_mod_create(env, conf); |
| #endif |
| |
| if(filtermod) |
| { |
| filter_param = axutil_param_create(env, SAVAN_FILTER, filtermod); |
| axis2_conf_add_param(conf, env, filter_param); |
| } |
| } |
| |
| return filtermod; |
| } |
| |
| axis2_bool_t AXIS2_CALL |
| savan_util_is_valid_duration( |
| const axutil_env_t *env, |
| const axis2_char_t *duration) |
| { |
| return AXIS2_TRUE; |
| } |
| |
| axis2_bool_t AXIS2_CALL |
| savan_util_is_valid_date_time( |
| const axutil_env_t *env, |
| const axis2_char_t *duration) |
| { |
| return AXIS2_TRUE; |
| } |
| |