You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sa...@apache.org on 2006/05/06 12:54:18 UTC

svn commit: r400283 - in /webservices/axis2/trunk/c: include/axis2_op_client.h modules/core/clientapi/op_client.c modules/core/clientapi/svc_client.c samples/user_guide/clients/Makefile.am samples/user_guide/clients/echo_blocking_dual.c

Author: samisa
Date: Sat May  6 03:54:14 2006
New Revision: 400283

URL: http://svn.apache.org/viewcvs?rev=400283&view=rev
Log:
Fixes to get use seperate listner working

Added:
    webservices/axis2/trunk/c/samples/user_guide/clients/echo_blocking_dual.c
Modified:
    webservices/axis2/trunk/c/include/axis2_op_client.h
    webservices/axis2/trunk/c/modules/core/clientapi/op_client.c
    webservices/axis2/trunk/c/modules/core/clientapi/svc_client.c
    webservices/axis2/trunk/c/samples/user_guide/clients/Makefile.am

Modified: webservices/axis2/trunk/c/include/axis2_op_client.h
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/include/axis2_op_client.h?rev=400283&r1=400282&r2=400283&view=diff
==============================================================================
--- webservices/axis2/trunk/c/include/axis2_op_client.h (original)
+++ webservices/axis2/trunk/c/include/axis2_op_client.h Sat May  6 03:54:14 2006
@@ -38,6 +38,7 @@
 #include <axis2_options.h>
 #include <axis2_msg_ctx.h>
 #include <axis2_callback.h>
+#include <callback_recv.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -170,6 +171,12 @@
 	axis2_op_ctx_t* (AXIS2_CALL *
 	get_operation_context)(struct axis2_op_client *op_client);
 
+    axis2_status_t (AXIS2_CALL *
+    set_callback_recv)(
+        struct axis2_op_client *op_client, 
+        axis2_env_t **env,
+        axis2_callback_recv_t *callback_recv);
+
 	axis2_status_t (AXIS2_CALL *
 	free)(struct axis2_op_client *op_client,
 				axis2_env_t **env);
@@ -220,6 +227,9 @@
 
 #define AXIS2_OP_CLIENT_FREE(op_client, env) \
 		((op_client)->ops->free(op_client, env))
+
+#define AXIS2_OP_CLIENT_SET_CALLBACK_RECV(op_client, env, callback_recv) \
+		((op_client)->ops->set_callback_recv(op_client, env, callback_recv))
 
 /************************** End of function macros ****************************/    
 

Modified: webservices/axis2/trunk/c/modules/core/clientapi/op_client.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/clientapi/op_client.c?rev=400283&r1=400282&r2=400283&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/clientapi/op_client.c (original)
+++ webservices/axis2/trunk/c/modules/core/clientapi/op_client.c Sat May  6 03:54:14 2006
@@ -19,7 +19,8 @@
 #include <axis2_hash.h>
 #include <axis2_mep_client.h>
 #include <axis2_uuid_gen.h>
-#include <listener_manager.h> /*TODO:change too axis2_listener_manager.h*/
+#include <listener_manager.h> 
+#include <axis2_engine.h>
 
 typedef struct axis2_op_client_impl
 {
@@ -39,6 +40,7 @@
 	axis2_bool_t completed;
     /* to hold the locally created async result */
     axis2_async_result_t *async_result;
+    axis2_callback_recv_t *callback_recv;
 } axis2_op_client_impl_t;
 
 /** Interface to implementation conversion macro */
@@ -106,6 +108,11 @@
 axis2_op_client_get_operation_context(struct axis2_op_client *op_client);
 
 axis2_status_t AXIS2_CALL
+axis2_op_client_set_callback_recv(struct axis2_op_client *op_client, 
+    axis2_env_t **env,
+    axis2_callback_recv_t *callback_recv);
+
+axis2_status_t AXIS2_CALL
 axis2_op_client_free(struct axis2_op_client *op_client, 
 						axis2_env_t **env);
 
@@ -137,6 +144,7 @@
     op_client_impl->callback = NULL;
     op_client_impl->completed = AXIS2_FALSE;
     op_client_impl->async_result = NULL;
+    op_client_impl->callback_recv = NULL;
     
 	op_client_impl->options = options;
 	op_client_impl->svc_ctx = svc_ctx;
