package org.opendaylight.controller.netconf.api;
+import java.io.StringWriter;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
-import com.google.common.base.Optional;
-
/**
* NetconfMessage represents a wrapper around org.w3c.dom.Document. Needed for
* implementing ProtocolMessage interface.
*/
-public final class NetconfMessage {
- private final String additionalHeader;
- private final Document doc;
+public class NetconfMessage {
+ private static final Transformer TRANSFORMER;
- public NetconfMessage(final Document doc) {
- this(doc, null);
+ static {
+ final Transformer t;
+ try {
+ t = TransformerFactory.newInstance().newTransformer();
+ } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ t.setOutputProperty(OutputKeys.INDENT, "yes");
+ t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+
+ TRANSFORMER = t;
}
- public NetconfMessage(Document doc, String additionalHeader) {
+ private final Document doc;
+
+ public NetconfMessage(final Document doc) {
this.doc = doc;
- this.additionalHeader = additionalHeader;
}
public Document getDocument() {
return this.doc;
}
- public Optional<String> getAdditionalHeader() {
- return additionalHeader== null ? Optional.<String>absent() : Optional.of(additionalHeader);
+ @Override
+ public String toString() {
+ final StreamResult result = new StreamResult(new StringWriter());
+ final DOMSource source = new DOMSource(doc.getDocumentElement());
+
+ try {
+ // Slight critical section is a tradeoff. This should be reasonably fast.
+ synchronized (TRANSFORMER) {
+ TRANSFORMER.transform(source, result);
+ }
+ } catch (TransformerException e) {
+ throw new IllegalStateException("Failed to encode document", e);
+ }
+
+ return result.getWriter().toString();
}
}