Thank you for the OMDataSource tip. I will check out the XMLStreamReader interface.
I'm curious, is there another way to implement streaming of XML documents than using OMDataSource? On Fri, May 8, 2009 at 4:06 AM, Andreas Veithen <[email protected]> wrote: > Building a string representation of the XML and constructing an > OMDataSource from it has nothing to do with streaming, because your > code still builds the entire representation in memory. Given that > StringBuilder#append, StringBuilder#toString and String#getBytes > involves copying data from one array to another, it could even be that > building the Axiom tree is more memory efficient. > > If you want to use OMDataSource to implement streaming, then you need > to create an implementation of XMLStreamReader that produces the > sequence of events corresponding to the XML document. > > Andreas > > On Fri, May 8, 2009 at 02:00, Frederick G. Burkley <[email protected]> wrote: >> I want to check my understanding of the technique to stream large XML >> instance documents without building the document in memory. It is >> implied, I believe, that the data that is to be serialized as a XML >> instance document will first exist in the file system, a database, >> perhaps a domain specific object model, etc. >> >> No doubt this has been discussed many times, I found this thread that >> covers the basics of the topic: >> http://marc.info/?l=axis-user&m=117393850127293&w=2 >> >> 1) Create an OMDataSource, either by implementing the >> org.apache.axiom.om.OMDataSource interface directly or using a >> convenience class such as org.apache.axiom.om.ds.ByteArrayDataSource. >> >> In my case, my "backing object" is a domain specific object model. It >> is up to me to ensure that the OMDataSource of my choosing is properly >> backed by my object model. In this case, then, I must write code to >> "stringify" the state of my object model so it can be passed to the >> ByteArrayDataSource constructor as an array of bytes (i.e. byte[]). >> >> Question: Is my basic understanding of the OMDataSource interface correct? >> >> >> 2) In my work, I'm using Axiom and Axis2 in two different use cases: >> *) Streaming XML from an Axis2 Web Service to a client >> *) Serializing XML directly from a client side application to disk. >> >> In both cases, the data is the domain specific object model as mentioned. >> >> Interestingly, the "intent" of the use of OMDataSource seems quite >> different when used server side vice client side. (Client side use >> simply means using Axiom to create an OMElement and serialize it's >> state to disk). >> >> On the server, an OMElement is created (backed by the OMDataSource) >> and passed off to Axis2 infrastructure and handled accordingly. >> >> When serializing XML directly from the client, the use of OMDataSource >> (and associated OMElement) does not really seem to buy me much. In >> other words, most of the work that goes into "populating" the >> OMDataSource implementing class (such as ByteArrayDataSource) or >> creating an implementation of my own will be in "stringifying" my >> object model. >> >> By the time I get that code written, I can just as well do something like: >> >> String xml = objectModel.toXmlString() >> >> and write that XML to disk. It might make sense if I'm already using >> Axiom heavily in my client application, but in and of itself most of >> the work seems to be in "stringifying" my object model. >> >> My point: I welcome any observations or clarifications on my thoughts. >> I'm fairly new to Axiom and Axis2 so there may be many subtleties or >> features I'm not aware of. >> >> >> 3) I'm including my test code. I create a simple object model and then: >> *) "Stringify" it directly to disk >> *) Create an OMElement backed by a ByteArrayDataSource, then serialize the >> OMElement to disk. >> Note that I don't create an OMSourcedElementImpl. It seems to work simply >> by: >> OMElement aElement = factory.createOMElement(omDataSource, "A", namespace) >> >> >> 4) I'm using Axiom 1.2.8. >> >> >> V/r >> >> >> -------------------------------------------------------------- >> public class Driver { >> >> public A createObjectModel() { >> A a = new A(); >> B b = new B(); >> C c = new C(); >> >> c.setCProp("c1"); >> b.addC(c); >> b.setBProp("b1"); >> c = new C(); >> c.setCProp("c2"); >> b.addC(c); >> a.addFie(b); >> >> b = new B(); >> c = new C(); >> c.setCProp("c3"); >> b.addC(c); >> b.setBProp("b2"); >> a.addFie(b); >> >> return a; >> } >> >> private String serializeAsString(A a) { >> StringBuilder xml = new StringBuilder(); >> if (null != a) { >> xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); >> xml.append("\n"); >> xml.append("<A xmlns=\"www.example.org\">"); >> for (B b : a.getBList()) { >> xml.append("\n "); >> xml.append("<B>"); >> if (null != b.getBProp()) { >> xml.append("\n"); >> xml.append(" >> <BProp>").append(b.getBProp()).append("</BProp>"); >> } >> for (C c : b.getCList()) { >> xml.append("\n "); >> xml.append("<C>"); >> if (null != c.getCProp()) { >> xml.append("\n"); >> xml.append(" >> <CProp>").append(c.getCProp()).append("</CProp>"); >> } >> xml.append("\n "); >> xml.append("</C>"); >> } >> xml.append("\n "); >> xml.append("</B>"); >> } >> xml.append("\n"); >> xml.append("</A>"); >> } >> return xml.toString(); >> } >> >> private void serializeAsDataSource(A a) throws XMLStreamException { >> String xml = this.serializeAsString(a); >> OMDataSource source = new ByteArrayDataSource(xml.getBytes(), >> "UTF-8"); >> OMFactory factory = OMAbstractFactory.getOMFactory(); >> OMNamespace ns = factory.createOMNamespace("www.example.org", "ex"); >> OMElement aElement = factory.createOMElement(source, "A", ns); >> aElement.getBuilder().setCache(false); >> StringWriter writer = new StringWriter(); >> aElement.serializeAndConsume(writer); >> System.out.println("----- Axiom OMElement Serialization -----"); >> System.out.println(writer); >> } >> >> public static void main(String[] args) { >> Driver driver = new Driver(); >> A a = driver.createObjectModel(); >> System.out.println("----- Normal String Serialization -----"); >> System.out.println(driver.serializeAsString(a)); >> try { >> driver.serializeAsDataSource(a); >> } catch (XMLStreamException ex) { >> Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, >> null, ex); >> } >> } >> } >> >> >> -- >> Welcome to the black hole that is bicycling. >> > -- Overheard at a dinner party: I met Madoff once. He wasn’t very nice. I think he judged me too poor to bother robbing.
