Hi,

Thank you very much for the quick response. I will look into these
approaches and keep you posted regarding the progress.

Best Regards,
Natasha Wijesekare

On Tue, Mar 29, 2016 at 12:19 PM, Nandika Jayawardana <[email protected]>
wrote:

> That approach looks promising. Another option is to use the membrane SOA
> library we used human task rendering implementation to construct the soap
> payload. Also take a look into the existing activiti web services task. If
> we can take the existing web services task from activiti and make it
> production ready, that should also be fine.
>
> Regards
> Nandika
>
> On Tue, Mar 29, 2016 at 10:57 AM, Hasitha Aravinda <[email protected]>
> wrote:
>
>> Yes, IMO this approach is very complicated and we will face more
>> issues when we are going to integrate with WebService Task. Can you have a
>> look at [1] and try that ?
>>
>> ​[1] -
>> http://stackoverflow.com/questions/6849892/whats-a-good-java-library-for-dynamic-soap-client-operations
>> ​
>>
>> Thanks,
>> Hasitha.
>>
>> On Mon, Mar 28, 2016 at 12:07 PM, Natasha Wijesekara <[email protected]>
>> wrote:
>>
>>>  Hi,
>>>
>>> There are many complexities when trying to implement a SOAP client using
>>> the dynamic client capability of Apache CXF. I was able to provide a
>>> workaround for the error which occurred when passing parameters to a SOAP
>>> operation with Apache CXF .
>>>
>>> The workaround provided does not work with WSDLs which have complex
>>> types as the request or response message type  i.e. the request/response
>>> message parts of the WSDL can be primitive or complex, so 2 different
>>> approaches should be followed to get/set the values of the primitive and
>>> complex types respectively. When having complex types, the message part is
>>> iterated over multiple times, which will take more processing time and
>>> reduce the performance.
>>>
>>> The approach I used is described below. By using this approach the
>>> JaxWsDynamicClientFactory takes care of generating Java classes for complex
>>> types :
>>>
>>> Create a new instance of the Client using the JaxWsDynamicClientFactory by
>>> passing the wsdl url. The url of the WSDL, operation name and the input
>>> variables is provided by the user.
>>>
>>>
>>>
>>>
>>>
>>> *JaxWsDynamicClientFactory factory =
>>> JaxWsDynamicClientFactory.newInstance();URL wsdlURL = new
>>> URL("http://localhost:9763/services/DivisionProcessService?wsdl
>>> <http://10.100.4.192:9763/services/DivisionProcessService?wsdl>");String
>>> operationName = "process";Client client =
>>> factory.createClient(wsdlURL.toExternalForm());ClientImpl clientImpl =
>>> (ClientImpl) client;*
>>>
>>> Get the endpoint i.e. the URL where the web service can be accessed by a
>>> client application using the cilent.
>>>
>>> *Endpoint endpoint = clientImpl.getEndpoint();*
>>>
>>> Get the target namespace of the WSDL by creating a ServiceInfo object
>>> which walks over the CXF service model
>>>
>>> *ServiceInfo serviceInfo =
>>> endpoint.getService().getServiceInfos().get(0);*
>>> *String targetNameSpace = serviceInfo.getTargetNamespace();*
>>>
>>> Get the binding name of the WSDL by creating a BindingInfo object which
>>> gets the name of the binding.
>>>
>>> *BindingInfo bindingInfo = serviceInfo.getBindings().iterator().next();*
>>> *String bName = bindingInfo.getName().getLocalPart();*
>>>
>>> Create a Qname by passing the namespace and the binding name as
>>> parameters and get the binding which has the specified QName.
>>>
>>> *QName bindingName = new QName(targetNameSpace, bName);*
>>> *BindingInfo binding = serviceInfo.getBinding(bindingName);*
>>>
>>> Get details about the soap operation which is to be invoked by creating
>>> a QName with the namespace and the operation name.
>>>
>>> *QName opName = new QName(targetNameSpace, operationName);*
>>> *BindingOperationInfo boi = binding.getOperation(opName);*
>>>
>>> Get the input/request message type
>>> *BindingMessageInfo inputMessageInfo = boi.getInput();*
>>> *List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();*
>>> *MessagePartInfo partInfo = parts.get(0);*
>>>
>>> Get the  class type of the request/input message and dynamically create
>>> an instance of it
>>> *Class<?> partClass = partInfo.getTypeClass();*
>>> *Object obj = partClass.newInstance();*
>>>
>>> The input variables provided by the user is stored inside a  HashTable
>>> which will hold the variable name and its value as a key-value pair
>>>
>>> *Hashtable table = new Hashtable();*
>>> *table.put("dividend", 40);*
>>> *table.put("divisor", 10);*
>>>
>>> Get the methods from the generated request class. This class will have
>>> getter and setter methods for the variables taken as the input/request.
>>>
>>> *Method [] methods = obj.getClass().getDeclaredMethods();*
>>> *for(Method m : methods){*
>>> * if(m.getName().contains("set")){*
>>> * String methodName = m.getName(); *
>>> * Class<?> paramType = m.getParameterTypes()[0];*
>>> * String[] output = methodName.split("set");*
>>> * String varName = output[1].toLowerCase(); *
>>> * Object value = table.get(varName); *
>>> * Method m1 = obj.getClass().getMethod(methodName, paramType); *
>>> * m1.invoke(obj, value);*
>>> * } else {*
>>> * }*
>>> *}*
>>>
>>> Invoking the operation
>>> *Object[] response = client.invoke(operationName, obj);*
>>>
>>> Get the methods from the generated response class. This class will have 
>>> getter
>>> and setter methods for the variables given as the output.
>>>
>>> *Method [] responseMethods =
>>> response[0].getClass().getDeclaredMethods();*
>>> *for(Method rm : responseMethods){*
>>> * if(rm.getName().contains("get")){*
>>> * String responseMethod = rm.getName();*
>>> * Object result =
>>> response[0].getClass().getMethod(responseMethod).invoke(response[0]);*
>>> * System.**out**.println("Response: " + result);*
>>> * } else {*
>>> * }*
>>> *}*
>>>
>>> Is this approach correct or is there any way to overcome these
>>> limitations when using CXF ?
>>>
>>> Any suggestions and feedback are highly appreciated.
>>>
>>> Best Regards,
>>>
>>> Natasha Wijesekare
>>>
>>> On Thu, Mar 17, 2016 at 4:47 PM, Natasha Wijesekara <[email protected]>
>>> wrote:
>>>
>>>> Hi ,
>>>>
>>>> I tried passing the operation name with the namespace but it didn't
>>>> work. I get the same exception as below.
>>>>
>>>> *java.lang.IllegalArgumentException: Part
>>>> {http://wso2.org/wso2con/2011/sample/adder}payload
>>>> <http://wso2.org/wso2con/2011/sample/adder%7Dpayload> should be of type
>>>> org.wso2.wso2con._2011.sample.adder.AdderProcessRequest, not
>>>> java.lang.Integer*
>>>> * at
>>>> org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:284)*
>>>> * at
>>>> org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:212)*
>>>> * at
>>>> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:122)*
>>>> * at
>>>> org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)*
>>>> * at
>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)*
>>>> * at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:572)*
>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:481)*
>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)*
>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)*
>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)*
>>>> * at cxfClient_1.main(cxfClient_1.java:61)*
>>>> * at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)*
>>>> * at
>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)*
>>>> * at
>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)*
>>>> * at java.lang.reflect.Method.invoke(Method.java:606)*
>>>> * at
>>>> com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)*
>>>>
>>>> Best Regards,
>>>> Natasha Wijesekare
>>>>
>>>> On Thu, Mar 17, 2016 at 3:39 PM, Himasha Guruge <[email protected]>
>>>> wrote:
>>>>
>>>>> Hi Natasha,
>>>>>
>>>>> Can you try passing the operation name with the namespace as well?
>>>>>
>>>>> Regards,
>>>>> Himasha
>>>>>
>>>>> On Thu, Mar 17, 2016 at 2:16 PM, Natasha Wijesekara <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I'm trying to invoke an external soap service operation which takes
>>>>>> integers as the parameters.
>>>>>>
>>>>>> *Request Body of the Soap Service *:
>>>>>>
>>>>>> *<soapenv:Envelope
>>>>>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/
>>>>>> <http://schemas.xmlsoap.org/soap/envelope/>"
>>>>>> xmlns:add="http://wso2.org/wso2con/2011/sample/adder
>>>>>> <http://wso2.org/wso2con/2011/sample/adder>">*
>>>>>> *   <soapenv:Header/>*
>>>>>> *   <soapenv:Body>*
>>>>>> *      <add:AdderProcessRequest>*
>>>>>> *         <add:a>?</add:a>*
>>>>>> *         <add:b>?</add:b>*
>>>>>> *      </add:AdderProcessRequest>*
>>>>>> *   </soapenv:Body>*
>>>>>> *</soapenv:Envelope>*
>>>>>>
>>>>>> I have created a client to invoke the soap operation using
>>>>>> JaxWsDynamicClientFactory.
>>>>>> JaxWsDynamicClientFactory clientFactory =
>>>>>> JaxWsDynamicClientFactory.newInstance();
>>>>>>
>>>>>> I have invoked the operation by passing the operation name and the
>>>>>> parameters to the client.
>>>>>> When multiple parameters of type *string* is passed, no error is
>>>>>> given.
>>>>>>
>>>>>> In this request I need to pass 2 *integers* as the parameters as
>>>>>> shown below :
>>>>>> client.invoke("operationName", num1, num2);
>>>>>> But when I do so I get the following error :
>>>>>>
>>>>>> *java.lang.IllegalArgumentException: Part
>>>>>> {http://wso2.org/wso2con/2011/sample/adder}payload
>>>>>> <http://wso2.org/wso2con/2011/sample/adder%7Dpayload> should be of type
>>>>>> org.wso2.wso2con._2011.sample.adder.AdderProcessRequest, not
>>>>>> java.lang.Integer*
>>>>>> * at
>>>>>> org.apache.cxf.jaxb.io.DataWriterImpl.checkPart(DataWriterImpl.java:284)*
>>>>>> * at
>>>>>> org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:212)*
>>>>>> * at
>>>>>> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:122)*
>>>>>> * at
>>>>>> org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)*
>>>>>> * at
>>>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:572)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:481)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:355)*
>>>>>> * at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:341)*
>>>>>>
>>>>>>  Appreciate any help on this.
>>>>>>
>>>>>> Best Regards,
>>>>>> *Natasha Wijesekare*
>>>>>>
>>>>>> *Software Engineering Intern, WSO2  Inc:  http://wso2.com
>>>>>> <http://wso2.com/>*
>>>>>> *email  : [email protected] <[email protected]>*
>>>>>> *mobile: +94 771358651 <%2B94%20771358651>*
>>>>>>
>>>>>> _______________________________________________
>>>>>> Dev mailing list
>>>>>> [email protected]
>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Himasha Guruge
>>>>> *Software Engineer*
>>>>> WS*O2* *Inc.*
>>>>> Mobile: +94 777459299
>>>>> [email protected]
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> *Natasha Wijesekare*
>>>>
>>>> *Software Engineering Intern, WSO2  Inc:  http://wso2.com
>>>> <http://wso2.com/>*
>>>> *email  : [email protected] <[email protected]>*
>>>> *mobile: +94 771358651 <%2B94%20771358651>*
>>>>
>>>
>>>
>>>
>>> --
>>> *Natasha Wijesekare*
>>>
>>> *Software Engineering Intern, WSO2  Inc:  http://wso2.com
>>> <http://wso2.com/>*
>>> *email  : [email protected] <[email protected]>*
>>> *mobile: +94 771358651 <%2B94%20771358651>*
>>>
>>> _______________________________________________
>>> Dev mailing list
>>> [email protected]
>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>
>>>
>>
>>
>> --
>> --
>> Hasitha Aravinda,
>> Senior Software Engineer,
>> WSO2 Inc.
>> Email: [email protected]
>> Mobile : +94 718 210 200
>>
>> _______________________________________________
>> Dev mailing list
>> [email protected]
>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>
>>
>
>
> --
> Nandika Jayawardana
> WSO2 Inc ; http://wso2.com
> lean.enterprise.middleware
>



-- 
*Natasha Wijesekare*

*Software Engineering Intern, WSO2  Inc:  http://wso2.com
<http://wso2.com/>*
*email  : [email protected] <[email protected]>*
*mobile: +94 771358651*
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to