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?