axis-c-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dave Meier" <DMe...@SERENA.com>
Subject RE: Help needed on building custom soap fault in axis2c
Date Fri, 18 Jan 2008 00:36:38 GMT
I tried the proposed solution for 1.1.0, but it didn't work.  I am using
1.2.0 so the code may have changed.

Anyway, the following code worked well for me to get my custom error
message sent in the faultstring:

  // status.GetMessage() returns a const char*
  axis2_char_t* msg = (axis2_char_t*) axutil_strdup( env,
const_cast<char*>( status.GetMessage() ) );
  axutil_error_set_error_message( env->error, msg );
  AXIS2_ERROR_SET( env->error,  (enum axutil_error_codes)
AXUTIL_ERROR_MAX, AXIS2_FAILURE );

The code in axutil_error_get_message() (error.c) will only use
error->message if the code is > AXUTIL_ERROR_MAX.

Note that I had to cast to (enum axutil_error_codes) because I have this
code in a .cpp file.

-Dave.

-----Original Message-----
From: Samisa Abeysinghe [mailto:samisa@wso2.com] 
Sent: Thursday, October 04, 2007 11:18 PM
To: Apache AXIS C User List
Subject: Re: Help needed on building custom soap fault in axis2c


Samisa Abeysinghe wrote:
> Subra A Narayanan wrote:
>> Hi Dimuthu,
>>
>> I am using the solution you suggested in your last mail. That 
>> solution is perfect for my application. But I have some concerns. I 
>> saw this line in your code
>>
>> #define MYSERVICE_ERROR_CODES_START (AXIS2_ERROR_LAST + 2000)
>>
>>
>> Will this cause any problems in the future? What if the value of 
>> AXIS2_ERROR_LAST changes? Or what if some other axis2 component (like

>> sandesha or neethi or something else) uses error codes in the same 
>> range? Will I be forced to change my code because of the above 
>> scenarios?
> Yes there is a problem that one would take over this value.
> The solution for this is to define the "register" the error block 
> sizes with Axis2/C axutil_error.h so that there is no room to take 
> over the range.
>
> e.g.
> #define AXUTIL_ERROR_MESSAGE_BLOCK_SIZE 2000 #define 
> NEETHI_ERROR_CODES_START (AXIS2_ERROR_LAST +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
> #define RAMPART_ERROR_CODES_START (NEETHI_ERROR_CODES_START +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
> #define SANDESHA2_ERROR_CODES_START (RAMPART_ERROR_CODES_START +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
> #define SAVAN_ERROR_CODES_START (SANDESHA2_ERROR_CODES_START +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
> #define USER_ERROR_CODES_START (SAVAN_ERROR_CODES_START +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
>
> In the future, if we need to add another XYZ error block, we can 
> #define XYZ_ERROR_CODES_START (USER_ERROR_CODES_START +
> AXUTIL_ERROR_MESSAGE_BLOCK_SIZE)
>
BTW, what I am proposing is a future design to solve the situation.
With the current release, 1.1.0, you can use the following for a custom
error:

axutil_error_set_error_message(env->error, error_message);
AXIS2_ERROR_SET(env->error, AXIS2_ERROR_LAST + 1, AXIS2_FAILURE);

We need to improve our error model based on my earlier discussion.

Thanks,
Samisa...
> Samisa...
>>
>> Any help is greatly appreciated.
>>
>> Subra
>>
>>
>>
>> On 10/1/07, *Dimuthu Gamage* <dimuthuc@gmail.com 
>> <mailto:dimuthuc@gmail.com> > wrote:
>>
>>     Hi Sathya,
>>
>>     Please check the attachment. This tries to use custom error
codes.
>>     (mostly follow the way Sandhesha/C is using their custom error
>>     messages)
>>     Anyway still functions like  "axutil_error_get_message" are too
>>     inflexible to work with custom error codes. So we need to define
>>     our version of the same function.
>>
>>     Thanks
>>     Dimuthu
>>
>>
>>     On 10/1/07, *Sathya Raghunathan* < pappu.raghunathan@gmail.com
>>     <mailto:pappu.raghunathan@gmail.com>> wrote:
>>
>>         If i have build a soap fault based on an error code, should i
>>         create a global variable in axutil_error_init() function? Can
>>         i make use of the axutil_error_messages array?
>>                  Thanks
>>         Sathya
>>
>>                  On 9/29/07, *Dimuthu Gamage* < dimuthuc@gmail.com
>>         <mailto:dimuthuc@gmail.com>> wrote:
>>
>>             HI  Sathya,
>>
>>             you can follow the attachments. I didnt test it, but it
>>             may give some hints to do your work.
>>             If you want to build a soap fault base on an error code,
>>             you need to keep a global variable to keep the error code
>>             and build the soap exception based on that.
>>
>>             So It is clear we should have a better mechanism than
this
>>             to do that, I think there was a discussion earlier in the
>>             same topic in the list sometime ago. We should quickly
>>             figure out a good way to do this and fix the code
>>             generation templates.
>>
>>             Thanks
>>             Dimuthu
>>
>>
>>
>>                 /*axiom_element_set_text(error_ele, env,
>>             adb_MyFirstException_get_text(_MyFirstException,env),
>>                                     error_node); */
>>
>>                     /** instead use following */
>>
>>                     another_node =
>>             adb_MyFirstException_serialize(_MyFirstException, env,
>>             NULL, AXIS2_FALSE);
>>                     axiom_node_add_child(error_node, env, 
>> another_node);
>>
>>
>>             IN the client side axis2_stub_MyService.c should be
>>             changed like following.
>>
>>
>>             ret_node =  axis2_svc_client_send_receive_with_op_qname(
>>             svc_client, env, op_qname, payload);
>>
>>             /** Just before this line, add following */
>>
>>                         if(ret_node && axiom_node_get_data_element(
>>             ret_node, env) &&
>>                                 axutil_strcmp("fault",
>>                                                 
>> axiom_element_get_localname((axiom_element_t
>>             *)axiom_node_get_data_element( ret_node, env), env)))
>>                         {
>>                             /** adb_MyFirstException_t*
>>             _MyFirstException should be declared */
>>                             _MyFirstException =
>>             adb_MyFirstException_create(env);
>>                                        
>> adb_MyFirstException_deserialize(_MyFirstException, env,
>>             axiom_node_get_first_child( ret_node));
>>
>>                             /** so you have the same
_MyFirstException
>>             you created at
>>                              * onfault is here, just do the
processing
>>             at here manually */
>>
>>                         }
>>
>>             On 9/29/07, *Sathya Raghunathan* <
>>             pappu.raghunathan@gmail.com
>>             <mailto:pappu.raghunathan@gmail.com>> wrote:
>>
>>                 If you just check the
>>                 axis2_svc_skel_MyService_on_fault() in the attached
>>                 file, please let me know if i have modified it
>>                 correctly or not. Is this the way to do? If i test
>>                 that out, the server crashes. If i comment out the
>>                 object myfirstexception from it, i can see that a
>>                 fault element is set in the output with some message
>>                 that i hardcoded there.
>>                                  Please guide me with the proper step

