Author: damitha
Date: Fri Jul 27 00:16:26 2007
New Revision: 560131

URL: http://svn.apache.org/viewvc?view=rev&rev=560131
Log:
patched AXIS2C-652 sent by diluka for savan filtering.
This does not break existing functionality. However I did
 not test the filtering functionlity as there was no test included in the patch

Modified:
    webservices/savan/trunk/c/configure.ac
    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/client/savan_client.c
    webservices/savan/trunk/c/src/core/savan_sub_processor.c
    webservices/savan/trunk/c/src/subscribers/Makefile.am
    webservices/savan/trunk/c/src/subscribers/savan_subscriber.c
    webservices/savan/trunk/c/src/util/Makefile.am
    webservices/savan/trunk/c/src/util/savan_util.c

Modified: webservices/savan/trunk/c/configure.ac
URL: 
http://svn.apache.org/viewvc/webservices/savan/trunk/c/configure.ac?view=diff&rev=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/configure.ac (original)
+++ webservices/savan/trunk/c/configure.ac Fri Jul 27 00:16:26 2007
@@ -71,6 +71,8 @@
 AXIOMINC="-I$abs_top_builddir/../axis2c/axiom/include"
 UTILINC="-I$abs_top_builddir/../axis2c/util/include"
 NEETHIINC="-I$abs_top_builddir/../axis2c/neethi/include"
+PKG_CHECK_MODULES(LIBXML2, libxml-2.0)
+CFLAGS="$CFLAGS $LIBXML2_CFLAGS"
 AC_SUBST(AXIS2INC)
 AC_SUBST(AXIOMINC)
 AC_SUBST(UTILINC)

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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/include/savan_constants.h (original)
+++ webservices/savan/trunk/c/include/savan_constants.h Fri Jul 27 00:16:26 2007
@@ -64,7 +64,8 @@
 
 #define EVENTING_NAMESPACE "http://schemas.xmlsoap.org/ws/2004/08/eventing";
 #define EVENTING_NS_PREFIX "wse"
-#define SAVAN_NAMESPACE "http://ws.apache.org/savan";
+/*#define SAVAN_NAMESPACE "http://ws.apache.org/savan"*/
+#define SAVAN_NAMESPACE "tcp://ws.apache.org/axis2/services/subscription"
 #define SAVAN_NS_PREFIX "savan"
 #define ELEM_NAME_SUBSCRIBERS "Subscribers"
 #define ELEM_NAME_GET_SUBSCRIBER_LIST "get_subscriber_list"

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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/include/savan_subscriber.h (original)
+++ webservices/savan/trunk/c/include/savan_subscriber.h Fri Jul 27 00:16:26 
2007
@@ -39,6 +39,32 @@
 
     typedef struct savan_subscriber_t savan_subscriber_t;
 
+       /*
+       * Set the filter template into the subscriber.
+       * @param subscriber pointer to the subscriber
+       * @param env pointer to env
+       * @param xslt template pointer to the stylesheet
+       */
+
+       axis2_status_t AXIS2_CALL
+       savan_subscriber_set_filter_template(
+       savan_subscriber_t *subscriber,
+       const axutil_env_t *env,
+       void* xslt_filter_template);
+
+       /*
+       * Get the filter template from the subscriber.
+       * needs to cast into a xsltStylesheepPtr
+       * @param subscriber pointer to the subscriber
+       * @param env pointer to env
+       * @param xslt template pointer to the stylesheet
+       */
+
+       void* AXIS2_CALL
+       savan_subscriber_get_filter_template(
+       savan_subscriber_t *subscriber,
+       const axutil_env_t *env);
+
     /**
      * Retrive subscriber id.
      * @param subscriber pointer to 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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/include/savan_util.h (original)
+++ webservices/savan/trunk/c/include/savan_util.h Fri Jul 27 00:16:26 2007
@@ -28,6 +28,7 @@
 
 #include <savan_constants.h>
 #include <savan_subscriber.h>
+#include <savan_sub_processor.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -39,7 +40,37 @@
  * @ingroup Savan Util
  * @{
  */
