Using the java program to launch external scripts
In a previous part of this tutorial we created an external service for launching scripts. We can make use of it.
You will need to copy the WSDL url from the WebLogic Console.
Open WebLogic console->Deployments-> press next until you see the service -> open it up by pressing the + sign next to the name->Click on the name->Select testing->Open again with + sign->select WSDL
Click on the link “?WSDL” and copy the URL to clipboard.
Go back to composite.xml and drag and drop the web service adapter to the “External Service” lanes.
A dialog box will open. Copy the url from clipboard to the URL field there and press TAB once.
If you decided to copy wsdl to the project (see checkbox above) you will also see this:
Draw a line from GeoFenceEvent Handler to the newly added service.
Double-click the GeoFenceEventHandler process open. We are now ready to add last missing piece – invoking the external action scripts.
Add an invoke operation inside the while loop (before the IncrementLoopCounter assignment) and draw line from it to ScriptRunner (Note ScriptRunner may be on either side of the main area and you may need to scroll up to see it). A wizard with dialogs will open. Name the invoke and create local input and output variable.
We still need to prepare the input variable with right parameters.
Input parameter settings for variable argument web service.
Making this works is actually far above tutorial level, but I wanted to make the script wrapper a service that takes variable number of arguments and in this phase it is coming back to us.
First we need to check what type of service the jDeveloper has created for us. Go to WLS Console and browse to the deployed shellscriptwrapper service. Open up the test client. You will see that the parameters do not have any namespace.
This is one reason why we need to make an additional variable in our BPEL script and this variable needs to be a sequence of string elements where the elements do not have any namespace. As I said this goes quite far beyond tutorials and you may well work years before encountering issue like this.
So let’s fix this.
Create a new xml schema – I called mine internal.xsdFile->New->XML->XML schema
Add an element – call it for example argHelper and add a sequence to it. Add element called arg to it. It is important that the arg element has exactly the same name as your variable number argument in the generated web service (shell script wrapper)
And now finally we are ready to add the assignment operation to the BPEL flow.
Add assignment operation before the invoke and open it. Rename it AssignScriptRunnerParameters or similar. Go to Copy Rules and open up the local variables and there the InvokeScriptRunner_Input variable and the parameters under it. You can see the needed parameters invoke parameters that need to be assigned with values that are fetched from the database.
Drag and drop function on top of the script parameter. A dialog will open.
First add the script parameter from InvokeGetActions_OuputVarible there. We will need to edit this later little bit to refer to the right row as indicated by the “i”-variable.
Edit the row to be:$InvokeGetActions_OutputVariable.SimpleActionCollection/ns6:SimpleAction[$i]/ns6:script
The args bit is a little bit more complex as our service takes variable arguments.
First we need to create a helper variable using the helper element we created in the new xml schema. You can safely create this in the local scope so use the (x) icon to open up the variables wizard and press the +-button to start creating a new variable. Call it for example ArgTemp and make its type to be an element and assign the element definition from the xml schema internal.xsd.
Now we are ready to proceed with the actual assignments.
First assignment is easy. We will just copy the assetid from the input variable to the arg parameter in the InvokeScriptRunner_InputVariable. If you remember this represents the license plate of the car having left the geofence.
Next will be copying param1 and param2 from the InvokeGetActions to the arg variable length list.
First draw a line from the param1 to the ArgTemp variable.
Then open the left side and edit it to index by the i-iterator.
Next draw a line from the ArgTemp->arg variable to the InvokeSriptRunner_InputVariable.parameters. This creates a copy operation.
We need to change this to an append operation
You need to do the same for param2. First copy in to ArgHelper->arg, add indexing by i-iterator and then from ArgTemp->arg to InvokeSriptRunner_InputVariable.parameters.
That’s it for assignments. We can now invoke the external scrips and last but not least we need to prepare the output.