@@ -397,6 +405,21 @@
 
 	if (AXIS2_OPTIONS_IS_USE_SEPERATE_LISTENER(op_client_impl->options, env))
 	{
+        axis2_engine_t *engine = NULL;
+        
+        AXIS2_CALLBACK_RECV_ADD_CALLBACK(op_client_impl->callback_recv, env, 
+            AXIS2_MSG_CTX_GET_MSG_ID(msg_ctx, env),
+            op_client_impl->callback);
+        /* TODO: set up reply to */
+        AXIS2_MSG_CTX_SET_OP_CTX(msg_ctx, env, AXIS2_OP_FIND_OP_CTX(op, env, 
+            msg_ctx, op_client_impl->svc_ctx));
+        AXIS2_MSG_CTX_SET_SVC_CTX(msg_ctx, env, op_client_impl->svc_ctx);
+
+        /* send the message */
+        engine = axis2_engine_create(env, conf_ctx);
+        if (!engine)
+            return AXIS2_FAILURE;
+        AXIS2_ENGINE_SEND(engine, env, msg_ctx);
 	}
 	else
 	{
@@ -558,6 +581,7 @@
 	op_client->ops->reset = axis2_op_client_reset;
 	op_client->ops->compelete = axis2_op_client_compelete;
 	op_client->ops->get_operation_context = axis2_op_client_get_operation_context;
+    op_client->ops->set_callback_recv = axis2_op_client_set_callback_recv;
 	op_client->ops->free = axis2_op_client_free;
 }
 
@@ -598,4 +622,14 @@
     AXIS2_CALLBACK_SET_COMPLETE(args_list->callback, thread_env, AXIS2_TRUE);
     
     return NULL; 
+}
+
+axis2_status_t AXIS2_CALL
+axis2_op_client_set_callback_recv(struct axis2_op_client *op_client, 
+    axis2_env_t **env,
+    axis2_callback_recv_t *callback_recv)
+{
+	AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+	AXIS2_INTF_TO_IMPL(op_client)->callback_recv = callback_recv;
+	return AXIS2_SUCCESS;
 }

