You are viewing a plain text version of this content. The canonical link for it is here.
Posted to savan-dev@ws.apache.org by da...@apache.org on 2007/06/27 16:41:24 UTC

svn commit: r551181 - in /webservices/savan/trunk/c: include/savan_constants.h include/savan_subscriber.h include/savan_util.h src/core/savan_sub_processor.c src/subscribers/savan_subscriber.c src/util/savan_util.c

Author: damitha
Date: Wed Jun 27 07:41:23 2007
New Revision: 551181

URL: http://svn.apache.org/viewvc?view=rev&rev=551181
Log:
adding subscriber removing functionlity

Modified:
    webservices/savan/trunk/c/include/savan_constants.h
    webservices/savan/trunk/c/include/savan_subscriber.h
    webservices/savan/trunk/c/include/savan_util.h
    webservices/savan/trunk/c/src/core/savan_sub_processor.c
    webservices/savan/trunk/c/src/subscribers/savan_subscriber.c
    webservices/savan/trunk/c/src/util/savan_util.c

Modified: webservices/savan/trunk/c/include/savan_constants.h
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/include/savan_constants.h?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/include/savan_constants.h (original)
+++ webservices/savan/trunk/c/include/savan_constants.h Wed Jun 27 07:41:23 2007
@@ -58,6 +58,7 @@
 #define SAVAN_NS_PREFIX "savan"
 #define ELEM_NAME_SUBSCRIBERS "Subscribers"
 #define ELEM_NAME_ADD_SUBSCRIBER "AddSubscriber"
+#define ELEM_NAME_REMOVE_SUBSCRIBER "RemoveSubscriber"
 #define ELEM_NAME_TOPIC "Topic"
 #define DEFAULT_DELIVERY_MODE "http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/Push"
 

Modified: webservices/savan/trunk/c/include/savan_subscriber.h
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/include/savan_subscriber.h?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/include/savan_subscriber.h (original)
+++ webservices/savan/trunk/c/include/savan_subscriber.h Wed Jun 27 07:41:23 2007
@@ -212,7 +212,12 @@
     AXIS2_EXTERN savan_subscriber_t * AXIS2_CALL
     savan_subscriber_create(
         const axutil_env_t *env);
-    
+   
+    AXIS2_EXTERN void AXIS2_CALL
+    savan_subscriber_free(
+        savan_subscriber_t *subscriber, 
+        const axutil_env_t *env);
+
     axis2_status_t AXIS2_CALL
         savan_subscriber_set_topic(
         savan_subscriber_t *subscriber,

Modified: webservices/savan/trunk/c/include/savan_util.h
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/include/savan_util.h?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/include/savan_util.h (original)
+++ webservices/savan/trunk/c/include/savan_util.h Wed Jun 27 07:41:23 2007
@@ -96,6 +96,19 @@
         savan_subscriber_t *subscriber);
 
     /**
+    * Remove the subscriber from subscription manager services' store
+    * @param env pointer to environment struct
+    * @param msg_ctx pointer to message context
+    * @param subscriber
+    * @return the store on success, else NULL
+    */
+    axis2_status_t AXIS2_CALL
+    savan_util_remove_subscriber(
+        const axutil_env_t *env,
+        axis2_msg_ctx_t *msg_ctx,
+        savan_subscriber_t *subscriber);
+
+    /**
     * Calculate and return an expiry time for the subscription
     * @param env pointer to environment struct
     * @return the expiry time on success, else NULL

Modified: webservices/savan/trunk/c/src/core/savan_sub_processor.c
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/core/savan_sub_processor.c?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/src/core/savan_sub_processor.c (original)
+++ webservices/savan/trunk/c/src/core/savan_sub_processor.c Wed Jun 27 07:41:23 2007
@@ -46,12 +46,6 @@
     axis2_msg_ctx_t *msg_ctx,
     axis2_char_t *id);
 
-axis2_status_t AXIS2_CALL
-savan_sub_processor_remove_subscriber(
-    const axutil_env_t *env,
-    axis2_msg_ctx_t *msg_ctx,
-    savan_subscriber_t *subscriber);
-
 axis2_bool_t AXIS2_CALL
 savan_sub_processor_is_subscription_renewable(
     const axutil_env_t *env,
@@ -151,7 +145,7 @@
     savan_sub_processor_set_sub_id_to_msg_ctx(env, msg_ctx, id);
 
     /* Remove from store */
