[Done] Error from
library(SSOAP); kegg.wsdl = processWSDL("~/KEGG.wsdl"); kegg.iface =
genSOAPClientInterface(, kegg.wsdl)
debug(.SOAP)
obj_list = c('eco:b0514', 'eco:b2913')
fg_list = c('#ff0000', '#00ff00')
bg_list = c('#ffff00', 'yellow')
kegg.iface@functions$color_pathway_by_objects('path:eco00260',
obj_list, fg_list, bg_list)
For arrays where there is an explicit class, e.g. in KEGG ArrayOfstring,
get the namespace right for this.
For arrays of primitive types, map class to extend basic R
type, e.g. ArrayOfstring and character.
Or make a class union or an alias as we don't necessarily
want to create a more specific class.
So perhaps just leave as "character" or whatever type it is.
When generating class definitions, create setAs(XMLNode,
"type") methods that set the slots directly
or some similar method e.g. fromSOAPStruct.
Also leave the generic version that uses slot(obj,
dynFieldName).
Also, enforce the optional and required fields in these methods.
Provide a mechanism for the end-user to control the conversion
by using a setAsSOAP() or something so that they can register
methods
as setAsSOAP("SOAPType", function(xml) ..., pre = TRUE/FALSE)
where the pre says that we should do the regular processing
first
to get it into an R object, e.g. a list from the XML,
or not and leave it as parsed XML.
Write the generated code to a file for use in a package,
including the classes, NAMESPACE entries
Switch to internal nodes and XPath for parsing the WSDL.
Detect which version of the namespaces we need to use for an operation/server
e.g. 1.2 or 1.1
Get them from the WSDL file.
Keep the documentation for operations from the WSDL.
For eBay, the documentation is in the schema types!
Allow for a SOAP header, i.e. in the envelope (and not the HTTP header)
If there is no SOAP action, don't put one. Or make it '""'.
For eBay,
mapSOAPTypeToS needs to do serious work on the namespaces,
mapping any name space to the URI and then comparing these.
Need to get the defining URI for namespace prefixes when
walking the XML document. Redundancy is good here.
Get the type from the element tag attribute if it is not a
complex type, etc. and given as a sub-element/content
Generate converter function to be used in auto generated code.
When generating code, set the schema version.
In WSDL code generation, need the name of the S class of the
return type.
See examples/KEGGArray.R
In WSDL code generation, generate the functions to perform the
conversion rather than simpy using the type.
Abstract the transport layer from the .SOAP function to allow
for alternative mechanisms to RCurl.
Either methods based on the server object or a function object.
In the WSDL generation code, handle the case where we have a
NULL returned for an object.
Either convert the xsi:null=1 to an object of the appropriate
type (e.g. character(0), NA, list(0), etc.) or define
slot to allow NULLs via setClassUnion().
Entrez (NCBI) WSDL.
WSDL additions
- The 4 different port types - one-way, request-response (done),
solicit response and notification.
- Options for Bindings, e.g. style, transport.
Create converter functions (to and from R) when we define a class for a SOAP type.
Validate/match namespaces.
UDDI support.
Fault handling.
Resolving URIs in import calls.
Use code in XML package?
Profile the conversion code and make it more efficient.
See how much of the time is spent in the HTTP request and how
much is in the method dispatch and how much is inidividual
conversion method.
Create default CURL options that are used.
Try to rationalize further the fromSOAP() and fromSOAP(, type =
) when we know the expected type from the WSDL.
Specifically, we'd like to deal with xsi:null values properly
and this is different in the two cases.
Multi-dimensional arrays. We now parse the declaration, but
don't make extensive use of them. Looking for examples.
Schema and types.
Arrays with fixed bounds via validity methods, etc.
Clean up the parsing of the SOAP text, finding the return node,
etc. so that these are just in
convertFromSOAP, if possible.
Different ways of generating code, e.g. to file/connection,
as S objects
Coercion to the target types in a .SOAP call.
e.g. x = as.integer(x), scalars versus arrays.
Do we need to strip the leading / in the URL of the SOAPServer
From KEGG.wsdl
SOAPServer("http://soap.genome.ad.jp/keggapi/request.cgi")@url
gives
"/keggapi/request.cgi"
Write an XML Schema parser in R and use that here.
i.e. separate the schema parsing and the WSDL parsing.
Done some work on using libxml for this. Will
proceed via the RSWIG bindings.
Check the server$method operations.
Need to generate the functions accordingly.
Also want to allow for having a "live"
server connection object which contains the CURL
handle.
Check: Code contains support for
- arrays with offset and position attributes
- id and href attributes to reference elements elsewhere in
the data body.
Make certain these work.