From 0e18e55ca0db023f25dcbca68d22b16bd37fb531 Mon Sep 17 00:00:00 2001 From: volodya-lombrozo Date: Wed, 15 Nov 2023 17:25:02 +0300 Subject: [PATCH] feat(#64): Add Output abstraction --- src/main/java/org/xembly/Output.java | 48 +++++++++++++++++++++++ src/main/java/org/xembly/Xembler.java | 19 +++++++-- src/test/java/org/xembly/XemblerTest.java | 15 +++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/xembly/Output.java diff --git a/src/main/java/org/xembly/Output.java b/src/main/java/org/xembly/Output.java new file mode 100644 index 0000000..b13a449 --- /dev/null +++ b/src/main/java/org/xembly/Output.java @@ -0,0 +1,48 @@ +package org.xembly; + +import java.util.HashMap; +import java.util.Map; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; + +public interface Output { + + + void prepareTransformer(final Transformer transformer); + + + final class Document implements Output { + + private final Map properties; + + public Document() { + this((Document.defaultProperties())); + } + + public Document(final Map properties) { + this.properties = properties; + } + + @Override + public void prepareTransformer(final Transformer transformer) { + this.properties.entrySet().stream() + .forEach((e) -> transformer.setOutputProperty(e.getKey(), e.getValue())); + } + + private static Map defaultProperties() { + final HashMap res = new HashMap<>(); + res.put(OutputKeys.INDENT, "yes"); + res.put(OutputKeys.ENCODING, "UTF-8"); + return res; + } + } + + final class Node implements Output { + + @Override + public void prepareTransformer(final Transformer transformer) { + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + } + } + +} diff --git a/src/main/java/org/xembly/Xembler.java b/src/main/java/org/xembly/Xembler.java index 90b9e43..21f4081 100644 --- a/src/main/java/org/xembly/Xembler.java +++ b/src/main/java/org/xembly/Xembler.java @@ -101,6 +101,8 @@ public final class Xembler { */ private final Iterable directives; + private final Output output; + static { Xembler.BFACTORY.setNamespaceAware(true); Xembler.BFACTORY.setValidating(false); @@ -112,7 +114,17 @@ public final class Xembler { * @param dirs Directives */ public Xembler(final Iterable dirs) { - this.directives = dirs; + this(dirs, new Output.Document()); + } + + /** + * Public ctor. + * @param directives Directives + * @param output Output type + */ + public Xembler(final Iterable directives, final Output output) { + this.directives = directives; + this.output = output; } /** @@ -247,8 +259,9 @@ public String xml() throws ImpossibleModificationException { ex ); } - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + this.output.prepareTransformer(transformer); +// transformer.setOutputProperty(OutputKeys.INDENT, "yes"); +// transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); final StringWriter writer = new StringWriter(); try { transformer.transform( diff --git a/src/test/java/org/xembly/XemblerTest.java b/src/test/java/org/xembly/XemblerTest.java index acbbc88..14f0b16 100644 --- a/src/test/java/org/xembly/XemblerTest.java +++ b/src/test/java/org/xembly/XemblerTest.java @@ -208,4 +208,19 @@ void concurrentInvocationWithNoExceptions() throws Exception { ) ); } + + @Test + void omitsHeader() { + MatcherAssert.assertThat( + "Xembler should omit XML header for Node output type", + new Xembler( + new Directives() + .add("animals") + .add("cow") + .set("mu-mu"), + new Output.Node() + ).xmlQuietly(), + Matchers.equalTo("mu-mu") + ); + } }