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/09/07 08:04:56 UTC

svn commit: r573470 - in /webservices/savan/trunk/c: include/savan_constants.h include/savan_util.h src/subs_mgr/services.xml src/subs_mgr/subs_mgr.c src/util/savan_util.c

Author: damitha
Date: Thu Sep  6 23:04:55 2007
New Revision: 573470

URL: http://svn.apache.org/viewvc?rev=573470&view=rev
Log:
Improving Performance 

Modified:
    webservices/savan/trunk/c/include/savan_constants.h
    webservices/savan/trunk/c/include/savan_util.h
    webservices/savan/trunk/c/src/subs_mgr/services.xml
    webservices/savan/trunk/c/src/subs_mgr/subs_mgr.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?rev=573470&r1=573469&r2=573470&view=diff
==============================================================================
--- webservices/savan/trunk/c/include/savan_constants.h (original)
+++ webservices/savan/trunk/c/include/savan_constants.h Thu Sep  6 23:04:55 2007
@@ -69,7 +69,10 @@
 #define SAVAN_NAMESPACE "tcp://ws.apache.org/axis2/services/subscription"
 #define SAVAN_NS_PREFIX "savan"
 #define ELEM_NAME_SUBSCRIBERS "Subscribers"
+#define ELEM_NAME_SUBSCRIBER "Subscriber"
 #define ELEM_NAME_GET_SUBSCRIBER_LIST "get_subscriber_list"
+#define ELEM_NAME_GET_SUBSCRIBER "get_subscriber"
+#define ELEM_NAME_SUBSCRIBER_ID "SubscriberId"
 #define ELEM_NAME_ADD_SUBSCRIBER "AddSubscriber"
 #define ELEM_NAME_REMOVE_SUBSCRIBER "RemoveSubscriber"
 #define ELEM_NAME_TOPIC "Topic"

Modified: webservices/savan/trunk/c/include/savan_util.h
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/include/savan_util.h?rev=573470&r1=573469&r2=573470&view=diff
==============================================================================
--- webservices/savan/trunk/c/include/savan_util.h (original)
+++ webservices/savan/trunk/c/include/savan_util.h Thu Sep  6 23:04:55 2007
@@ -212,6 +212,13 @@
         axis2_char_t *subs_mgr_url,
         void *s_client);
 
+    savan_subscriber_t *AXIS2_CALL
+    savan_util_get_subscriber_from_remote_subs_mgr(
+        const axutil_env_t *env,
+        axis2_char_t *subs_id,
+        axis2_char_t *subs_mgr_url,
+        void *s_client);
+
     void *AXIS2_CALL
     savan_util_get_svc_client(
         const axutil_env_t *env);

Modified: webservices/savan/trunk/c/src/subs_mgr/services.xml
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/subs_mgr/services.xml?rev=573470&r1=573469&r2=573470&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/subs_mgr/services.xml (original)
+++ webservices/savan/trunk/c/src/subs_mgr/services.xml Thu Sep  6 23:04:55 2007
@@ -2,6 +2,7 @@
    <description>
         This is a subscription manager service
    </description>
+    <module ref="savan"/>
     <parameter name="ServiceClass" locked="xsd:false">subscription</parameter>
     <parameter name="loadServiceAtStartup" locked="xsd:false">true</parameter>
 

Modified: webservices/savan/trunk/c/src/subs_mgr/subs_mgr.c
URL: http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/subs_mgr/subs_mgr.c?rev=573470&r1=573469&r2=573470&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/subs_mgr/subs_mgr.c (original)
+++ webservices/savan/trunk/c/src/subs_mgr/subs_mgr.c Thu Sep  6 23:04:55 2007
@@ -264,6 +264,181 @@
 }
 
 AXIS2_EXTERN axiom_node_t *AXIS2_CALL
