Uploaded image for project: 'Axiom'
  1. Axiom
  2. AXIOM-419

Multiple issues in OMDataSourceExtBase

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • 1.2.13
    • 1.2.14
    • API
    • None

    Description

      OMDataSourceExtBase has multiple issues and we should probably deprecate it in favor of a cleaner implementation:

      (1) The default implementation of serialize(OutputStream, OMOutputFormat) relies on getXMLBytes:

      output.write(getXMLBytes(format.getCharSetEncoding()));

      This is probably the worst choice from a performance point of view.

      (2) The default implementation of serialize(Writer, OMOutputFormat) is even worse:

      String text = new String(getXMLBytes(format.getCharSetEncoding()));
      writer.write(text);

      (3) serialize(XMLStreamWriter) tries to optimize the serialization by using serialize(OutputStream, OMOutputFormat) if the XMLStreamWriter is a MTOMXMLStreamWriter, i.e. it attempts to bypass the XMLStreamWriter. However, as noted in the Axiom 1.3 roadmap, this kind of optimization is non trivial and the serialize(OutputStream, OMOutputFormat) is not well designed for this. The issues that may arise can be demonstrated using the InputStreamDataSource (which extends OMDataSourceExtBase):

      OMFactory factory = OMAbstractFactory.getOMFactory();
      OMElement parent = factory.createOMElement("root", factory.createOMNamespace("urn:parent", ""));
      OMSourcedElement child = factory.createOMElement(new InputStreamDataSource(new ByteArrayInputStream("<child/>".getBytes("utf-8")), "utf-8"), new QName("child"));
      // child.getFirstOMChild();
      parent.addChild(child);
      parent.serializeAndConsume(System.out, new OMOutputFormat());

      The output of this code is:

      <root xmlns="urn:parent"><child/></root>

      This is incorrect because the namespace of the child element in the output is urn:parent while the original element has no namespace. If the line forcing the expansion of the OMSourcedElement is uncommented, then the result is correct:

      <root xmlns="urn:parent"><child xmlns=""/></root>

      (4) The class contains code (see the private reader2writer method) that copies events from the XMLStreamReader produced by getReader() to an XMLStreamWriter. However, that code actually fully builds an Axiom tree, which is the least optimal approach.

      Attachments

        Activity

          People

            veithen Andreas Veithen
            veithen Andreas Veithen
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: