From 75c803722a92fcbf8918138a9f04451bcf43a3c7 Mon Sep 17 00:00:00 2001 From: "yury.vasyutinskiy" Date: Tue, 9 May 2017 12:55:21 +0200 Subject: [PATCH 1/2] Adding writeRawValue method support to ToXmlGenerator. This will allow to write 'writteRawValue' code in the same fashion as Json one. --- .../dataformat/xml/ser/ToXmlGenerator.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java index 1083ab4cd..f9aa206b7 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/ToXmlGenerator.java @@ -654,6 +654,82 @@ public void writeUTF8String(byte[] text, int offset, int length) throws IOExcept /********************************************************** */ + @Override + public void writeRawValue(String text) throws IOException { + // [dataformat-xml#39] + if (_stax2Emulation) { + _reportUnimplementedStax2("writeRawValue"); + } + try { + _verifyValueWrite("write raw value"); + if (_nextName == null) { + handleMissingName(); + } + + if (_nextIsAttribute) { + _xmlWriter.writeAttribute(_nextName.getNamespaceURI(), _nextName.getLocalPart(), text); + } else { + _xmlWriter.writeStartElement(_nextName.getNamespaceURI(), _nextName.getLocalPart()); + _xmlWriter.writeRaw(text); + _xmlWriter.writeEndElement(); + } + } catch (XMLStreamException e) { + StaxUtil.throwXmlAsIOException(e); + } + } + + @Override + public void writeRawValue(String text, int offset, int len) throws IOException { + // [dataformat-xml#39] + if (_stax2Emulation) { + _reportUnimplementedStax2("writeRawValue"); + } + try { + _verifyValueWrite("write raw value"); + if (_nextName == null) { + handleMissingName(); + } + + if (_nextIsAttribute) { + _xmlWriter.writeAttribute(_nextName.getNamespaceURI(), _nextName.getLocalPart(), text.substring(offset, offset + len)); + } else { + _xmlWriter.writeStartElement(_nextName.getNamespaceURI(), _nextName.getLocalPart()); + _xmlWriter.writeRaw(text, offset, len); + _xmlWriter.writeEndElement(); + } + } catch (XMLStreamException e) { + StaxUtil.throwXmlAsIOException(e); + } + } + + @Override + public void writeRawValue(char[] text, int offset, int len) throws IOException { + // [dataformat-xml#39] + if (_stax2Emulation) { + _reportUnimplementedStax2("writeRawValue"); + } + _verifyValueWrite("write raw value"); + if (_nextName == null) { + handleMissingName(); + } + try { + if (_nextIsAttribute) { + _xmlWriter.writeAttribute(_nextName.getNamespaceURI(), _nextName.getLocalPart(), new String(text, offset, len)); + } else { + _xmlWriter.writeStartElement(_nextName.getNamespaceURI(), _nextName.getLocalPart()); + _xmlWriter.writeRaw(text, offset, len); + _xmlWriter.writeEndElement(); + } + } catch (XMLStreamException e) { + StaxUtil.throwXmlAsIOException(e); + } + } + + @Override + public void writeRawValue(SerializableString text) throws IOException { + _reportUnsupportedOperation(); + } + @Override public void writeRaw(String text) throws IOException { From 756e4f7a5cbbc24d4800907f6dcfc4806df3ace2 Mon Sep 17 00:00:00 2001 From: "yury.vasyutinskiy" Date: Wed, 10 May 2017 10:24:39 +0200 Subject: [PATCH 2/2] Adding Unit tests for writeRawValue methods support --- .../xml/stream/XmlGeneratorTest.java | 116 +++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java index 2696d35b2..5d3d20a12 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlGeneratorTest.java @@ -105,5 +105,119 @@ public void testWriteToFile() throws Exception assertEquals("42", xml); f.delete(); - } + } + + public void testRawSimpleValue() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + gen.writeFieldName("elem"); + gen.writeRawValue("value"); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("value", xml); + } + + public void testRawOffsetValue() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + gen.writeFieldName("elem"); + gen.writeRawValue("NotAValue_value_NotAValue", 10, 5); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("value", xml); + } + + public void testRawCharArrayValue() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + gen.writeFieldName("elem"); + gen.writeRawValue(new char[] {'!', 'v', 'a', 'l', 'u', 'e', '!'}, 1, 5); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("value", xml); + } + + public void testRawSimpleAttribute() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + // and also need to force attribute + gen.setNextIsAttribute(true); + gen.writeFieldName("attr"); + gen.writeRawValue("value"); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("", xml); + } + + public void testRawOffsetAttribute() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + // and also need to force attribute + gen.setNextIsAttribute(true); + gen.writeFieldName("attr"); + gen.writeRawValue("NotAValue_value_NotAValue", 10, 5); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("", xml); + } + + public void testRawCharArratAttribute() throws Exception + { + XmlFactory f = new XmlFactory(); + StringWriter out = new StringWriter(); + ToXmlGenerator gen = f.createGenerator(out); + // root name is special, need to be fed first: + gen.setNextName(new QName("root")); + gen.writeStartObject(); + // and also need to force attribute + gen.setNextIsAttribute(true); + gen.writeFieldName("attr"); + gen.writeRawValue(new char[]{'!', 'v', 'a', 'l', 'u', 'e', '!'}, 1, 5); + gen.writeEndObject(); + gen.close(); + String xml = out.toString(); + // one more thing: remove that annoying 'xmlns' decl, if it's there: + xml = removeSjsxpNamespace(xml); + assertEquals("", xml); + } }