>> of building the
>>                 custom fault in that function.
>>                                  Thanks
>>                 Sathya
>>
>>                                  On 9/29/07, *Sathya Raghunathan*
>>                 <pappu.raghunathan@gmail.com
>>                 <mailto:pappu.raghunathan@gmail.com>> wrote:
>>
>>                     Hi Dimuthu,
>>                                          Do you have any example 
>> custom soap fault wsdl? I
>>                     am not clear with this concept I tried a new
>>                     example, since you found some problems with my
>>                     last wsdl file. I have attached the wsdl file. In
>>                     that, there is one myOperationRequest which is a
>>                     string, and a myOperationResponse which is also a
>>                     string. There are two custom faults here,
>>                     MyFirstException and MySecondException. With this
>>                     wsdl, the service function that was generated was
>>                     as below:
>>                                          adb_myOperationResponse_t*
>>                     axis2_skel_MyService_myOperation (const
>>                     axutil_env_t *env  ,
>>                                                                  
>>                     adb_myOperation_t* myOperation )
>>                             {
>>                                  adb_myOperationResponse_t
*myResponse;
>>                               /* TODO fill this with the necessary
>>                     business logic */
>>
>>                                     axis2_char_t *myInpMsg =
>>                     adb_myOperation_get_myInput(myOperation,env);
>>                                     printf("My input message =
>>                     %s\n",myInpMsg);
>>                                     if (strcmp(myInpMsg,"Bad
>> server")==0)
>>                                     {
>>                                            //What is the way to throw
>>                     the exception here?
>>                                             return NULL;
>>                                    }
>>                               // Assuming the myResponse object is
>>                     created
>>                               return myResponse;
>>                             }
>>
>>
>>                     You have told me to modify the
>>                     axis2_svc_skel_MyService_on_fault() function to
>>                     build custom faults. Does that mean that i have
to
>>                     create an object of myFirstException inside that?
>>                     Should the service function just return NULL?
>>                     Suppose i call a function that has some business
>>                     logic that return error code inside
>>                     axis2_skel_MyService_myOperation, and i want to
>>                     throw an exception (with an error message) based
>>                     on that error code, how exactly should i do it?
>>                     Can you help me out?
>>
>>                     Thanks
>>                     Sathya
>>
>>                     
>>                                                               
>>
>>
>>
>>             
>> ---------------------------------------------------------------------
>>             To unsubscribe, e-mail:
>>             axis-c-user-unsubscribe@ws.apache.org
>>             <mailto:axis-c-user-unsubscribe@ws.apache.org>
>>             For additional commands, e-mail:
>>             axis-c-user-help@ws.apache.org
>>             <mailto:axis-c-user-help@ws.apache.org>
>>
>>
>>
>>
>>     
>> ---------------------------------------------------------------------
>>     To unsubscribe, e-mail: axis-c-user-unsubscribe@ws.apache.org
>>     <mailto:axis-c-user-unsubscribe@ws.apache.org>
>>     For additional commands, e-mail: axis-c-user-help@ws.apache.org
>>     <mailto:axis-c-user-help@ws.apache.org>
>>
>>
>
>


--
Samisa Abeysinghe : WSO2 WSF/PHP
"http://wso2.org/projects/wsf/php?WSO2&nbsp;Web&nbsp;Services&nbsp;Frame
work%2FPHP&nbsp;-&nbsp;Open&nbsp;source&nbsp;PHP&nbsp;extention&nbsp;for
&nbsp;providing&nbsp;and&nbsp;consuming&nbsp;Web&nbsp;services&nbsp;in&n
bsp;PHP"


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-c-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-c-user-help@ws.apache.org


**********************************************************************
This email and any files transmitted with it are confidential and intended solely for the
use of the individual or entity to whom they are addressed. Any unauthorized review, use,
disclosure or distribution is prohibited. If you are not the intended recipient, please contact
the sender by reply e-mail and destroy all copies of the original message. 
**********************************************************************


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-c-user-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-c-user-help@ws.apache.org


Mime
View raw message