Andreas Veithen created AXIOM-420:
-------------------------------------

             Summary: Support push-only OMDataSources
                 Key: AXIOM-420
                 URL: https://issues.apache.org/jira/browse/AXIOM-420
             Project: Axiom
          Issue Type: Improvement
          Components: API, LLOM
    Affects Versions: 1.2.13
            Reporter: Andreas Veithen
            Assignee: Andreas Veithen
             Fix For: 1.2.14


The OMSourcedElement/OMDataSource feature assumes that a data source is equally 
well capable of providing an XMLStreamReader and of serializing the data to an 
XMLStreamWriter. However, this is often not the case: serializing to an 
XMLStreamWriter is in generally easy, but constructing an XMLStreamReader may 
be highly non trivial. The consequence is that many OMDataSource 
implementations implement getReader by first serializing the data to an 
intermediary representation and than constructing an XMLStreamReader from that 
representation. The following two approaches are used most often:

1. getReader serializes the data as XML to a byte array (using one of the 
serialize methods defined by OMDataSource) and then returns an XMLStreamReader 
pull parser constructed from that byte array. Note that this is highly 
inefficient (and even gives unexpected results) if the serialization produces 
optimizable base64 binary data.

2. getReader first creates an Axiom tree and then uses 
OMContainer#getXMLStreamReader(). For example, ADB does this by using an 
XMLStreamWriter implementation (called MTOMAwareOMBuilder) that constructs the 
Axiom tree. That XMLStreamWriter is passed to the serialize(XMLStreamWriter) 
method. That approach is inefficient because in the worst case, the Axiom tree 
is built twice: once by getReader and then again by OMSourcedElement. This 
should be considered as an anti-pattern (see 
http://ws.apache.org/axiom/userguide/ch05.html#d5e679).

The issue can be avoided if the implementation of OMSourcedElement is changed 
such that for this type of OMDataSource it uses a different approach to expand 
the element: instead of using a standard OM builder to expand the element, it 
would use the OMDataSource#serialize(XMLStreamWriter) method together with an 
XMLStreamWriter that builds the nodes and adds them to the OMSourcedElement. 
This is similar to what ADB already does, except that the tree would be built 
only once because the constructed nodes are directly added to the 
OMSourcedElement. Of course, since this approach is push based, deferred 
building will not work and the OMSourcedElement is always built completely if 
it gets expanded. It is nevertheless better than the other approaches currently 
in use.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to