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(