Alex,

You are asking a very interesting question. Indeed using the DOM compatible factories not only allows to use DOM compatible code to parse an AXIOM tree but also to use an AXIOM tree as input to an XSLT processor without prior transformation from AXIOM to another object model.

To get an idea about the completeness of AXIOM's DOM implementation I did a simple test: I changed the default factories to DOM and ran the unit tests from the Apache Synapse project (which relies on Axis2 and therefore on AXIOM). Already in the first module, this causes errors in 5 out of 7 tests...

I think that the conclusion is that for the moment it is not possible to make this work without considerable effort.

Andreas

On 16 May 2008, at 23:22, Alex Kalinovsky wrote:

We are trying to adopt the latest Axis2 1.4 for dynamic invocation of
web services. We need to be able to consume any web service from a
user-provided WSDL. This means that we can not use data binding and code generation, and should work with the XML via DOM. We have existing code
that uses W3C DOM interfaces such as org.w3c.dom.Element and we
definitely want to stay within W3C object model. Axis2 OMElement does
not extend Element so it's not usable directly. But I have found out
that one can configure Axis2 to use DOM-compatible factories which would
allow for casting between OMElement and Element.



I have coded a simple client for my BEA Echo service that creates an
instance of org.apache.axiom.om.impl.dom.DocumentImpl and creates it's
elements. I then cast the "method" element of this document to OMElement
and pass it to ServiceClient.sendRecieve(). This works fine.



The problem is that the result is returned as OMElement and if I try to
cast it to Element I get java.lang.ClassCastException:
org.apache.axiom.om.impl.llom.OMElementImpl. I looked through the code
and it seems that Axis2 uses the default factory set to
OMAbstractFactory to create objects when parsing XML, and by default
that factory is set to
org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory via a constant.
When I have tried overriding the default Axiom factory to use
DOM-compliant factory as follows:



   System.setProperty(OMAbstractFactory.SOAP11_FACTORY_NAME_PROPERTY,
"org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory");

   System.setProperty(OMAbstractFactory.SOAP12_FACTORY_NAME_PROPERTY,
"org.apache.axiom.soap.impl.dom.soap12.SOAP12Factory");



I got the following exception in ServiceClient.sendReceive():





Exception in thread "main" java.lang.NullPointerException

     at
org .apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:7
9)

at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java: 166)

     at
org .apache.axis2.description.OutInAxisOperationClient.handleResponse(Out
InAxisOperation.java:363)



Looking at the code of org.apache.axiom.soap.impl.dom.SOAPHeaderImpl
which seems to be returning a null iterator I see the following code



   public Iterator getHeadersToProcess(RolePlayer rolePlayer) {

       return null; // TODO: Implement this!

   }



So, my question is, is it really true that W3C DOM-compliant factories
are not completely implemented?



Am I doing something wrong?



If they are not implemented, I can try finishing them and submit a patch
to JIRA, but I want to know if anyone is already working on this and
what other pieces of functionality are not finished?








Reply via email to