Implement NetconfMessage.toString()
[controller.git] / opendaylight / netconf / netconf-api / src / main / java / org / opendaylight / controller / netconf / api / NetconfMessage.java
index a0fddd79f2f0fcff8afced3ab91fcf21aeeea44d..d8c80e56eb5be27e76eb523eed44654cdf4da47f 100644 (file)
@@ -8,35 +8,61 @@
 
 package org.opendaylight.controller.netconf.api;
 
-import com.google.common.base.Optional;
+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;
 
 /**
  * NetconfMessage represents a wrapper around org.w3c.dom.Document. Needed for
  * implementing ProtocolMessage interface.
  */
-public final class NetconfMessage {
+public class NetconfMessage {
+    private static final Transformer TRANSFORMER;
 
-    private static final long serialVersionUID = 462175939836367285L;
+    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");
 
-    private final Document doc;
+        TRANSFORMER = t;
+    }
 
-    private String additionalHeader;
+    private final Document doc;
 
     public NetconfMessage(final Document doc) {
-        this(doc, null);
-    }
-
-    public NetconfMessage(Document doc, String additionalHeader) {
         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();
     }
 }