-    
+
+       /**
+       * Apply the filter against the subscriber
+       * @param subscriber, pointer to the subscriber
+       * @param env, pointer to the environment
+       * @param payload, pointer to the payload.
+       * returns the payload, after applying the 
+       * filter.
+       * returns success, upon successful application 
+       * of the filter. 
+       */ 
+       axiom_node_t * AXIS2_CALL
+       savan_util_apply_filter(
+       savan_subscriber_t *subscriber,
+       const axutil_env_t *env,
+       axiom_node_t *payload);
+
+       /**
+       * Set the filter template for the subscriber
+       * for filtering.
+       * @param subscriber pointer to the subscriber
+       * @param sub_processor, pointer to the sub_processor
+       * @param env, pointer to the environment.
+       * returns success, if operation is successful.
+       */
+    axis2_status_t AXIS2_CALL
+    savan_util_set_filter_template_for_subscriber(
+        savan_subscriber_t *subscriber,
+        savan_sub_processor_t *sub_processor,
+        const axutil_env_t *env);   
+
     savan_message_types_t AXIS2_CALL
     savan_util_get_message_type(
         axis2_msg_ctx_t *msg_ctx,

Modified: webservices/savan/trunk/c/src/client/savan_client.c
URL: 
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/client/savan_client.c?view=diff&rev=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/client/savan_client.c (original)
+++ webservices/savan/trunk/c/src/client/savan_client.c Fri Jul 27 00:16:26 2007
@@ -143,7 +143,7 @@
     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);
+        &filter_node);
     axiom_element_set_text(filter_elem, env, filter, filter_node);
     
     /* send the Subscription and wait for the response */

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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/core/savan_sub_processor.c (original)
+++ webservices/savan/trunk/c/src/core/savan_sub_processor.c Fri Jul 27 
00:16:26 2007
@@ -107,6 +107,9 @@
     expires = savan_util_get_expiry_time(env);
     savan_subscriber_set_expires(subscriber, env, expires);
 
+    /*Set the filter template file for the subscriber*/
+    savan_util_set_filter_template_for_subscriber(subscriber, sub_processor, 
env);
+
     /* Store sub id in msg ctx to be used by the msg receiver */
     id = savan_subscriber_get_id(subscriber, env);
     savan_sub_processor_set_sub_id_to_msg_ctx(env, msg_ctx, id);
@@ -372,7 +375,6 @@
     axutil_qname_free(qname, env);
     
     filter = axiom_element_get_text(filter_elem, env, filter_node);
-    
     savan_subscriber_set_filter(subscriber, env, filter);
     
     topic_epr = axis2_msg_ctx_get_to(msg_ctx, env);

Modified: webservices/savan/trunk/c/src/subscribers/Makefile.am
URL: 
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/subscribers/Makefile.am?view=diff&rev=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/subscribers/Makefile.am (original)
+++ webservices/savan/trunk/c/src/subscribers/Makefile.am Fri Jul 27 00:16:26 
2007
@@ -6,4 +6,9 @@
                @AXIOMINC@ \
                @UTILINC@ \
                @NEETHIINC@ \
-               @AXIS2INC@ 
+               @AXIS2INC@
+
+libsavan_subscribers_la_LIBADD =-lxslt \
+                                -lxml2
+
+

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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/subscribers/savan_subscriber.c (original)
+++ webservices/savan/trunk/c/src/subscribers/savan_subscriber.c Fri Jul 27 
00:16:26 2007
@@ -22,6 +22,8 @@
 
 #include <savan_subscriber.h>
 
+#include <libxslt/xsltutils.h>
+
 struct savan_subscriber_t
 {
     axis2_char_t *id;
@@ -32,6 +34,7 @@
     axis2_char_t *filter;
     axis2_char_t *topic;
     axis2_bool_t renewed;
+    xsltStylesheetPtr xslt_filter;
 };
 
 /*****************************************************************************/
@@ -60,6 +63,7 @@
     subscriber->filter = NULL;
     subscriber->topic = NULL;
     subscriber->renewed = AXIS2_FALSE;
+       subscriber->xslt_filter = NULL;
         
     return subscriber;
 }
@@ -79,11 +83,49 @@
         AXIS2_FREE(env->allocator, subscriber->filter);
     if(subscriber->topic)
         AXIS2_FREE(env->allocator, subscriber->topic);
+    if(subscriber->xslt_filter)
+        AXIS2_FREE(env->allocator, subscriber->xslt_filter);
     AXIS2_FREE(env->allocator, subscriber);
 }
 
 
/******************************************************************************/
 
+void* AXIS2_CALL
+savan_subscriber_get_filter_template(
+    savan_subscriber_t *subscriber,
+    const axutil_env_t *env)
+{
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+    return subscriber->xslt_filter;
+}
+
+/******************************************************************************/
+
+axis2_status_t AXIS2_CALL
+savan_subscriber_set_filter_template(
+    savan_subscriber_t *subscriber,
+    const axutil_env_t *env,
+    void *xslt_filter_template)
+{
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+
+       if (subscriber->filter == NULL)
+       {
+               return AXIS2_SUCCESS;
+       }
+
+    if (subscriber->xslt_filter != NULL)
+    {
+        AXIS2_FREE(env->allocator, subscriber->filter);
+        subscriber->xslt_filter = NULL;
+    }
+    subscriber->xslt_filter = (xsltStylesheetPtr)xslt_filter_template;
+    return AXIS2_SUCCESS;
+}
+
+/******************************************************************************/
+
 axis2_char_t * AXIS2_CALL
 savan_subscriber_get_id(
     savan_subscriber_t *subscriber,
@@ -279,6 +321,9 @@
     to = axis2_endpoint_ref_create(env, address);
     axis2_options_set_to(options, env, to);
     axis2_options_set_xml_parser_reset(options, env, AXIS2_FALSE);
+
+       /* Apply the filter to the payload */
+       payload = (axiom_node_t*)savan_util_apply_filter(subscriber, env, 
payload);
 
     /* Set service client options */
     axis2_svc_client_set_options(svc_client, env, options);

Modified: webservices/savan/trunk/c/src/util/Makefile.am
URL: 
http://svn.apache.org/viewvc/webservices/savan/trunk/c/src/util/Makefile.am?view=diff&rev=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/util/Makefile.am (original)
+++ webservices/savan/trunk/c/src/util/Makefile.am Fri Jul 27 00:16:26 2007
@@ -1,9 +1,16 @@
+datadir=$(prefix)/modules/savan
 noinst_LTLIBRARIES = libsavan_util.la
 
 libsavan_util_la_SOURCES = savan_util.c
 
+data_DATA=template.xsl
 INCLUDES = -I$(top_builddir)/include \
                @AXIOMINC@ \
                @AXIS2INC@ \
                @UTILINC@ \
-               @NEETHIINC@ 
+               @NEETHIINC@
+
+libsavan_util_la_LIBADD =-lxslt \
+                         -lxml2
+
+EXTRA_DIST=template.xml

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=560131&r1=560130&r2=560131
==============================================================================
--- webservices/savan/trunk/c/src/util/savan_util.c (original)
+++ webservices/savan/trunk/c/src/util/savan_util.c Fri Jul 27 00:16:26 2007
@@ -23,9 +23,21 @@
 
 #include <savan_util.h>
 #include <savan_error.h>
+#include <libxslt/xsltutils.h>
 
 
/******************************************************************************/
 
+axis2_status_t
+savan_util_update_filter_template(
+    xmlNodeSetPtr nodes,
+    const xmlChar* value);
+
+axiom_node_t*
+savan_util_create_fault_msg(axis2_char_t *code,
+    axis2_char_t* subcode, axis2_char_t *reason,
+    axis2_char_t* details,
+    const axutil_env_t *env);
+
 static axis2_status_t
 add_subscriber_to_remote_subs_mgr(
     const axutil_env_t *env,
@@ -57,6 +69,136 @@
 process_subscriber_list_node(
     const axutil_env_t *env,
     axiom_node_t *subs_list_node);
+
+axis2_status_t AXIS2_CALL
+savan_util_set_filter_template_for_subscriber(
+    savan_subscriber_t *subscriber,
+    savan_sub_processor_t *sub_processor,
+    const axutil_env_t *env)
+{
+    AXIS2_ENV_CHECK(env, NULL);
+    xsltStylesheetPtr xslt_template_xslt = NULL;
+    xmlDocPtr xslt_template_xml = NULL;
+
+       if(savan_subscriber_get_filter(subscriber, env) == NULL)
+       {
+               return AXIS2_SUCCESS;
+       }
+
+    xslt_template_xml = xmlParseFile("../modules/savan/template.xsl");
+    xmlChar* xpathExpr = (xmlChar*)"//@select";
+    xmlChar* value = (xmlChar*)savan_subscriber_get_filter(subscriber,env);
+    xmlXPathContextPtr xpathCtx = xmlXPathNewContext(xslt_template_xml);
+    xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr, xpathCtx);
+    savan_util_update_filter_template(xpathObj->nodesetval, value);
+
+    xslt_template_xslt = xsltParseStylesheetDoc(xslt_template_xml);
+    savan_subscriber_set_filter_template(subscriber, env, xslt_template_xslt);
+
+       xmlXPathFreeObject(xpathObj);
+       xmlXPathFreeContext(xpathCtx);
+
+    return AXIS2_SUCCESS;
+}
+
+axiom_node_t * AXIS2_CALL
+savan_util_apply_filter(
+    savan_subscriber_t *subscriber,
+    const axutil_env_t *env,
+    axiom_node_t *payload)
+{
+    xmlChar *buffer = NULL;
+    int size = 0;
+    axis2_char_t *payload_string = NULL;
+    xmlDocPtr payload_doc = NULL;
+    xsltStylesheetPtr xslt_template_filter = NULL;
+
+       if(savan_subscriber_get_filter(subscriber, env) == NULL)
+       {
+               return payload;
+       }
+
+    payload_string = axiom_node_to_string(payload, env);
+
+    payload_doc = (xmlDocPtr)xmlParseDoc((xmlChar*)payload_string);
+
+    xslt_template_filter = 
+               
(xsltStylesheetPtr)savan_subscriber_get_filter_template(subscriber,
+        env);
+
+    xmlDocPtr result_doc = (xmlDocPtr)xsltApplyStylesheet(xslt_template_filter,
+        payload_doc, NULL);
+
+    xmlDocDumpMemory(result_doc, &buffer, &size);
+
+    axiom_xml_reader_t *reader = axiom_xml_reader_create_for_memory(env, 
+               (char*)buffer,axutil_strlen((char*)buffer), 
+               NULL, AXIS2_XML_PARSER_TYPE_BUFFER);
+    axiom_stax_builder_t *om_builder = axiom_stax_builder_create(env, reader);
+    axiom_document_t *document = axiom_stax_builder_get_document(om_builder, 
+               env);
+    axiom_node_t *node = axiom_document_build_all(document, env);
+
+       if(node == NULL)
+       {
+               node = savan_util_create_fault_msg("CODE", 
"FilteringRequestedUnavailabe", 
+                       "Requested Filter dialect is not supported", "DETAILS", 
env);
+       }
+
+    axiom_stax_builder_free_self(om_builder, env);
+       axiom_node_free_tree(payload, env);
+    free(payload_string);
+       xmlFreeDoc(result_doc);
+
+    return node;
+}
+
+axis2_status_t 
+savan_util_update_filter_template(
+    xmlNodeSetPtr nodes,
+    const xmlChar* value)
+{
+    int size;
+    int i;
+    size = (nodes) ? nodes->nodeNr : 0;
+    for(i = size - 1; i >= 0; i--) 
+       {
+       xmlNodeSetContent(nodes->nodeTab[i], value);
+       if (nodes->nodeTab[i]->type != XML_NAMESPACE_DECL)
+               nodes->nodeTab[i] = NULL;
+    }
+    return AXIS2_SUCCESS;
+}
+
+axiom_node_t*
+savan_util_create_fault_msg(axis2_char_t *code,
+    axis2_char_t* subcode, axis2_char_t *reason,
+       axis2_char_t* details,
+       const axutil_env_t *env)
+{
+    axiom_node_t *fault_node = NULL;
+    axiom_element_t *fault_ele = NULL;
+    axiom_node_t *fault_reason_node = NULL;
+    axiom_element_t *fault_reason_ele = NULL;
+    axiom_node_t *fault_code_node = NULL;
+    axiom_element_t *fault_code_ele = NULL;
+
+       /*
+    axiom_node_t *fault_subcode_node = NULL;
+    axiom_element_t *fault_subcode_ele = NULL;
+    axiom_node_t *fault_details_node = NULL;
+    axiom_element_t *fault_details_ele = NULL;
+       */
+
+    fault_ele = axiom_element_create(env, NULL, "Fault", NULL, &fault_node);
+       fault_code_ele = axiom_element_create(env, fault_node, "faultcode", 
+               NULL, &fault_code_node);
+    axiom_element_set_text(fault_code_ele, env, subcode, fault_code_node);
+       fault_reason_ele = axiom_element_create(env, fault_node, "faultstring", 
+               NULL, &fault_reason_node);
+    axiom_element_set_text(fault_reason_ele, env, reason, fault_reason_node);
+    return fault_node;
+}
 
 savan_message_types_t AXIS2_CALL
 savan_util_get_message_type(


Reply via email to