Modified: webservices/axis2/trunk/c/modules/core/clientapi/svc_client.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/modules/core/clientapi/svc_client.c?rev=400283&r1=400282&r2=400283&view=diff
==============================================================================
--- webservices/axis2/trunk/c/modules/core/clientapi/svc_client.c (original)
+++ webservices/axis2/trunk/c/modules/core/clientapi/svc_client.c Sat May  6 03:54:14 2006
@@ -576,6 +576,9 @@
                     axis2_om_node_t *payload)
 {
 	axis2_svc_client_impl_t *svc_client_impl = NULL;
+    axis2_soap_envelope_t *soap_envelope = NULL;
+    axis2_soap_body_t *soap_body = NULL;
+    axis2_om_node_t *soap_node = NULL;
 
 	AXIS2_ENV_CHECK(env, NULL);
 
@@ -583,16 +586,77 @@
 
 	if (AXIS2_OPTIONS_IS_USE_SEPERATE_LISTENER(svc_client_impl->options, env))
 	{
-		return NULL;
+        axis2_callback_t *callback = NULL;
+        axis2_status_t status = AXIS2_FAILURE;
+        long index = 0;
+        
+
+        /*axis2_char_t *address = NULL;
+        axis2_char_t *epr_address = NULL;
+        property = axis2_property_create(env);
+        AXIS2_PROPERTY_SET_SCOPE(property, env, AXIS2_SCOPE_REQUEST);
+        epr_address = AXIS2_ENDPOINT_REF_GET_ADDRESS(call_impl->to, env);
+		address = AXIS2_STRDUP(epr_address, env);
+        AXIS2_PROPERTY_SET_VALUE(property, env, address);
+        AXIS2_MSG_CTX_SET_PROPERTY(msg_ctx, env,
+                                    AXIS2_TRANSPORT_URL, property, AXIS2_FALSE);
+        */
+        
+        /* This means doing a Request-Response invocation using two channels. 
+        If the transport is a two way transport (e.g. http), only one channel is used
+        (e.g. in http cases 202 OK is sent to say no repsone avalible). 
+        Axis2 gets blocked and return when the response is avalible.
+        */
+        
+        callback = axis2_callback_create(env);
+        if (!callback)
+            return NULL;
+        
+        /* call two channel non blocking invoke to do the work and wait on the callbck */
+        axis2_svc_client_send_receive_non_blocking_with_operation(
+            svc_client, env, op_qname, payload, callback);
+                
+        index = AXIS2_OPTIONS_GET_TIMEOUT_IN_MILLI_SECONDS(svc_client_impl->options, env) / 10;
+        while (!(AXIS2_CALLBACK_GET_COMPLETE(callback, env))) 
+        {
+            /*wait till the reponse arrives*/
+            if (index-- >= 0) 
+            {
+                AXIS2_USLEEP(10000);
+            } 
+            else 
+            {
+                AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_RESPONSE_TIMED_OUT, AXIS2_FAILURE);
+                return NULL;
+            }
+        }
+        
+        soap_envelope = AXIS2_CALLBACK_GET_ENVELOPE(callback, env);
+        /* process the result of the invocation */
+        /*if (AXIS2_CALLBACK_GET_ENVELOPE(callback, env))
+        {
+            axis2_msg_ctx_t *response_msg_ctx =
+                    axis2_msg_ctx_create(env, AXIS2_SVC_CTX_GET_CONF_CTX(svc_ctx, env), NULL, NULL);
+            if (!response_msg_ctx)
+                return NULL;
+            AXIS2_MSG_CTX_SET_SOAP_ENVELOPE(response_msg_ctx, env, AXIS2_CALLBACK_GET_ENVELOPE(callback, env));
+            return response_msg_ctx;
+        } 
+        else */
+        if (!soap_envelope)
+        {
+            if (AXIS2_CALLBACK_GET_ERROR(callback, env) != AXIS2_ERROR_NONE)
+            {
+                AXIS2_ERROR_SET((*env)->error, AXIS2_CALLBACK_GET_ERROR(callback, env), AXIS2_FAILURE);
+                return NULL;
+            }
+        }
 	}
 	else
 	{
 		axis2_op_client_t *op_client = NULL;
 		axis2_msg_ctx_t *res_msg_ctx = NULL;
 		axis2_msg_ctx_t *msg_ctx = NULL;
-		axis2_soap_envelope_t *soap_envelope = NULL;
-		axis2_soap_body_t *soap_body = NULL;
-		axis2_om_node_t *soap_node = NULL;
 
         msg_ctx = axis2_msg_ctx_create(env, 
             AXIS2_SVC_CTX_GET_CONF_CTX(svc_client_impl->svc_ctx, env), NULL, NULL);
@@ -618,24 +682,26 @@
 		}
 
         soap_envelope = AXIS2_MSG_CTX_GET_SOAP_ENVELOPE(res_msg_ctx, env);
-        if (!soap_envelope)
-        {
-			return NULL;
-		}
-        soap_body = AXIS2_SOAP_ENVELOPE_GET_BODY(soap_envelope, env);
-
-        if (!soap_body)
-        {
-			return NULL;
-		}
         
-        soap_node = AXIS2_SOAP_BODY_GET_BASE_NODE(soap_body, env);
-        if (!soap_node)
-        {
-			return NULL;
-		}
-        return AXIS2_OM_NODE_GET_FIRST_CHILD(soap_node, env);
 	}
+    
+    if (!soap_envelope)
+    {
+        return NULL;
+    }
+    soap_body = AXIS2_SOAP_ENVELOPE_GET_BODY(soap_envelope, env);
+
+    if (!soap_body)
+    {
+        return NULL;
+    }
+    
+    soap_node = AXIS2_SOAP_BODY_GET_BASE_NODE(soap_body, env);
+    if (!soap_node)
+    {
+        return NULL;
+    }
+    return AXIS2_OM_NODE_GET_FIRST_CHILD(soap_node, env);
 }
 
 
@@ -693,7 +759,12 @@
     
     if (AXIS2_OPTIONS_IS_USE_SEPERATE_LISTENER(svc_client_impl->options, env))
     {
-		return;
+        axis2_op_t *op = AXIS2_SVC_GET_OP_WITH_QNAME(svc_client_impl->svc, env, 
+            op_qname);
+        AXIS2_OP_SET_MSG_RECEIVER(op, env, 
+            AXIS2_CALLBACK_RECV_GET_BASE(svc_client_impl->callback_recv, env));
+        AXIS2_OP_CLIENT_SET_CALLBACK_RECV(op_client, env, 
+            svc_client_impl->callback_recv);
 	}
     
     AXIS2_OP_CLIENT_EXECUTE(op_client, env, AXIS2_FALSE);
@@ -831,45 +902,33 @@
 									axis2_char_t *client_home)
 {
 	axis2_listener_manager_t *listener_manager = NULL;
-
-	if (conf_ctx)
-	{
-		svc_client_impl->conf_ctx = conf_ctx;
-		/*TODO:uncomment once implemented
-		listener_manager = AXIS2_CONF_CTX_GET_LISTENER_MANAGER(conf_ctx, env);
-		*/
-    	if (!listener_manager)
-    	{
-		    listener_manager = axis2_listener_manager_create(env);
-			if (!listener_manager)
-			{
-				AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-        		return AXIS2_FALSE;
-			}
-			/*TODO:uncomment once implemented
-			AXIS2_LISTENER_MANAGER_INIT(listener_manager, conf_ctx);
-			*/
-    	}
-
-	}
-	else
-	{
-		svc_client_impl->conf_ctx = build_client_conf_ctx(env, client_home);
-		if (!svc_client_impl->conf_ctx)
+    axis2_char_t *transport_in_protocol = NULL;
+    
+    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
+    
+    svc_client_impl->conf_ctx = conf_ctx;
+    if (!(svc_client_impl->conf_ctx))
+    {
+        svc_client_impl->conf_ctx = build_client_conf_ctx(env, client_home);
+		if (!(svc_client_impl->conf_ctx))
 		{
-			AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
 			return AXIS2_FALSE;
 		}
-		listener_manager = axis2_listener_manager_create(env);
-		if (!listener_manager)
-        {
-            AXIS2_ERROR_SET((*env)->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-            return AXIS2_FALSE;
-        }
-		/*TODO:uncomment when implemented
-		AXIS2_LISTENER_MANAGER_INIT(listener_manager, svc_client_impl->conf_ctx);
-		*/
+    }
+    
+	listener_manager = axis2_listener_manager_create(env);
+	if (!listener_manager)
+	{
+        return AXIS2_FALSE;
 	}
+    
+    transport_in_protocol = AXIS2_OPTIONS_GET_TRANSPORT_IN_PROTOCOL(
+        svc_client_impl->options, env);
+    if (!transport_in_protocol)
+        transport_in_protocol = AXIS2_TRANSPORT_HTTP;
+    AXIS2_LISTNER_MANAGER_MAKE_SURE_STARTED(listener_manager, env, 
+        transport_in_protocol, svc_client_impl->conf_ctx);
+
 	return AXIS2_TRUE;
 }
 

Modified: webservices/axis2/trunk/c/samples/user_guide/clients/Makefile.am
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/samples/user_guide/clients/Makefile.am?rev=400283&r1=400282&r2=400283&view=diff
==============================================================================
--- webservices/axis2/trunk/c/samples/user_guide/clients/Makefile.am (original)
+++ webservices/axis2/trunk/c/samples/user_guide/clients/Makefile.am Sat May  6 03:54:14 2006
@@ -1,12 +1,14 @@
 prgbindir=$(prefix)/bin/samples
-prgbin_PROGRAMS = echo_blocking echo_non_blocking echo_blocking_addr echo_rest
+prgbin_PROGRAMS = echo_blocking echo_non_blocking echo_blocking_addr echo_rest echo_blocking_dual
 samplesdir=$(prefix)/samples/user_guide/clients
-samples_DATA=echo_util.h echo_util.c echo_blocking.c echo_non_blocking.c echo_blocking_addr.c echo_rest.c Makefile.am Makefile.in
+samples_DATA=echo_util.h echo_util.c echo_blocking.c echo_non_blocking.c echo_blocking_addr.c echo_rest.c \
+    Makefile.am Makefile.in echo_blocking_dual.c
 
 echo_blocking_SOURCES = echo_blocking.c echo_util.c
 echo_non_blocking_SOURCES = echo_non_blocking.c echo_util.c
 echo_blocking_addr_SOURCES = echo_blocking_addr.c echo_util.c
 echo_rest_SOURCES = echo_util.c echo_rest.c
+echo_blocking_dual_SOURCES = echo_blocking_dual.c echo_util.c
 
 LINK_FLAGS = $(LDFLAGS) \
              -L$(AXIS2C_HOME)/lib \
@@ -27,6 +29,7 @@
 echo_non_blocking_LDADD = $(LINK_FLAGS)
 echo_blocking_addr_LDADD = $(LINK_FLAGS)
 echo_rest_LDADD = $(LINK_FLAGS)
+echo_blocking_dual_LDADD = $(LINK_FLAGS)
 
 INCLUDES = -I$(AXIS2C_HOME)/include \
             -I$(AXIS2C_HOME)/platforms

Added: webservices/axis2/trunk/c/samples/user_guide/clients/echo_blocking_dual.c
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/c/samples/user_guide/clients/echo_blocking_dual.c?rev=400283&view=auto
==============================================================================
--- webservices/axis2/trunk/c/samples/user_guide/clients/echo_blocking_dual.c (added)
+++ webservices/axis2/trunk/c/samples/user_guide/clients/echo_blocking_dual.c Sat May  6 03:54:14 2006
@@ -0,0 +1,120 @@
+/*
+ * 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 "echo_util.h"
+#include <axis2_util.h>
+#include <axis2_soap.h>
+#include <axis2_client.h>
+
+int main(int argc, char** argv)
+{
+    axis2_env_t *env = NULL;
+    axis2_char_t *address = NULL;
+    axis2_endpoint_ref_t* endpoint_ref = NULL;
+    axis2_endpoint_ref_t* reply_to = NULL;
+    axis2_options_t *options = NULL;
+    axis2_char_t *client_home = NULL;
+    axis2_svc_client_t* svc_client = NULL;
+    axis2_om_node_t *payload = NULL;
+    axis2_om_node_t *ret_node = NULL;
+   
+    /* Set up the envioronment */
+    env = axis2_env_create_all("echo_blocking_dual.log", AXIS2_LOG_LEVEL_TRACE);
+
+    /* Set end point reference of echo service */
+    address = "http://localhost:9090/axis2/services/echo";
+    if (argc > 1 )
+        address = argv[1];
+    if (AXIS2_STRCMP(address, "-h") == 0)
+    {
+        printf("Usage : %s [endpoint_url]\n", argv[0]);
+        printf("use -h for help\n");
+        return 0;
+    }
+    printf ("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_USE_SEPERATE_LISTENER(options, &env, AXIS2_TRUE);
+    
+    /* Seperate listner needs addressing, hence addressing stuff in options */
+    AXIS2_OPTIONS_SET_ACTION(options, &env,
+        "http://ws.apache.org/axis2/c/samples/echoString");
+    reply_to = axis2_endpoint_ref_create(&env, "http://localhost:6060/axis2/services/__ANONYMOUS_SERVICE__/__OPERATION_OUT_IN__");
+    AXIS2_OPTIONS_SET_REPLY_TO(options, &env, reply_to);
+
+    /* 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 = 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));
+    }
+
+    /* Set service client options */
+    AXIS2_SVC_CLIENT_SET_OPTIONS(svc_client, &env, options);    
+
+    /* Build the SOAP request message payload using OM API.*/
+    payload = build_om_payload_for_echo_svc(&env);
+    
+    /* Send request */
+    ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, &env, payload);
+    
+    if(ret_node)
+    {
+        axis2_char_t *om_str = NULL;
+        om_str = AXIS2_OM_NODE_TO_STRING(ret_node, &env);
+        if (om_str)
+            printf("\nReceived OM : %s\n", om_str);
+        printf("\necho client invoke SUCCESSFUL!\n");
+    }
+    else
+    {
+		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));
+        printf("echo client invoke FAILED!\n");
+    }
+    
+    if (svc_client)
+    {
+        AXIS2_SVC_CLIENT_FREE(svc_client, &env);
+        svc_client = NULL;
+    }
+    if (endpoint_ref)
+    {
+        AXIS2_ENDPOINT_REF_FREE(endpoint_ref, &env);
+        endpoint_ref = NULL;
+    }
+    return 0;
+}