+savan_subs_mgr_get_subscriber(
+    const axutil_env_t *env,
+    axiom_node_t *node,
+    axis2_msg_ctx_t *msg_ctx)
+{
+
+    axis2_svc_t *subs_svc = NULL;
+    axutil_param_t *param = NULL;
+    axis2_char_t *topic_url = NULL;
+    axutil_hash_t *subs_store = NULL;
+    axiom_namespace_t *ns = NULL;
+    axiom_namespace_t *ns1 = NULL;
+    axiom_node_t *subs_id_parent_node = NULL;
+    axiom_node_t *subs_id_node = NULL;
+    savan_subscriber_t *subscriber = NULL;
+    axis2_char_t *subs_id = NULL;
+    axiom_node_t *subs_node = NULL;
+    axiom_element_t *subs_elem = NULL;
+
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "Start:savan_subs_mgr_get_subscriber");
+    subs_svc = axis2_msg_ctx_get_svc(msg_ctx, env);
+    param = axis2_svc_get_param(subs_svc, env, SAVAN_SUBSCRIBER_LIST);
+    if (!param)
+    {
+        savan_util_set_store(subs_svc, env, SAVAN_SUBSCRIBER_LIST);
+        param = axis2_svc_get_param(subs_svc, env, SAVAN_SUBSCRIBER_LIST);
+        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+            "[SAVAN] Savan Subscriber List is empty");
+    }
+    
+    subs_store = (axutil_hash_t*)axutil_param_get_value(param, env);
+    if(!subs_store)
+    {
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+            "[ML] Failed to extract the subscriber store"); 
+        return NULL;
+    }
+
+    /* Expected request format is :-
+     * <ns1:get_subscriber xmlns:ns1="http://ws.apache.org/savan">
+     *      <SubscriberId>subscriber id</SubscriberId>
+     * </ns1:get_subscriber>
+     */
+    if (!node) /* 'get_subscriber' node */
+    {
+        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_SVC_SKEL_INPUT_OM_NODE_NULL, 
+            AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+            "Echo client ERROR: input parameter NULL");
+        return NULL;
+    }
+
+    subs_id_parent_node = axiom_node_get_first_element(node, env);
+    if (!subs_id_parent_node) 
+    {
+        AXIS2_ERROR_SET(env->error, 
+            AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+            "Echo client ERROR 1: invalid XML in request");
+        return NULL;
+    }
+
+    subs_id_node = axiom_node_get_first_child(subs_id_parent_node, env);
+    if (!subs_id_node) /* actual subs_id text */
+    {
+        AXIS2_ERROR_SET(env->error, 
+            AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "invalid XML in request");
+        return NULL;
+    }
+
+    if (axiom_node_get_node_type(subs_id_node, env) == AXIOM_TEXT)
+    {
+        axiom_text_t *subs_id_text = 
+            (axiom_text_t *)axiom_node_get_data_element(subs_id_node, env);
+        if (subs_id_text && axiom_text_get_value(subs_id_text , env))
+        {
+            subs_id = (axis2_char_t *)axiom_text_get_value(subs_id_text, env);
+            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+                "Requested Subscriber's id:%s", subs_id);
+        }
+    }
+    else
+    {
+        AXIS2_ERROR_SET(env->error, 
+            AXIS2_ERROR_SVC_SKEL_INVALID_XML_FORMAT_IN_REQUEST, AXIS2_FAILURE);
+        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid XML in request");
+        return NULL;
+    }
+
+    /* create the body of the subscribers element */
+    ns = axiom_namespace_create (env, EVENTING_NAMESPACE, EVENTING_NS_PREFIX);
+    ns1 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX);
+    subs_elem = axiom_element_create(env, NULL, ELEM_NAME_SUBSCRIBER, ns1, 
+        &subs_node);
+    subscriber = axutil_hash_get(subs_store, subs_id, AXIS2_HASH_KEY_STRING);
+    if (subscriber)
+    {
+        axiom_node_t *topic_node = NULL;
+        axiom_node_t *sub_node = NULL;
+        axiom_node_t *endto_node = NULL;
+        axiom_node_t *id_node = NULL;
+        axiom_node_t *delivery_node = NULL;
+        axiom_node_t *notify_node = NULL;
+        axiom_node_t *filter_node = NULL;
+        axiom_node_t *expires_node = NULL;
+        axiom_element_t* sub_elem = NULL;
+        axiom_element_t* id_elem = NULL;
+        axiom_element_t* topic_elem = NULL;
+        axiom_element_t* endto_elem = NULL;
+        axiom_element_t* delivery_elem = NULL;
+        axiom_element_t* notify_elem = NULL;
+        axiom_element_t* filter_elem = NULL;
+        axiom_element_t* expires_elem = NULL;
+        const axis2_char_t *endto = NULL;
+        const axis2_char_t *notify = NULL;
+        const axis2_char_t *filter = NULL;
+        const axis2_char_t *expires = NULL;
+        axis2_char_t *id = NULL;
+
+        topic_elem = axiom_element_create(env, subs_node, 
+            ELEM_NAME_TOPIC, ns1, &topic_node);
+        topic_url = savan_subscriber_get_topic(subscriber, env);
+        if(topic_url)
+        {
+            axiom_element_set_text(topic_elem, env, topic_url, topic_node); 
+        }
+        axis2_endpoint_ref_t *endto_ref = savan_subscriber_get_end_to(subscriber, env);
+        endto = axis2_endpoint_ref_get_address(endto_ref, env);
+        axis2_endpoint_ref_t *notify_ref = savan_subscriber_get_notify_to(subscriber, env);
+        notify = axis2_endpoint_ref_get_address(notify_ref, env);
+        filter = savan_subscriber_get_filter(subscriber, env); 
+        expires = savan_subscriber_get_expires(subscriber, env);
+        id = savan_subscriber_get_id(subscriber, env);
+      
+
+        /* create the subscriber element */
+
+        sub_elem = axiom_element_create(env, subs_node, 
+            ELEM_NAME_SUBSCRIBE, ns, &sub_node);
+        
+        /* Id element */
+        id_elem = axiom_element_create(env, sub_node, ELEM_NAME_ID, ns1,
+            &id_node);
+        axiom_element_set_text(id_elem, env, id, id_node);
+
+        /* EndTo element */
+        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, &notify_node);
+        axiom_element_set_text(notify_elem, env, notify, notify_node);
+        
+        /* Expires element */
+        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, &endto_node);
+        axiom_element_set_text(filter_elem, env, filter, filter_node);
+    }
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "End:savan_subs_mgr_get_subscriber");
+    return subs_node;
+}
+
+AXIS2_EXTERN axiom_node_t *AXIS2_CALL
 savan_subs_mgr_get_subscriber_list(
     const axutil_env_t *env,
     axiom_node_t *node,

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?rev=573470&r1=573469&r2=573470&view=diff
==============================================================================
--- webservices/savan/trunk/c/src/util/savan_util.c (original)
+++ webservices/savan/trunk/c/src/util/savan_util.c Thu Sep  6 23:04:55 2007
@@ -61,6 +61,11 @@
     savan_subscriber_t *subscriber);
 
 static axiom_node_t *
+build_subscriber_request_om_payload(
+    const axutil_env_t *env,
+    axis2_char_t *subs_id);
+
+static axiom_node_t *
 build_subscribers_request_om_payload(
     const axutil_env_t *env,
     axis2_char_t *topic);
@@ -69,6 +74,11 @@
 build_topics_request_om_payload(
     const axutil_env_t *env);
 
+static savan_subscriber_t *
+process_subscriber_node(
+    const axutil_env_t *env,
+    axiom_node_t *sub_node);
+
 static axutil_hash_t *
 process_subscriber_list_node(
     const axutil_env_t *env,
@@ -319,8 +329,10 @@
         axis2_msg_ctx_t *msg_ctx,
         axis2_char_t *sub_id)
 {
-    axutil_hash_t *store = NULL;
+    axutil_hash_t *subs_store = NULL;
     savan_subscriber_t *subscriber = NULL;
+    axutil_param_t *param = NULL;
+    axis2_svc_t *pubs_svc = NULL;
 
     AXIS2_ENV_CHECK(env, NULL);
 
@@ -332,15 +344,88 @@
     {
         sub_id = savan_util_get_subscription_id_from_msg(env, msg_ctx);
     }
-
-    store = savan_util_get_subscriber_store(env, msg_ctx);
-    if (!store)
+    pubs_svc = axis2_msg_ctx_get_svc(msg_ctx, env);
+    if (!pubs_svc)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
-            "[SAVAN] Subscriber store is null"); 
+            "[SAVAN] Failed to extract the service"); 
         return NULL;
     }
-    subscriber = axutil_hash_get(store, sub_id, AXIS2_HASH_KEY_STRING);
+    param = axis2_svc_get_param(pubs_svc, env, "SubscriptionMgrName");
+    if(param)
+    {
+        axis2_svc_t *subs_svc = NULL;
+        axis2_conf_ctx_t *conf_ctx = NULL;
+        axis2_conf_t *conf = NULL;
+        axutil_param_t *subs_store_param = NULL;
+        axis2_char_t *subs_svc_name = NULL;
+
+        subs_svc_name = axutil_param_get_value(param, env);
+        conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env);
+        conf = axis2_conf_ctx_get_conf(conf_ctx, env);
+        if(conf)
+            subs_svc = axis2_conf_get_svc(conf, env, subs_svc_name);
+        if(subs_svc)
+        {
+            subs_store_param = axis2_svc_get_param(subs_svc, env,
+                SAVAN_SUBSCRIBER_LIST);
+            if(!subs_store_param)
+            {
+                AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+                    "[SAVAN] No Topic found");
+                return NULL;
+            }
+            subs_store = axutil_param_get_value(subs_store_param, env);
+            subscriber = axutil_hash_get(subs_store, sub_id, 
+                AXIS2_HASH_KEY_STRING);
+        }
+        else
+        {
+            axis2_char_t *subs_mgr_url = NULL;
+
+            param = axis2_svc_get_param(pubs_svc, env, "SubscriptionMgrURL");
+            if(param)
+            {
+                axis2_svc_client_t* svc_client = NULL;
+                axutil_param_t *svc_client_param = NULL;
+                axis2_endpoint_ref_t *topic_epr = NULL;
+                axis2_char_t *topic_url = NULL;
+
+                subs_mgr_url = axutil_param_get_value(param, env);
+                topic_epr = axis2_msg_ctx_get_to(msg_ctx, env);
+                topic_url = (axis2_char_t *) axis2_endpoint_ref_get_address(
+                    topic_epr, env);
+                svc_client_param = axis2_svc_get_param(pubs_svc, env, "svc_client");
+                if(svc_client_param)
+                    svc_client = axutil_param_get_value(svc_client_param, env);
+                if(!svc_client)
+                {
+                    svc_client = 
+                        (axis2_svc_client_t *) savan_util_get_svc_client(env);
+                    svc_client_param = axutil_param_create(env, "svc_client", 
+                        svc_client);
+                    axis2_svc_add_param(pubs_svc, env, svc_client_param);
+                }
+                subscriber = savan_util_get_subscriber_from_remote_subs_mgr(env, 
+                    sub_id, subs_mgr_url, svc_client);
+            }
+        }
+    }
+    else
+    { 
+        param = axis2_svc_get_param(pubs_svc, env, SAVAN_SUBSCRIBER_LIST);
+        if (param)
+        {
+            subs_store = (axutil_hash_t*)axutil_param_get_value(param, env);
+        }
+        if (!subs_store)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                "[SAVAN] Subscriber store is null"); 
+            return NULL;
+        }
+        subscriber = axutil_hash_get(subs_store, sub_id, AXIS2_HASH_KEY_STRING);
+    }
     AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
         "[SAVAN] End:savan_util_get_subscriber_from_msg");
     
@@ -727,6 +812,186 @@
     return AXIS2_SUCCESS;
 }
 
