Skip to content

AxiomSoapMessageFactory + PayloadRootAnnotationMethodEndpointMapping allways falls to DOM parsing [SWS-170] #324

@gregturn

Description

@gregturn

Martin Vanek opened SWS-170 and commented

DOM transformation is used every time in org.springframework.ws.server.endpoint.support.PayloadRootUtils#getPayloadRootQName because the root event type is XMLStreamConstants.START_DOCUMENT

Proposed improvement: (working with Woodstox 3.2.1.jar and sjsxp 1.0.1)

public static QName getPayloadRootQName(Source source, TransformerFactory transformerFactory)
        throws TransformerException, XMLStreamException {
    if (source instanceof DOMSource) {
        DOMSource domSource = (DOMSource) source;
        Node node = domSource.getNode();
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            return QNameUtils.getQNameForNode(node);
        }
        else if (node.getNodeType() == Node.DOCUMENT_NODE) {
            Document document = (Document) node;
            return QNameUtils.getQNameForNode(document.getDocumentElement());
        }
    }
    else if (source instanceof StaxSource) {
        StaxSource staxSource = (StaxSource) source;
        if (staxSource.getXMLStreamReader() != null) {
            XMLStreamReader streamReader = staxSource.getXMLStreamReader();
            if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT ||
                    streamReader.getEventType() == XMLStreamConstants.END_ELEMENT) {
                return streamReader.getName();
            } else if(streamReader.getEventType() == XMLStreamConstants.START_DOCUMENT) {
		streamReader.next();
            	if(streamReader.getEventType() == XMLStreamConstants.START_ELEMENT ||
                  streamReader.getEventType() == XMLStreamConstants.END_ELEMENT) {
            		return streamReader.getName();
            	}
            }
        }
    }
    // we have no other option than to transform
    Transformer transformer = transformerFactory.newTransformer();
    DOMResult domResult = new DOMResult();
    transformer.transform(source, domResult);
    Document document = (Document) domResult.getNode();
    return QNameUtils.getQNameForNode(document.getDocumentElement());
}

Affects: 1.0

Referenced from: commits f19d827

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions