CDS: Add stress test RPC to the cars model
[controller.git] / opendaylight / netconf / netconf-api / src / main / java / org / opendaylight / controller / netconf / api / NetconfMessage.java
index 33d41b0470516c15f277b183b146470e3cffdc83..d8c80e56eb5be27e76eb523eed44654cdf4da47f 100644 (file)
@@ -8,16 +8,36 @@
 
 package org.opendaylight.controller.netconf.api;
 
-import org.opendaylight.protocol.framework.ProtocolMessage;
+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 implements ProtocolMessage {
+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");
+
+        TRANSFORMER = t;
+    }
 
     private final Document doc;
 
@@ -28,4 +48,21 @@ public final class NetconfMessage implements ProtocolMessage {
     public Document getDocument() {
         return this.doc;
     }
+
+    @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();
+    }
 }