-    status = savan_sub_processor_remove_subscriber(env, msg_ctx, subscriber);
+    status = savan_util_remove_subscriber(env, msg_ctx, subscriber);
     if (status != AXIS2_SUCCESS)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to remove the"
@@ -406,37 +400,6 @@
 }
 
 /******************************************************************************/
-
-axis2_status_t AXIS2_CALL
-savan_sub_processor_remove_subscriber(
-    const axutil_env_t *env,
-    axis2_msg_ctx_t *msg_ctx,
-    savan_subscriber_t *subscriber)
-{
-    axis2_char_t *id = NULL;
-    axutil_hash_t *store = NULL;
-
-    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-
-    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan][sub processor] "
-        "remove subscriber...");
-
-    id = savan_subscriber_get_id(subscriber, env);
-
-    /* Extract the store from the svc and remove the given subscriber */
-    store = savan_util_get_subscriber_store(env, msg_ctx);
-    if (!store)
-    {
-        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Subscriber store is "
-            "null"); 
-        return AXIS2_FAILURE;
-    }
-
-    /* Setting NULL as value will remove the entry */
-    axutil_hash_set(store, id, AXIS2_HASH_KEY_STRING, NULL);
-
-    return AXIS2_SUCCESS;
-}
 
 /******************************************************************************/
 

Modified: webservices/savan/trunk/c/src/subscribers/savan_subscriber.c
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/subscribers/savan_subscriber.c?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/src/subscribers/savan_subscriber.c (original)
+++ webservices/savan/trunk/c/src/subscribers/savan_subscriber.c Wed Jun 27 07:41:23 2007
@@ -58,9 +58,28 @@
     subscriber->delivery_mode = NULL;
     subscriber->expires = NULL;
     subscriber->filter = NULL;
+    subscriber->topic = NULL;
     subscriber->renewed = AXIS2_FALSE;
         
     return subscriber;
+}
+
+AXIS2_EXTERN void AXIS2_CALL
+savan_subscriber_free(
+    savan_subscriber_t *subscriber, 
+    const axutil_env_t *env)
+{
+    if(subscriber->id)
+        AXIS2_FREE(env->allocator, subscriber->id);
+    if(subscriber->delivery_mode)
+        AXIS2_FREE(env->allocator, subscriber->delivery_mode);
+    if(subscriber->expires)
+        AXIS2_FREE(env->allocator, subscriber->expires);
+    if(subscriber->filter)
+        AXIS2_FREE(env->allocator, subscriber->filter);
+    if(subscriber->topic)
+        AXIS2_FREE(env->allocator, subscriber->topic);
+    AXIS2_FREE(env->allocator, subscriber);
 }
 
 /******************************************************************************/

Modified: webservices/savan/trunk/c/src/util/savan_util.c
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/util/savan_util.c?view=diff&rev=551181&r1=551180&r2=551181
==============================================================================
--- webservices/savan/trunk/c/src/util/savan_util.c (original)
+++ webservices/savan/trunk/c/src/util/savan_util.c Wed Jun 27 07:41:23 2007
@@ -32,12 +32,23 @@
     savan_subscriber_t *subscriber,
     axis2_char_t *subs_mgr_url);
 
+static axis2_status_t
+remove_subscriber_from_remote_subs_mgr(
+    const axutil_env_t *env,
+    savan_subscriber_t *subscriber,
+    axis2_char_t *subs_mgr_url);
+
 static axiom_node_t *
 build_add_subscriber_om_payload(
     const axutil_env_t *env,
     savan_subscriber_t *subscriber);
 
 static axiom_node_t *
+build_remove_subscriber_om_payload(
+    const axutil_env_t *env,
+    savan_subscriber_t *subscriber);
+
+static axiom_node_t *
 build_subscribers_request_om_payload(
     const axutil_env_t *env,
     axis2_char_t *topic);
