From f191a55b8f570130f751c843d034451c6a277be3 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Fri, 14 Sep 2012 09:48:25 +0200 Subject: [PATCH] Preserve comments when using JibxMarshaller Prior to this commit, JibxMarshaller used a SAX ContentHandler to marshal to StAX XMLEventWriters, which inadvertently resulted in the deletion of XML comments. After this commit, JibxMarshaller adapts the XMLEventWriter into an XMLStreamWriter and comments are preserved. Issue: SPR-9768 --- .../java/org/springframework/util/xml/StaxUtils.java | 11 ++++++++++- .../util/xml/XMLEventStreamWriter.java | 4 ++-- .../util/xml/XMLEventStreamWriterTests.java | 8 ++++---- .../org/springframework/oxm/jibx/JibxMarshaller.java | 4 ++-- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/xml/StaxUtils.java b/spring-core/src/main/java/org/springframework/util/xml/StaxUtils.java index 4bd4a7a1eff..808a22ed77a 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/StaxUtils.java +++ b/spring-core/src/main/java/org/springframework/util/xml/StaxUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -309,6 +309,15 @@ public abstract class StaxUtils { return new XMLEventStreamReader(eventReader); } + /** + * Return a {@link XMLStreamWriter} that writes to a {@link XMLEventWriter}. + * @return a stream writer that writes to an event writer + * @since 3.2 + */ + public static XMLStreamWriter createEventStreamWriter(XMLEventWriter eventWriter) { + return new XMLEventStreamWriter(eventWriter, XMLEventFactory.newFactory()); + } + /** * Return a {@link XMLStreamWriter} that writes to a {@link XMLEventWriter}. * @return a stream writer that writes to an event writer diff --git a/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamWriter.java b/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamWriter.java index 8e74f7ccb0f..c2f8b8509d5 100644 --- a/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamWriter.java +++ b/spring-core/src/main/java/org/springframework/util/xml/XMLEventStreamWriter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -193,7 +193,7 @@ class XMLEventStreamWriter implements XMLStreamWriter { private void writeStartElement(StartElement startElement) throws XMLStreamException { eventWriter.add(startElement); - endElements.add(eventFactory.createEndElement(startElement.getName(), null)); + endElements.add(eventFactory.createEndElement(startElement.getName(), startElement.getNamespaces())); } private void writeNamespace(Namespace namespace) throws XMLStreamException { diff --git a/spring-core/src/test/java/org/springframework/util/xml/XMLEventStreamWriterTests.java b/spring-core/src/test/java/org/springframework/util/xml/XMLEventStreamWriterTests.java index baa65cbf401..1cf4bf3c0a0 100644 --- a/spring-core/src/test/java/org/springframework/util/xml/XMLEventStreamWriterTests.java +++ b/spring-core/src/test/java/org/springframework/util/xml/XMLEventStreamWriterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,8 +29,7 @@ import static org.custommonkey.xmlunit.XMLAssert.*; public class XMLEventStreamWriterTests { private static final String XML = - "content" - ; + "content"; private XMLEventStreamWriter streamWriter; @@ -52,6 +51,7 @@ public class XMLEventStreamWriterTests { streamWriter.writeDefaultNamespace("namespace"); streamWriter.writeStartElement("prefix", "child", "namespace2"); streamWriter.writeNamespace("prefix", "namespace2"); + streamWriter.writeComment("comment"); streamWriter.writeCharacters("content"); streamWriter.writeEndElement(); streamWriter.writeEndElement(); @@ -61,4 +61,4 @@ public class XMLEventStreamWriterTests { } -} \ No newline at end of file +} diff --git a/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java b/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java index a988fbd2c1e..813c89931ed 100644 --- a/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java +++ b/spring-oxm/src/main/java/org/springframework/oxm/jibx/JibxMarshaller.java @@ -338,8 +338,8 @@ public class JibxMarshaller extends AbstractMarshaller implements InitializingBe @Override protected void marshalXmlEventWriter(Object graph, XMLEventWriter eventWriter) { - ContentHandler contentHandler = StaxUtils.createContentHandler(eventWriter); - marshalSaxHandlers(graph, contentHandler, null); + XMLStreamWriter streamWriter = StaxUtils.createEventStreamWriter(eventWriter); + marshalXmlStreamWriter(graph, streamWriter); }