Refactor anydata-related interfaces 20/82320/3
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 29 May 2019 22:20:06 +0000 (00:20 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 29 May 2019 23:57:28 +0000 (01:57 +0200)
As it turns out we need to expose more of our capabilities into
the API interface, as otherwise we cannot link the functionality
in javadoc.

This refactors interfaces/implementations, allowing redirection.

JIRA: YANGTOOLS-993
Change-Id: I142c9d50247d32d3ce24cb03e739618246a35a95
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
13 files changed:
yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java [new file with mode: 0644]
yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/ImmutableMetadataNormalizedAnydata.java [moved from yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/MetadataNormalizedAnydata.java with 75% similarity]
yang/rfc7952-data-util/src/main/java/org/opendaylight/yangtools/rfc7952/data/util/NormalizedMetadataWriter.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNode.java
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/AnydataNormalizationException.java [moved from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AnydataNormalizationException.java with 93% similarity]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java [moved from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizableAnydata.java with 83% similarity]
yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java [new file with mode: 0644]
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONNormalizedNodeStreamWriter.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/DOMSourceAnydata.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/StreamWriterFacade.java
yang/yang-data-codec-xml/src/main/java/org/opendaylight/yangtools/yang/data/codec/xml/XMLStreamNormalizedNodeStreamWriter.java
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/AbstractNormalizableAnydata.java
yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java [moved from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedAnydata.java with 64% similarity]

diff --git a/yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java b/yang/rfc7952-data-api/src/main/java/org/opendaylight/yangtools/rfc7952/data/api/MetadataNormalizedAnydata.java
new file mode 100644 (file)
index 0000000..8d476d9
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.rfc7952.data.api;
+
+import com.google.common.annotations.Beta;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
+
+/**
+ * A piece of {@link NormalizedAnydata} with a corresponding piece of {@link NormalizedMetadata}.
+ */
+@Beta
+@NonNullByDefault
+public interface MetadataNormalizedAnydata extends NormalizedAnydata {
+
+    NormalizedMetadata getMetadata();
+}
@@ -12,30 +12,33 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import java.io.IOException;
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.rfc7952.data.api.MetadataNormalizedAnydata;
 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata;
+import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 @Beta
 @NonNullByDefault
-public final class MetadataNormalizedAnydata extends NormalizedAnydata {
+public final class ImmutableMetadataNormalizedAnydata extends ImmutableNormalizedAnydata
+        implements MetadataNormalizedAnydata {
     private final NormalizedMetadata metadata;
 
-    public MetadataNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode,
+    public ImmutableMetadataNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode,
             final NormalizedNode<?, ?> data, final NormalizedMetadata metadata) {
         super(schemaContext, contextNode, data);
         this.metadata = requireNonNull(metadata);
     }
 
+    @Override
     public NormalizedMetadata getMetadata() {
         return metadata;
     }
 
     @Override
     public void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException {
-        NormalizedMetadataWriter.forStreamWriter(writer, orderKeyLeaves).write(getData(), metadata).flush();
+        NormalizedMetadataWriter.forStreamWriter(writer, orderKeyLeaves).write(getData(), getMetadata()).flush();
     }
 }
index 43af90faafc5fc6a2438901a0842da238cdcd2a8..7adebcdda7be85d860f057eedb9694bd4f43860c 100644 (file)
@@ -49,6 +49,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWrit
  * @author Robert Varga
  */
 @Beta
+// FIXME: 5.0.0: consider moving this class to api to keep related stuff together
 public final class NormalizedMetadataWriter implements Closeable, Flushable {
     private final NormalizedNodeStreamWriter writer;
     private final boolean orderKeyLeaves;
@@ -117,8 +118,11 @@ public final class NormalizedMetadataWriter implements Closeable, Flushable {
 
     @Override
     public void close() throws IOException {
-        writer.flush();
-        writer.close();
+        try {
+            writer.flush();
+        } finally {
+            writer.close();
+        }
     }
 
     @Override
index 01fb9c4420b1ffcdfd238a25c2fdc448befce983..080c2364eeb4497a7c860679a51a90f3b20d6fd9 100644 (file)
@@ -11,7 +11,16 @@ import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 
 /**
- * A NormalizedNode holding the contents of an {@code anydata} node in some object model.
+ * A NormalizedNode holding the contents of an {@code anydata} node in some object model. While no guarantees are placed
+ * on object models, there are related interfaces available for data interchange:
+ *
+ * <ul>
+ *   <li>{@link NormalizedAnydata}, which exposes the contents as a {@link NormalizedNode} with attached schema
+ *       information</li>
+ *   <li>{@link NormalizableAnydata}, which is trait optionally implemented by object models and allows the opaque,
+ *       implementation-specific representation to be interpreted in a the context of provided schema information,
+ *       potentially forming a NormalizedAnydata node.
+ * </ul>
  *
  * @param <V> Value type, uniquely identifying the object model used for values
  */
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.yangtools.yang.data.util;
+package org.opendaylight.yangtools.yang.data.api.schema;
 
 import static java.util.Objects.requireNonNull;
 
similarity index 83%
rename from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizableAnydata.java
rename to yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizableAnydata.java
index 2e782b79a504e6f430cfe0ed11affab810806a1c..6afe18af63639e2f0c630099137fab88330e272a 100644 (file)
@@ -5,13 +5,17 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.yangtools.yang.data.util;
+package org.opendaylight.yangtools.yang.data.api.schema;
 
 import com.google.common.annotations.Beta;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
+/**
+ * An {@link AnydataNode#getValueObjectModel() anydata value object model} which can be normalized to
+ * {@link NormalizedAnydata} when provided with proper context.
+ */
 @Beta
 @NonNullByDefault
 public interface NormalizableAnydata {
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedAnydata.java
new file mode 100644 (file)
index 0000000..c251470
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.data.api.schema;
+
+import com.google.common.annotations.Beta;
+import java.io.IOException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
+import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+
+/**
+ * The contents of an {@code anydata} node in a normalized format. This representation acts as a schema-bound bridge
+ * between the various (mostly parser-based) representations. Implementations of this interface are usually created
+ * from an instance of {@link NormalizableAnydata}.
+ *
+ * <p>
+ * Note this interface does not have an equality contract and implementations are expected to default to identity
+ * equality (or in Valhalla-speak: be plain data).
+ */
+@Beta
+@NonNullByDefault
+public interface NormalizedAnydata extends Immutable, SchemaContextProvider {
+
+    @Override
+    // FIXME: remove this override when SchemaContextProvider's method has sane semantics.
+    @NonNull SchemaContext getSchemaContext();
+
+    DataSchemaNode getContextNode();
+
+    NormalizedNode<?, ?> getData();
+
+    default void writeTo(final NormalizedNodeStreamWriter writer) throws IOException {
+        writeTo(writer, true);
+    }
+
+    default void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException {
+        NormalizedNodeWriter.forStreamWriter(writer, orderKeyLeaves).write(getData()).flush();
+    }
+}
index 940d8f490499cb6d0a5a6ac3b326017fa78a14d7..354f108d74b282f2f6cb68353ef6211d6db482e5 100644 (file)
@@ -24,11 +24,11 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.Augmentat
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.AnydataExtension;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
 import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
-import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.AnyDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyXmlSchemaNode;
index 685f948d4de80dd2767ae40b73415be8a6bb270d..04cb67e047fc942909b7dd19af3713d177d013da 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.base.MoreObjects.ToStringHelper;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
@@ -21,6 +22,13 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.xml.sax.SAXException;
 
+/**
+ * Internal parser representation of a parsed-out chunk of XML. This format is completely internal to the parser
+ * and can be changed at any time. Current implementation uses W3C DOM tree as the backing implementations, but others
+ * are possible as well.
+ *
+ * @author Robert Varga
+ */
 @NonNullByDefault
 final class DOMSourceAnydata extends AbstractNormalizableAnydata {
     private final DOMSource source;
@@ -29,8 +37,8 @@ final class DOMSourceAnydata extends AbstractNormalizableAnydata {
         this.source = requireNonNull(source);
     }
 
-    DOMSource getSource() {
-        return source;
+    XMLStreamReader toStreamReader() throws XMLStreamException {
+        return new DOMSourceXMLStreamReader(source);
     }
 
     @Override
@@ -44,7 +52,7 @@ final class DOMSourceAnydata extends AbstractNormalizableAnydata {
         }
 
         try {
-            xmlParser.traverse(source).close();
+            xmlParser.parse(toStreamReader()).close();
         } catch (XMLStreamException | URISyntaxException | SAXException e) {
             throw new IOException("Failed to parse payload", e);
         }
index 30cec9ca08ad3834a9518ced3703eb9856608208..91e177e7da425bdbf741a9fa2dd40b1d30dda243 100644 (file)
@@ -19,9 +19,10 @@ import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.util.SingleChildDataNodeContainer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -214,7 +215,7 @@ final class StreamWriterFacade extends ValueWriter {
         writer.flush();
     }
 
-    void anydataWriteStreamReader(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
+    void anydataWriteStreamReader(final XMLStreamReader reader) throws XMLStreamException {
         flushElement();
 
         while (reader.hasNext()) {
@@ -338,7 +339,7 @@ final class StreamWriterFacade extends ValueWriter {
         }
     }
 
-    private void forwardAttributes(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
+    private void forwardAttributes(final XMLStreamReader reader) throws XMLStreamException {
         for (int i = 0, count = reader.getAttributeCount(); i < count; ++i) {
             final String localName = reader.getAttributeLocalName(i);
             final String value = reader.getAttributeValue(i);
@@ -351,13 +352,13 @@ final class StreamWriterFacade extends ValueWriter {
         }
     }
 
-    private void forwardNamespaces(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
+    private void forwardNamespaces(final XMLStreamReader reader) throws XMLStreamException {
         for (int i = 0; i < reader.getNamespaceCount(); ++i) {
             writer.writeNamespace(reader.getNamespacePrefix(i), reader.getNamespaceURI(i));
         }
     }
 
-    private void forwardProcessingInstruction(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
+    private void forwardProcessingInstruction(final XMLStreamReader reader) throws XMLStreamException {
         final String target = reader.getPITarget();
         final String data = reader.getPIData();
         if (data != null) {
@@ -367,7 +368,7 @@ final class StreamWriterFacade extends ValueWriter {
         }
     }
 
-    private void forwardStartElement(final DOMSourceXMLStreamReader reader) throws XMLStreamException {
+    private void forwardStartElement(final XMLStreamReader reader) throws XMLStreamException {
         final String localName = reader.getLocalName();
         final String prefix = reader.getPrefix();
         if (prefix != null) {
index cfa7e032952fb86d6110bd3a451ad35284c82802..e9cdabd6343e34180efb654fad1cad98c90747ad 100644 (file)
@@ -25,11 +25,11 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.AnydataExtension;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriterExtension;
 import org.opendaylight.yangtools.yang.data.impl.codec.SchemaTracker;
-import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
@@ -159,31 +159,22 @@ public abstract class XMLStreamNormalizedNodeStreamWriter<T> implements Normaliz
 
     final void anydataValue(final Object value) throws IOException {
         if (value instanceof DOMSourceAnydata) {
-            anydataValue(((DOMSourceAnydata) value).getSource());
+            try {
+                facade.anydataWriteStreamReader(((DOMSourceAnydata) value).toStreamReader());
+            } catch (XMLStreamException e) {
+                throw new IOException("Unable to transform anydata value: " + value, e);
+            }
         } else if (value instanceof NormalizedAnydata) {
-            anydataValue((NormalizedAnydata) value);
+            try {
+                facade.emitNormalizedAnydata((NormalizedAnydata) value);
+            } catch (XMLStreamException e) {
+                throw new IOException("Unable to emit anydata value: " + value, e);
+            }
         } else {
             throw new IllegalStateException("Unexpected anydata value " + value);
         }
     }
 
-    private void anydataValue(final DOMSource domSource) throws IOException {
-        final Node domNode = requireNonNull(domSource.getNode());
-        try {
-            facade.anydataWriteStreamReader(new DOMSourceXMLStreamReader(domSource));
-        } catch (XMLStreamException e) {
-            throw new IOException("Unable to transform anyXml value: " + domNode, e);
-        }
-    }
-
-    private void anydataValue(final NormalizedAnydata anydata) throws IOException {
-        try {
-            facade.emitNormalizedAnydata(anydata);
-        } catch (XMLStreamException e) {
-            throw new IOException("Unable to emit anydata value: " + anydata, e);
-        }
-    }
-
     final void anyxmlValue(final DOMSource domSource) throws IOException {
         if (domSource != null) {
             final Node domNode = requireNonNull(domSource.getNode());
index 592890a0417d508859ee1de954b4577ce2d5d33e..504a2ef3271b843c6dbd905649d2317b9499b8fb 100644 (file)
@@ -14,12 +14,13 @@ import java.io.IOException;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.rfc7952.data.api.NormalizedMetadata;
-import org.opendaylight.yangtools.rfc7952.data.util.MetadataNormalizedAnydata;
+import org.opendaylight.yangtools.rfc7952.data.util.ImmutableMetadataNormalizedAnydata;
+import org.opendaylight.yangtools.yang.data.api.schema.AnydataNormalizationException;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizableAnydata;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.util.AnydataNormalizationException;
-import org.opendaylight.yangtools.yang.data.util.NormalizableAnydata;
-import org.opendaylight.yangtools.yang.data.util.NormalizedAnydata;
+import org.opendaylight.yangtools.yang.data.util.ImmutableNormalizedAnydata;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
@@ -43,8 +44,9 @@ public abstract class AbstractNormalizableAnydata implements NormalizableAnydata
 
         final NormalizedNode<?, ?> data = result.getResult();
         final Optional<NormalizedMetadata> optMeta = result.getMetadata();
-        return optMeta.isPresent() ? new MetadataNormalizedAnydata(schemaContext, contextNode, data, optMeta.get())
-                : new NormalizedAnydata(schemaContext, contextNode, result.getResult());
+        return optMeta.isPresent()
+                ? new ImmutableMetadataNormalizedAnydata(schemaContext, contextNode, data, optMeta.get())
+                        : new ImmutableNormalizedAnydata(schemaContext, contextNode, result.getResult());
     }
 
     @Override
similarity index 64%
rename from yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/NormalizedAnydata.java
rename to yang/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ImmutableNormalizedAnydata.java
index d831822291c7fa6729695a990b6df69679682b66..6c21226f711d1c99c9df2da662d44a849baae095 100644 (file)
@@ -12,32 +12,21 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.MoreObjects.ToStringHelper;
-import java.io.IOException;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedAnydata;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
 
-/**
- * The contents of an {@code anydata} node in a normalized format. This representation acts as a schema-bound bridge
- * between the various (mostly parser-based) representations.
- *
- * <p>
- * Note this class (and all of its subclasses) rely on identity for their equality contract.
- */
 @Beta
 @NonNullByDefault
-public class NormalizedAnydata implements Immutable, SchemaContextProvider {
+public class ImmutableNormalizedAnydata implements NormalizedAnydata {
     private final SchemaContext schemaContext;
     private final DataSchemaNode contextNode;
     private final NormalizedNode<?, ?> data;
 
-    public NormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode,
+    public ImmutableNormalizedAnydata(final SchemaContext schemaContext, final DataSchemaNode contextNode,
             final NormalizedNode<?, ?> data) {
         this.schemaContext = requireNonNull(schemaContext);
         this.contextNode = requireNonNull(contextNode);
@@ -49,22 +38,16 @@ public class NormalizedAnydata implements Immutable, SchemaContextProvider {
         return schemaContext;
     }
 
+    @Override
     public final DataSchemaNode getContextNode() {
         return contextNode;
     }
 
+    @Override
     public final NormalizedNode<?, ?> getData() {
         return data;
     }
 
-    public final void writeTo(final NormalizedNodeStreamWriter writer) throws IOException {
-        writeTo(writer, true);
-    }
-
-    public void writeTo(final NormalizedNodeStreamWriter writer, final boolean orderKeyLeaves) throws IOException {
-        NormalizedNodeWriter.forStreamWriter(writer, orderKeyLeaves).write(data).flush();
-    }
-
     @Override
     public final int hashCode() {
         return super.hashCode();