@@ -284,6 +295,62 @@
     return AXIS2_SUCCESS;
 }
 
+axis2_status_t AXIS2_CALL
+savan_util_remove_subscriber(
+    const axutil_env_t *env,
+    axis2_msg_ctx_t *msg_ctx,
+    savan_subscriber_t *subscriber)
+{
+    axis2_svc_t *subs_svc = NULL;
+    axutil_param_t *param = NULL;
+    axutil_hash_t *store = NULL;
+    axis2_char_t *subs_svc_name = NULL;
+
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "[savan][sub processor] "
+        "remove subscriber...");
+
+    subs_svc = axis2_msg_ctx_get_svc(msg_ctx, env);
+    if (!subs_svc)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Failed to extract "
+            "the service"); 
+        return AXIS2_FAILURE;
+    }
+    param = axis2_svc_get_param(subs_svc, env, "SubscriptionMgrName");
+    if(param)
+    {
+        subs_svc_name = axutil_param_get_value(param, env);
+    }
+    if(subs_svc_name)
+    {
+        axis2_char_t *subs_mgr_url = NULL;
+        param = axis2_svc_get_param(subs_svc, env, "SubscriptionMgrURL");
+        subs_mgr_url = axutil_param_get_value(param, env);
+        remove_subscriber_from_remote_subs_mgr(env, subscriber, subs_mgr_url);
+    }
+    else
+    {
+        axis2_char_t *id = NULL;
+
+        id = savan_subscriber_get_id(subscriber, env);
+        /* Extract the store from the svc and remove the given subscriber */
+        store = savan_util_get_subscriber_store(env, msg_ctx);
+        if (!store)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[savan] Subscriber store is "
+                "null"); 
+            return AXIS2_FAILURE;
+        }
+
+        /* Setting NULL as value will remove the entry */
+        axutil_hash_set(store, id, AXIS2_HASH_KEY_STRING, NULL);
+    }
+        return AXIS2_SUCCESS;
+}
+
+
 axis2_status_t AXIS2_CALL 
 savan_util_set_sub_store(
     axis2_svc_t *svc,
@@ -384,6 +451,66 @@
     return AXIS2_SUCCESS;
 }
 
+static axis2_status_t
+remove_subscriber_from_remote_subs_mgr(
+    const axutil_env_t *env,
+    savan_subscriber_t *subscriber,
+    axis2_char_t *subs_mgr_url)
+{
+    const axis2_char_t *address = NULL;
+    axis2_endpoint_ref_t* endpoint_ref = NULL;
+    axis2_options_t *options = NULL;
+    const axis2_char_t *client_home = NULL;
+    axis2_svc_client_t* svc_client = NULL;
+    axiom_node_t *payload = NULL;
+
+    /* Set end point reference of echo service */
+    address = subs_mgr_url;
+    printf("[savan] Using endpoint : %s\n", address);
+
+    /* Create EPR with given address */
+    endpoint_ref = axis2_endpoint_ref_create(env, address);
+
+    /* Setup options */
+    options = axis2_options_create(env);
+    axis2_options_set_to(options, env, endpoint_ref);
+    axis2_options_set_action(options, env,
+        "http://ws.apache.org/axis2/c/subscription/remove_subscriber");
+
+    /* Set up deploy folder. It is from the deploy folder, the configuration is 
+     * picked up using the axis2.xml file.
+     * In this sample client_home points to the Axis2/C default deploy folder. 
+     * The client_home can be different from this folder on your system. For 
+     * example, you may have a different folder (say, my_client_folder) with its 
+     * own axis2.xml file. my_client_folder/modules will have the modules that 
+     * the client uses
+     */
+    client_home = (const axis2_char_t *) AXIS2_GETENV("AXIS2C_HOME");
+    if (!client_home)
+        client_home = "../../deploy";
+
+    /* Create service client */
+    svc_client = axis2_svc_client_create(env, client_home);
+    if (!svc_client)
+    {
+        printf("Error creating service client\n");
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Stub invoke FAILED: Error code:"
+            " %d :: %s", env->error->error_number,
+            AXIS2_ERROR_GET_MESSAGE(env->error));
+        return -1;
+    }
+    axis2_options_set_soap_version(options, env, AXIOM_SOAP11);
+    /* Set service client options */
+    axis2_svc_client_set_options(svc_client, env, options);    
+    
+    axis2_svc_client_engage_module(svc_client, env, AXIS2_MODULE_ADDRESSING);
+    payload = build_remove_subscriber_om_payload(env, subscriber);
+    /* Send request */
+    axis2_svc_client_send_robust(svc_client, env, payload);
+
+    return AXIS2_SUCCESS;
+}
+
 axutil_hash_t *AXIS2_CALL
 savan_util_get_subscriber_list_from_remote_subs_mgr(
     const axutil_env_t *env,
@@ -479,11 +606,21 @@
     axiom_children_qname_iterator_t *subs_iter = NULL;
     axutil_hash_t *subscriber_list = axutil_hash_make(env);
     axutil_qname_t *qname = NULL;
+    axiom_node_t *topic_node = NULL;
+    axiom_element_t *topic_elem = NULL;
+    axis2_char_t *topic_url = NULL;
 
     AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
         "[savan] Start:process_subscriber_list_node");
     subs_list_element = axiom_node_get_data_element(subs_list_node, env); 
