axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Aleksander Slominski <as...@cs.indiana.edu>
Subject Re: [Axis2] mapping XML/XSD <-> Java [Re: Complex types: do the reverse ?
Date Fri, 06 May 2005 19:39:17 GMT
Jacques-Olivier Goussard wrote:

>Thanks Alek, I'll take a look to all of this. If you may, 
>this seems however overkill for what most users are asking for
>it seems, as most are happy manipulating XML.
>
there is nothing preventing you from reading XML directly (to DOM etc) 
without XmlBeans
(and later using XmlBeans or other databinding), compare client with 
XmlBeans mapping
conveniently available (2) and the same client that uses WSIF API to 
construct XML directly (1):

(1) 
http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/sample_decoder/src/decoder/client/LightweightDecoderClient.java

        LightweightDecoderStub stub = (LightweightDecoderStub) WSIFRuntime.newClient(wsdlLoc)
            //.addHandler(new PasswordInvokerHandler("password-invoker"))
            .generateDynamicStub(LightweightDecoderStub.class);
        
        XmlElement in = builder.newFragment(NS, "runDecoder");
        in.addElement("Topic").addChild(args[1]);
        in.addElement("InputFile").addChild(args[2]);
        in.addElement("OutputDirectory").addChild(args[3]);
        XmlElement el = builder.parseFragmentFromReader(
            new StringReader("<StringArr><item>Arg1</item><item>Arg2</item></StringArr>"));
        in.addElement(el);
        String s = Util.safeXmlToString((XmlContainer)in);
        System.out.println("sending message =\n"+s);

        XmlElement result = stub.run(in);
        System.out.println("result=\n"+Util.safeXmlToString(result));
 

(2) 
http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/sample_decoder/src/decoder/client/DecoderClient.java

        WSIFClient wcl = XmlBeansWSIFRuntime.newClient(wsdlLoc);
        DecoderPortType stub = (DecoderPortType)wcl.generateDynamicStub(DecoderPortType.class);
        DecoderRunInputParamsDocument inputMsg = DecoderRunInputParamsDocument.Factory.newInstance();
        DecoderRunInputParamsType params = inputMsg.addNewDecoderRunInputParams();
        params.setTopic(args[1]);
        params.setCorrelationId(args[2]);
        params.setInputFile(args[3]);
        params.setOutputDirectory(args[4]);
        String[] arr = new String[]{"argA", "argB"};
        params.addNewStringArr().setItemArray(arr);
        params.setNproc(77); //override default

        DecoderRunOutputParamsDocument outputMsg = stub.run(inputMsg);
        DecoderRunOutputParamsType result = outputMsg.getDecoderRunOutputParams();
        System.out.println("outputUrl="+result.getOutputURL());


however it is difficult if you want to do XSD validation and databinding 
to WSDL
that is known/discovered only *during* runtime
- it seems to me simpler to have two groups of clients/services: those 
created from
known (abstract) WSDL  and those that need to deal with any WSDL.

> It seems leaving
>XML to Java binding (i.e. XmlBean) in the user hands would
>be enough. 
>  
>
it depends what you need to do. if you need to implement or access service
described in (abstract) WSDL then it is convenient to generate java 
interfaces from
WSDL:portType/interface and databinding code (XmlBeans) from XSD inside 
WSDL.
then writing client and service implementation is very easy.

for dynamic clients i do not see any real need to do actual Java<->XML 
databinding
- such client deals with any WSDL/XSD so even if you do databinding then
how users are supposed to use it? using Java reflection? wouldn't it be 
simpler
(and less of leaky abstractions) to have XML Schema introspection and then
use XML directly?

>>what if there is no Java Beans - you have XMl Schema with 
>>types/elements 
>>that you did not see before?
>>    
>>
>Not sure I follow here. I assumed the XSD in the java-binding case is
>based upon introspection (because this is how I build the WSDL
>from any class), 
>
this is pretty strong assumption - do you assume all services you use 
are java based and
have their WSDLs built by Java introspection?

what if you have external services and/or
services written in other languages (mapping Java Beans <-> XSD may be 
very difficult)

thanks,

alek

>so if every XML fragment used
>as input is a valid XSD type instance, you should not get
>into this problem (?). Of course, this implies you do not
>use interfaces in the service methods declarations. Or you
>need metadata on the service to map those to real classes - 
>but not stored in the WSDL then. 
>
>	/jog
>  
>
>>-----Original Message-----
>>From: Aleksander Slominski [mailto:aslom@cs.indiana.edu]
>>Sent: Friday, May 06, 2005 11:00 AM
>>To: wsif-user@ws.apache.org
>>Cc: wsif-dev@ws.apache.org; 'axis-dev@ws.apache.org'
>>Subject: [Axis2] mapping XML/XSD <-> Java [Re: Complex types: do the
>>reverse ?
>>
>>
>>Jacques-Olivier Goussard wrote:
>>
>>    
>>
>>>Hi all
>>>With all the discussions around complex types support
>>>in WSIF, I was wondering if really WSIF approach to it
>>>was the one that it should take.
>>>If really WSIF aims at representing all sorts of services
>>>through the WSDL description, then it appears to me
>>>that all types should be instances of the XSD types. 
>>> 
>>>
>>>      
>>>
>>i agree.
>>
>>    
>>
>>>In this approach, a SOAP-based service would simply
>>>take and return XML DOMs (or other representation)
>>>
>>>      
>>>
>>i prefer to think about it as XML Infoset and DOM as one possible API.
>>
>>    
>>
>>>- thus
>>>addressing the complex type issue in the most flexible
>>>way. A java-based service would internaly populate the
>>>needed beans from it's knowledge of the API and the XSD.
>>>So no type mapping would be necessary in the java-binding
>>>WSDL description. 
>>> 
>>>
>>>      
>>>
>>what if there is no Java Beans - you have XMl Schema with 
>>types/elements 
>>that you did not see before?
>>
>>    
>>
>>>And the client side would not need any knowledge of
>>>the underlying implementation - currently a java-binding user
>>>must know if the method takes a int[] or Integer[] for
>>>example, breaking the design IMHO.
>>>It's a much easier approach, because Java to XML binding
>>>is a much simpler problem than XML to java - but that's a 90 
>>>degres change :)
>>> 
>>>
>>>      
>>>
>>that is approach i taken in Super Dynamic Invoker but
>>with a little twist to make it more flexible in handling Java objects:
>>
>>http://www.extreme.indiana.edu/~aslom/bnp/sdi/
>>
>>i have a special XML infoset API (XB1/XPP3) that allows to store both 
>>XML and any object including
>>Java Beans as part of XML tree (this API could provide also DOM view)
>>
>>during serialization XML parts are straightforwardly converted
>>to XML 1.0 and Java objects goes through type mapping or 
>>provide their 
>>own serialization
>>(if they implement XmlSerializable).
>>
>>deserialization is opposite: you start with XML events and 
>>XML tree is 
>>recreated then it is transformed
>>to replace parts of tree with Java objects (possibly in pipeline of 
>>handlers).
>>
>>currently for Java objects i do not use Java Beans instead i used 
>>XmlBeans and that works pretty
>>well (though also right now transformation is very inefficient but is 
>>*correct* so can be optimized later ...)
>>
>>and here is how XmlBeans code work check in particular dynamic client 
>>section (based on WSIF API)
>>
>>http://www.extreme.indiana.edu/xgws/xsul/guide/#client.dii
>>
>>and how i do "server-side" WSIF with 
>>XService/XmlBeansBasedService/HttpBasedServices/XHandler
>>(keep in mind it is experimental API!!!!) in DecoderImpl.java 
>>
>>http://www.extreme.indiana.edu/xgws/xsul/guide/#host
>>http://www.extreme.indiana.edu/viewcvs/~checkout~/xsul/sample_
>>    
>>
>decoder/src/decoder/service/DecoderService.java
>
>the API is designed to allow hosting any services as long as they are 
>described in WSDL
>(ideally serive is defined as triple <SERVICE_NAME, wsdlLoc, 
>objectImplementingPortTypeDescribedInWsdl)
>
>HTH,
>
>alek
>
>  
>


-- 
The best way to predict the future is to invent it - Alan Kay


Mime
View raw message