Re: Invocation by directly providing XML message
Aleksander Slominski <[email protected]> Fri, 17 Jun 2005 05:27:10 -0500
| Newsgroups | gmane.comp.apache.webservices.wsif.devel |
|---|---|
| Message-ID | <[email protected]> |
Jos van den Oever wrote:
>On Friday 17 June 2005 09:11, Aleksander Slominski wrote:
>
>
>>you are welcome to take a look on XSUL2 that has this and many other
>>improvements - in particular WSIFMessage is XmlElement and XML-Java
>>mapping is optional layer - XmlBeans looked like the most complete XML
>>Schema data binding so it is supported and there is simple XWSDL code
>>generator that is SOAP toolkit independent:
>>http://www.extreme.indiana.edu/xgws/xsul/guide/
>>
>>
>
>I took a look at
>http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/sample_decoder/src/decoder/client/DecoderClient.java
>but it seems to require a stub class. Since I want to write a client to invoke
>_any_ webservice, i don't see how i can use this because I cannot generate a
>stub in advance.
>
>
both stub and DII API (Dynamic Invocation Interface) are supported and
DII is just WSIF-like, see:
http://www.extreme.indiana.edu/xgws/xsul/guide/#client.dii
>Would it be possible to do something like this:
>
>WSIFClient wsc = WSIFRuntime.newClient(wsdlLoc);
>
>
WSIFRuntime is meant for dynamic stubs you can use WSIF API direclty.
for example see DII client that takes WSDL, operaiton, and parameters as
strings from command line:
http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/java/modules/xwsif_dynamic_invoker/xsul/dii/XsulDynamicInvoker.java
>// find the default bound operation
>Operation operation = wsc.findOperation(operName);
>if (operation == null) {
> System.out.println("Operation "+operName+" is not available.");
>}
>operation.addInput(inputName, inputNode);
>
>
WsdlDefinitions def = WsdlResolver.getInstance().loadWsdl(base,
new URI(wsdlLoc));
WSIFServiceFactory wsf = WSIFServiceFactory.newInstance();
WSIFService serv = wsf.getService(def);
WSIFPort port = serv.getPort(portName);
WSIFOperation op = port.createOperation(opName);
WSIFMessage in = op.createInputMessage();
and then set input to actual XML, for example:
XmlElement sarray = builder.parseFragmentFromReader(new
StringReader("<foo>... some xml content ... </foo>"));
in.setObjectPart("foo",sarray);
>operation.call();
>
>
boolean succes = op.executeRequestResponseOperation(in, out, fault);
if(succes) {
System.out.println("received response "+out);
} else {
System.err.println("received fault "+fault);
}
>for (Part p : operation.getOutput()) {
> System.out.println(p.name()+": "+p.xmlNode());
>}
>
>
another sample has this in more details:
http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/java/samples/xsul_sample_google/Client.java
where it extracts data from XML output (XPath could be used too as XPP3
supports Jaxen API)
boolean succes = op.executeRequestResponseOperation(in, out, fault);
if(succes) {
//System.out.println("received response "+out);
XmlElement response = (XmlElement) out;
// return/resultElements
XmlElement resultElements = response
.requiredElement(null, "return")
.requiredElement(null, "resultElements");
// print URLs of all */URL/text()
int count = 1;
for (Iterator i = resultElements.elements(null, null).iterator(); i.hasNext(); ) {
XmlElement item = (XmlElement) i.next();
System.out.println((count++)+". "+item
.element(null, "URL")
.requiredTextContent());
}
} else {
System.out.println("received fault "+fault);
}
>Also I don't want to do any XML Schema validation initially. I just want to
>read a WSDL, find a bound operation, specify it's input as XML nodes, call
>the operation and process the ouput and faults.
>
that was motivation behind XSUL1 and my work on adding WSIF APIs in
XSUL2: to make all this possible and clearly define layers and
dependencies between modules.
>The input parts need to be
>specified as nodes, not elements, because e.g. a part of type xs:string is
>not an element.
>
>
i only support WSDL doc/literal and no rpc/encoding.
>Which module of xsul2 should I obtain to write only such a client?
>
>
check build.xml and add a target to compile of modules that are
necessary to build xwsif*client,xwsdl, and required soap* client modules.
alek
--
The best way to predict the future is to invent it - Alan Kay