-    
+         
+    /* Topic */
+    qname = axutil_qname_create(env, ELEM_NAME_TOPIC, SAVAN_NAMESPACE, NULL);
+    topic_elem = axiom_element_get_first_child_with_qname(subs_list_element, 
+        env, qname, subs_list_node, &topic_node);
+    axutil_qname_free(qname, env);
+    topic_url = axiom_element_get_text(topic_elem, env, topic_node);
+   
     /* Get Subscriber elements from subscriber list */
     qname = axutil_qname_create(env, ELEM_NAME_SUBSCRIBE, EVENTING_NAMESPACE, 
         NULL);
@@ -535,6 +672,10 @@
                 return NULL;
             }
             /* Now read each sub element of Subscribe element */
+
+            /* Topic */
+            savan_subscriber_set_topic(subscriber, env, topic_url);
+
             /* Id */
             qname = axutil_qname_create(env, ELEM_NAME_ID, SAVAN_NAMESPACE, NULL);
             id_elem = axiom_element_get_first_child_with_qname(sub_elem, env, qname,
@@ -599,8 +740,6 @@
     return subscriber_list;
 }
 
-
-
 static axiom_node_t *
 build_add_subscriber_om_payload(
     const axutil_env_t *env,
@@ -684,6 +823,43 @@
     return add_node;
 }
 
+static axiom_node_t *
+build_remove_subscriber_om_payload(
+    const axutil_env_t *env,
+    savan_subscriber_t *subscriber)
+{
+    axiom_node_t *remove_node = NULL;
+    axiom_element_t* remove_ele = NULL;
+    axiom_namespace_t *ns = NULL;
+    axiom_namespace_t *ns1 = NULL;
+    axiom_node_t *id_node = NULL;
+    axiom_node_t *topic_node = NULL;
+    axiom_element_t* id_elem = NULL;
+    axiom_element_t* topic_elem = NULL;
+    axis2_char_t *topic = NULL;
+    axis2_char_t *id = NULL;
+
+    id = savan_subscriber_get_id(subscriber, env);
+
+    ns = axiom_namespace_create (env, EVENTING_NAMESPACE, EVENTING_NS_PREFIX);
+    ns1 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX);
+    remove_ele = axiom_element_create(env, NULL, ELEM_NAME_REMOVE_SUBSCRIBER, 
+        ns1, &remove_node);
+    
+    /* create the id element */
+    if(id)
+    {
+        id_elem = axiom_element_create(env, remove_node, ELEM_NAME_ID, ns1, &id_node);
+            axiom_element_set_text(id_elem, env, id, id_node);
+    }
+    /* create the topic element */
+    topic_elem = axiom_element_create(env, remove_node, ELEM_NAME_TOPIC, ns1, &topic_node);
+    topic = savan_subscriber_get_topic(subscriber, env);
+    if(topic)
+        axiom_element_set_text(topic_elem, env, topic, topic_node);
+    
+    return remove_node;
+}
 
 /******************************************************************************/