+savan_subscriber_t *AXIS2_CALL
+savan_util_get_subscriber_from_remote_subs_mgr(
+    const axutil_env_t *env,
+    axis2_char_t *subs_id,
+    axis2_char_t *subs_mgr_url,
+    void *s_client)
+{
+    axis2_endpoint_ref_t* endpoint_ref = NULL;
+    axis2_options_t *options = NULL;
+    axis2_svc_client_t* svc_client = NULL;
+    axiom_node_t *payload = NULL;
+    axiom_node_t *ret_node = NULL;
+    savan_subscriber_t *subscriber = NULL;
+
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "[SAVAN] Start:savan_util_get_subscriber_from_remote_subs_mgr");
+    svc_client = (axis2_svc_client_t *) s_client;
+    options = (axis2_options_t *)axis2_svc_client_get_options(svc_client, 
+        env);
+    endpoint_ref = axis2_endpoint_ref_create(env, subs_mgr_url);
+    axis2_options_set_to(options, env, endpoint_ref);
+    
+    payload = build_subscriber_request_om_payload(env, subs_id);
+    ret_node = axis2_svc_client_send_receive(svc_client, env, payload);
+    if (ret_node)
+    {
+        subscriber = process_subscriber_node(env, ret_node);
+    }
+    else
+    {
+        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));
+    }
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "[SAVAN] End:savan_util_get_subscriber_from_remote_subs_mgr");
+    return subscriber;
+}
+
+static axiom_node_t *
+build_subscriber_request_om_payload(
+    const axutil_env_t *env,
+    axis2_char_t *subs_id)
+{
+    axiom_node_t *om_node = NULL;
+    axiom_element_t* om_ele = NULL;
+    axiom_node_t* subs_id_om_node = NULL;
+    axiom_element_t * subs_id_om_ele = NULL;
+    axiom_namespace_t *ns1 = NULL;
+    axis2_char_t *om_str = NULL;
+
+    ns1 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX);
+    om_ele = axiom_element_create(env, NULL, ELEM_NAME_GET_SUBSCRIBER, ns1, &om_node);
+    subs_id_om_ele = axiom_element_create(env, om_node, ELEM_NAME_SUBSCRIBER_ID, ns1, 
+        &subs_id_om_node);
+    axiom_element_set_text(subs_id_om_ele, env, subs_id, subs_id_om_node);
+
+    om_str = axiom_node_to_string(om_node, env);
+    if (om_str)
+    {
+        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Sending OM : %s", om_str);
+        AXIS2_FREE(env->allocator, om_str);
+        om_str =  NULL;
+    }
+    return om_node;
+}
+
+static savan_subscriber_t *
+process_subscriber_node(
+    const axutil_env_t *env,
+    axiom_node_t *sub_node)
+{
+    axiom_element_t *sub_elem = NULL;
+    axutil_qname_t *qname = NULL;
+    axis2_char_t *topic_url = NULL;
+    savan_subscriber_t *subscriber = NULL;
+
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "[SAVAN] Start:process_subscriber_node");
+    sub_elem = axiom_node_get_data_element(sub_node, env); 
+         
+    if(sub_node)
+    {
+        axiom_node_t *id_node = NULL;
+        axiom_node_t *endto_node = NULL;
+        axiom_node_t *delivery_node = NULL;
+        axiom_node_t *notify_node = NULL;
+        axiom_node_t *filter_node = NULL;
+        axiom_node_t *expires_node = NULL;
+
+        axiom_element_t *id_elem = NULL;
+        axiom_element_t *endto_elem = NULL;
+        axiom_element_t *delivery_elem = NULL;
+        axiom_element_t *notify_elem = NULL;
+        axiom_element_t *expires_elem = NULL;
+        axiom_element_t *filter_elem = NULL;
+
+        axis2_char_t *id = NULL;
+        axis2_char_t *endto = NULL;
+        axis2_char_t *notify = NULL;
+        axis2_char_t *expires = NULL;
+        axis2_char_t *filter = NULL;
+
+        axis2_endpoint_ref_t *endto_epr = NULL;
+        axis2_endpoint_ref_t *notify_epr = NULL;
+     
+        subscriber = savan_subscriber_create(env);
+        if (!subscriber)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[SAVAN] Failed to create a"
+                "subscriber instance");
+            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,
+            sub_node, &id_node);
+        axutil_qname_free(qname, env);
+        id = axiom_element_get_text(id_elem, env, id_node);
+        savan_subscriber_set_id(subscriber, env, id);
+
+        /* 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);
+
+        endto = axiom_element_get_text(endto_elem, env, endto_node);
+
+        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);
+
+        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, &notify_node);
+        axutil_qname_free(qname, env);
+        notify = axiom_element_get_text(notify_elem, env, notify_node);
+
+        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);
+
+        expires = axiom_element_get_text(expires_elem, env, expires_node);
+
+        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);
+
+        filter = axiom_element_get_text(filter_elem, env, filter_node);
+
+        savan_subscriber_set_filter(subscriber, env, filter);
+    }
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "[SAVAN] End:process_subscriber_node");
+    return subscriber;
+}
+
 axutil_hash_t *AXIS2_CALL
 savan_util_get_subscriber_list_from_remote_subs_mgr(
     const axutil_env_t *env,
@@ -774,11 +1039,17 @@
 {
     axiom_node_t *om_node = NULL;
     axiom_element_t* om_ele = NULL;
+    axiom_node_t* topic_om_node = NULL;
+    axiom_element_t * topic_om_ele = NULL;
     axiom_namespace_t *ns1 = NULL;
     axis2_char_t *om_str = NULL;
 
     ns1 = axiom_namespace_create (env, SAVAN_NAMESPACE, SAVAN_NS_PREFIX);
     om_ele = axiom_element_create(env, NULL, ELEM_NAME_GET_SUBSCRIBER_LIST, ns1, &om_node);
+    topic_om_ele = axiom_element_create(env, om_node, ELEM_NAME_TOPIC, ns1, 
+        &topic_om_node);
+    axiom_element_set_text(topic_om_ele, env, topic, topic_om_node);
+
     om_str = axiom_node_to_string(om_node, env);
     if (om_str)
     {