From: Tony Tkacik Date: Mon, 15 Dec 2014 07:51:47 +0000 (+0000) Subject: Merge "BUG-2459: use thread-local cache of transformers" X-Git-Tag: release/lithium~770 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=da7b79cbf4b48a928910796150da4cb128848783;hp=5834d6db8a5b2f56ec469ceafd899a94a69f7b91 Merge "BUG-2459: use thread-local cache of transformers" --- diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java index 55dcd9daba..f1e72ed85f 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java @@ -14,11 +14,9 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import java.io.IOException; import java.io.OutputStream; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.sax.SAXTransformerFactory; import org.opendaylight.controller.netconf.api.NetconfMessage; import org.openexi.proc.common.EXIOptionsException; import org.openexi.sax.Transmogrifier; @@ -26,10 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class NetconfMessageToEXIEncoder extends MessageToByteEncoder { - private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageToEXIEncoder.class); - - private static final SAXTransformerFactory saxTransformerFactory = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); private final NetconfEXICodec codec; public NetconfMessageToEXIEncoder(final NetconfEXICodec codec) { @@ -44,8 +39,7 @@ public final class NetconfMessageToEXIEncoder extends MessageToByteEncoder { private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageToXMLEncoder.class); - private static final TransformerFactory FACTORY = TransformerFactory.newInstance(); private final Optional clientId; @@ -38,13 +34,13 @@ public class NetconfMessageToXMLEncoder extends MessageToByteEncoderabsent()); } - public NetconfMessageToXMLEncoder(Optional clientId) { + public NetconfMessageToXMLEncoder(final Optional clientId) { this.clientId = clientId; } @Override @VisibleForTesting - public void encode(ChannelHandlerContext ctx, NetconfMessage msg, ByteBuf out) throws IOException, TransformerException { + public void encode(final ChannelHandlerContext ctx, final NetconfMessage msg, final ByteBuf out) throws IOException, TransformerException { LOG.trace("Sent to encode : {}", msg); if (clientId.isPresent()) { @@ -53,14 +49,10 @@ public class NetconfMessageToXMLEncoder extends MessageToByteEncoder DEFAULT_TRANSFORMER = new ThreadLocal() { + @Override + protected Transformer initialValue() { + try { + return FACTORY.newTransformer(); + } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { + throw new IllegalStateException("Unexpected error while instantiating a Transformer", e); + } + }; + + @Override + public void set(final Transformer value) { + throw new UnsupportedOperationException(); + }; + }; + + private static final ThreadLocal PRETTY_TRANSFORMER = new ThreadLocal() { + @Override + protected Transformer initialValue() { + final Transformer ret; + + try { + ret = FACTORY.newTransformer(); + } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { + throw new IllegalStateException("Unexpected error while instantiating a Transformer", e); + } + + ret.setOutputProperty(OutputKeys.INDENT, "yes"); + ret.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); + return ret; + }; + + @Override + public void set(final Transformer value) { + throw new UnsupportedOperationException(); + }; + }; + + private ThreadLocalTransformers() { + throw new UnsupportedOperationException("Utility class"); + } + + /** + * Get the transformer with default configuration. + * + * @return A transformer with default configuration based on the default implementation. + */ + public static Transformer getDefaultTransformer() { + return DEFAULT_TRANSFORMER.get(); + } + + /** + * Get the transformer with default configuration, but with automatic indentation + * and the XML declaration removed. + * + * @return A transformer with human-friendly configuration. + */ + public static Transformer getPrettyTransformer() { + return PRETTY_TRANSFORMER.get(); + } +}