Calling springWs for validation of message from Camel - web-services

In my application, I have to validate the authorization of incoming message via calling a webservice.e.g if the user belongs to the authorised group then only process the message. For this, I have to build the authorizationRequest from one of the properties of the incoming message say userId(not the whole incoming message) and send to webservice.
I am new to camel. To achive this in a non-camel application I would have created a webservice client, make a call with userId(param) and process the response.
Main Camel route :
from( <URI> ).routeId("UpdateRoute")
.process("AuthorizationProcessor")
.process( "ValidateProcessor" )
.choice()
.when(matches(cond1)).to("cond1Processor")
.when(matches(cond2)).to("cond2UpdateProcessor")
.otherwise().to( "invalidconditionProcessor" );
}
With Camel, I am calling a custom processor AuthorizationProcessor and making a webservice call as I can do in non camel application.
I am not utilising Camel properly.What should be the appropriate way to make the webservice call .
I tried creating a route AuthorizationRoute and into I can use spring ws component to make the call.But not sure how this route will be invoked and where should I build the request.

Camel has a couple of components able to make Web Service calls (REST or SOAP). One of the most popular ones is camel-cxf, which (you guessed it, uses Apache CXF to make WS calls.
There is a myriad of options available, but it boils down to including:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cxf</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
And then in your route:
from( <URI> ).routeId("UpdateRoute")
.to("cxf:http://address/service?serviceClass=com.MyClass")
.process( "ValidateProcessor" ) // process the resoponse here
.choice()
.when(matches(cond1)).to("cond1Processor")
.when(matches(cond2)).to("cond2UpdateProcessor")
.otherwise().to( "invalidconditionProcessor" );

Related

Camel Web service message consumer

I am trying to build an xml spring-based camel web service consumer using apache cxf endpoint similar to the example here...
<cxf:cxfEndpoint id="soapMessageEndpoint"
serviceClass="org.apache.camel.example.cxf.provider.GreeterProvider"
address="http://localhost:9000/GreeterContext/SOAPMessageService"
wsdlURL="wsdl/hello_world.wsdl"
endpointName="s:SoapOverHttpRouter"
serviceName="s:SOAPService"
xmlns:s="http://apache.org/hello_world_soap_http"/>
<camelContext id="test_context" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="cxf:bean:soapMessageEndpoint"/>
<to uri="bean:testBean?method=processSOAP"/>
</route>
</camelContext>
The web service already exists, but I'm not interested in setting up and exposing a client like in the example. Under normal operation clients would subscribe to the web service and the web service in turn publishes out events to the subscribers periodically.
I have a simulator that generates the web service messages automatically already and I just want to consume the web service message in my camel route and log it, so I don't need to process it or do something with the messages.
I just want my endpoint to act as a listener/sniffer for these messages as they are published therefore I don't really need a service class.
What's the easiest or most efficient way to set this up in camel? Maybe cxf is the wrong component to be leveraging here. The web service is using SOAP.

Oracle Service Bus multiple operations inside exposed SOAP service

Currently I am developing a ws with OSB using JDeveloper 11.
I have a simple web service, which calls an external SOAP service.
My composite.xml file:
Operations of my BPEL Soap service
Operations of remote SOAP Service
BPEL Component
I have few questions regarding the current development strategy. How shall I add new operations to my BPEL SOAP? I added a new method (getCompanyDetails()) by editing ApusBPELProcess.xsd (added new request and response types) and ApusBPELProcess.wsdl (added new operation, message and etc). Is this the correct way for adding new operations?
Now I can call only one method of the remote SOAP service by using an "Invoke" component from BPEL constructs.
My BPEL design:
How can I call bind a method from my BPEL SOap (1) to a method from remote service (2) ? For example: when client calls method process from my BPEL Soap (1), I want to do some validation on input parameters and then call getServiceCompanies from remote SOAP (2). And so when client calls another method from BPEL Soap (1) I want to call some other methods on remote SOAP (2).
Will be very thankful if someone can show me a diagram, with required components. Because I read about "Mediator" components, but I don't know how to use them in my current situation.
Thanks in advance.
One option is, You can use Pick activity that can have multiple onMessage branches for each operation exposed by your BPEL service.
Similarly, Invoke activity has an option to select the operation of the Remote SOAP service that you need to call.
So your composite would look like Pick activity with an OnMessage branch with BPELoperation1 selected, then logic to do validation and then invoke with remoteoperation1 selcted.And another onMEssage branch with BPELoperation2 selected, logic to do validations and invoke with remoteoperation2 selected.
I found a solution with Mediator component. Maybe it will help someone.
Ok, I added a Mediator component between my exposed service and remote service. Mediator component will do request routing and data transformation between these two services. For each method in my exposed service I added a BPEL process to the other endpoint of Mediator (I will do some method specific validation/other logic inside these BPEL processes).
My final composite.xml:
Methods of my exposed service
Mediator
The remote service what I call
Inside Mediator component I do routing and transformation. For each method of my exposed service (1) I have a routing rule in Mediator (2).
Mediator component rules:
4a, 4b - Methods of my exposed service
4c - button for adding new routing rule
4d - button for adding transformation rule (generally you will have a pair of transformation rules for a method - request/response)
Transformation files are .xsl files that do information convertion between two endpoints.
My .xsl files:
Content of a .xsl file:
Here I am doing iteration through the response data (for-each component).
And finally inside of each BPEL process I have an "Invoke" component (5) which calls the appropriate method on the remote service.
Hope it will someone. Good luck!

How to handle SOAP service within persistent Perl web application with cookies?

Due to the fall of SOAP::WSDL which had generated me real Perl modules I have to look for something other in order to handle a SOAP service. The generated modules won't work starting from Perl v5.18.
I have the following situation with my web application.
I have a PSGI compatible, Dancer2 driven, persistent web application.
The web application handles multiple concurrent customers.
The web application is between the customer and an external SOAP service.
The SOAP service uses customer sessions via cookies which have to be integrated on the web application internally for the customer.
The web application holds an WSDL file copy of the SOAP service.
I'm looking for a module that creates an interface out of the WSDL file and handles parameter/schema validation and communication with the SOAP service. I would like to call a method (SOAP call) with parameters (SOAP call parameters) and receive a cleaned data or object structure of the response.
The problem is that the web application needs to handle multiple concurrent customer cookie sessions. So I need a module which offers the possibility to override the cookie jar for that particular request and extract the cookies after the request without causing interference with other concurrent requests.
I found XML::Compile which I can initialize as a singleton at web application start up. But with this solution I ran into problems with interfering other customer requests. So the requests are not separated. Initializing XML::Compile for every request is not the solution either because it will parse the WSDL and generate handlers over and over again for every request the customer sends to the web application.
Is there any solution/module that fits my needs or do I miss something with XML::Compile and it's possible with it?
Are you using Catalyst?
I've been happy using Catalyst::Controller::SOAP and its companion Catalyst::Model::SOAP to build SOAP/WSDL servers and consumers, being able to integrate Perl Applications even with Microsoft Document Literal-Wrapped thing.
Even if not using Catalyst you may probably learn from its code. It uses XML::Compile::WSDL11.

Simplest Webservice in Delphi

I need to develop a minimalistic webservice.
It should have 2 functions:
senduserdata (a remote app will call "senduserdata" to send info about users, like "ID" and "amount")
sendconfirmation (a remote app will tell "all ok for proccess ID=X, notes are: NOTES)
In past I did a SOAP dll that needs IIS to run, since deployment is crucial in my case and IIS is not always available is it possible to have a standalone exe that exposes the SOAP (or REST) interface?
I succeded in a few minutes using the RemObjects trial and setting SOAP as communication protocol in a server + client project group (note: i need server only).
With a VCL EXE i can deploy much easier (i have lots of customers, and accessing their IIS to install a dll it is sometimes too hard).
Yes, you can use any TCP library for Delphi which includes a HTTP server, for example Internet Direct (Indy). With Indy, you can create a stand-alone application (or better, a windows service) without IIS.
In a RESTful web application, the senduserdata command would be implemented by a URL like
http://example.com/api/users
The clients then use a HTTP PUT or PATCH request to update the users resource.
A senduserdate call for user id 774422 would be written like
LStream := TStringStream.Create('{ "amount":100.50, "currency":"EUR" }');
try
HTTP := TIdHTTP.Create;
try
HTTP.Put('http://example.com/api/users/774422', LStream);
finally
HTTP.Free;
end;
finally
LStream.Free;
end;
In the the Delphi application for server side, a TIdHTTPServer component then listens for HTTP requests for the /rest/users resource and in the OnCommandOther event handler it would extract the request body string, parse it, and apply the changes to the user with the ID given in the resource path (/774422).

Invoke BPEL from a Webservice in OpenESB

Right now i'm developing a composite application using Open ESB. I got my
application tested through a test case by sending a request SOAP message,
and it works great.
The problem is, i want my composite application to be able to be used like
a webservice so i could call the composite application from Python using SOAPpy,
not by sending an edited SOAP message like in the test case.
How can i achieve that? Should i invoke the BPEL process from a webservice?
I already read "A Gentle Introduction: Exploring OpenESB" and "Building SOA-Based
Composite Applications Using NetBeans IDE 6". Both of the books create an interface
for the composite application, not using the composite application like a webservice.
Thanks in advance,
Well, by definition, each BPEL process is rendered as a Web service. In other words: the only possibility to invoke a BPEL process is to invoke the web service interface provided by the BPEL process (the myRole of the partnerlink that is used for inbound message activties). When your test case also submits a SOAP message to the BPEL process, any other Web service client can do the same.
Sorry for late answer but this can help other users.
Of course they will not use the composite applications as web service simply because it - the composite app - is a client consuming the web service that you have defined using the BPEL ( Business Process Execution LANGUAGE ).
Now the question is, how to get the wsdl for our web service ?
Answer :
go to your composite application
select " wsdl ports " select the wsdl that you have created in "BPEL MODEL" project.
right click => properties => location , then copy location value
replace {httpdefaultport} by 9080
add ?wsdl to the end of the location