Mechanical code cleanup (sal-clustering-commons)
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / serialization / NormalizedNodeSerializer.java
index 44da4a56683558e9b15b8a1e94d1af8c10d1a3df..e4ba73c3b1c49e4d8a88c9fed18067ba342f5dc3 100644 (file)
@@ -8,12 +8,33 @@
 
 package org.opendaylight.controller.cluster.datastore.node.utils.serialization;
 
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ANY_XML_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.AUGMENTATION_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.CHOICE_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.CONTAINER_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_SET_ENTRY_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_SET_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.MAP_ENTRY_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.MAP_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ORDERED_LEAF_SET_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ORDERED_MAP_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.UNKEYED_LIST_ENTRY_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.UNKEYED_LIST_NODE_TYPE;
+import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.getSerializableNodeType;
 import com.google.common.base.Preconditions;
-
+import com.google.common.collect.Maps;
+import java.util.EnumMap;
+import java.util.Map;
+import javax.xml.transform.dom.DOMSource;
+import org.opendaylight.controller.cluster.datastore.util.InstanceIdentifierUtils;
 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages;
-import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
-import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages.Node.Builder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
+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.AnyXmlNode;
 import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
@@ -22,11 +43,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
@@ -34,29 +52,6 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContaine
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ANY_XML_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.AUGMENTATION_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.CHOICE_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.CONTAINER_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_SET_ENTRY_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.LEAF_SET_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.MAP_ENTRY_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.MAP_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ORDERED_LEAF_SET_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.ORDERED_MAP_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.UNKEYED_LIST_ENTRY_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.UNKEYED_LIST_NODE_TYPE;
-import static org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeType.getSerializableNodeType;
-
 /**
  * NormalizedNodeSerializer can be used to convert a Normalized node to and and
  * from a protocol buffer message.
@@ -88,11 +83,15 @@ public class NormalizedNodeSerializer {
      * @param node
      * @return
      */
-    public static NormalizedNodeMessages.Node serialize(NormalizedNode node){
+    public static NormalizedNodeMessages.Node serialize(final NormalizedNode<?, ?> node){
         Preconditions.checkNotNull(node, "node should not be null");
         return new Serializer(node).serialize();
     }
 
+    public static Serializer newSerializer(final NormalizedNode<?, ?> node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new Serializer(node);
+    }
 
     /**
      * DeSerialize a protocol buffer message back into a NormalizedNode
@@ -100,8 +99,15 @@ public class NormalizedNodeSerializer {
      * @param node
      * @return
      */
-    public static NormalizedNode deSerialize(NormalizedNodeMessages.Node node){
-        return new DeSerializer(node).deSerialize();
+    public static NormalizedNode<?, ?> deSerialize(final NormalizedNodeMessages.Node node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new DeSerializer(null, node).deSerialize();
+    }
+
+    public static DeSerializer newDeSerializer(final NormalizedNodeMessages.InstanceIdentifier path,
+            final NormalizedNodeMessages.Node node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new DeSerializer(path, node);
     }
 
     /**
@@ -117,29 +123,40 @@ public class NormalizedNodeSerializer {
      * @param pathArgument
      * @return
      */
-    public static YangInstanceIdentifier.PathArgument deSerialize(NormalizedNodeMessages.Node node, NormalizedNodeMessages.PathArgument pathArgument){
+    public static YangInstanceIdentifier.PathArgument deSerialize(final NormalizedNodeMessages.Node node,
+            final NormalizedNodeMessages.PathArgument pathArgument){
         Preconditions.checkNotNull(node, "node should not be null");
         Preconditions.checkNotNull(pathArgument, "pathArgument should not be null");
-        return new DeSerializer(node).deSerialize(pathArgument);
+        return new DeSerializer(null, node).deSerialize(pathArgument);
     }
 
-    private static class Serializer implements NormalizedNodeSerializationContext {
+    public static class Serializer extends QNameSerializationContextImpl
+                                   implements NormalizedNodeSerializationContext {
 
-        private final NormalizedNode node;
+        private final NormalizedNode<?, ?> node;
 
-        private final Map<Object, Integer> codeMap = new HashMap<>();
-        private final List<String> codes = new ArrayList<>();
+        private NormalizedNodeMessages.InstanceIdentifier serializedPath;
 
-        private Serializer(NormalizedNode node) {
+        private Serializer(final NormalizedNode<?, ?> node) {
             this.node = node;
         }
 
-        private NormalizedNodeMessages.Node serialize() {
-            return this.serialize(node).addAllCode(codes).build();
+        public NormalizedNodeMessages.InstanceIdentifier getSerializedPath() {
+            return serializedPath;
+        }
+
+        public NormalizedNodeMessages.Node serialize() {
+            return this.serialize(node).addAllCode(getCodes()).build();
+        }
+
+        public NormalizedNodeMessages.Node serialize(final YangInstanceIdentifier path) {
+            Builder builder = serialize(node);
+            serializedPath = InstanceIdentifierUtils.toSerializable(path, this);
+            return builder.addAllCode(getCodes()).build();
         }
 
         private NormalizedNodeMessages.Node.Builder serialize(
-            NormalizedNode node) {
+            final NormalizedNode<?, ?> node) {
             NormalizedNodeMessages.Node.Builder builder =
                 NormalizedNodeMessages.Node.newBuilder();
 
@@ -164,17 +181,17 @@ public class NormalizedNodeSerializer {
                 ValueSerializer.serialize(builder, this, value);
 
             } else if (value instanceof Iterable) {
-                Iterable iterable = (Iterable) value;
+                Iterable<?> iterable = (Iterable<?>) value;
 
                 for (Object o : iterable) {
                     if (o instanceof NormalizedNode) {
-                        builder.addChild(serialize((NormalizedNode) o));
+                        builder.addChild(serialize((NormalizedNode<?, ?>) o));
                     }
                 }
 
             } else if (value instanceof NormalizedNode) {
 
-                builder.addChild(serialize((NormalizedNode) value));
+                builder.addChild(serialize((NormalizedNode<?, ?>) value));
 
             } else {
 
@@ -183,283 +200,161 @@ public class NormalizedNodeSerializer {
 
             return builder;
         }
-
-
-        @Override public int addNamespace(URI namespace) {
-            int namespaceInt = getCode(namespace);
-
-            if(namespaceInt == -1) {
-                namespaceInt = addCode(namespace, namespace.toString());
-            }
-            return namespaceInt;
-        }
-
-        @Override public int addRevision(Date revision) {
-            if(revision == null){
-                return -1;
-            }
-
-            int revisionInt = getCode(revision);
-            if(revisionInt == -1) {
-                String formattedRevision =
-                    SimpleDateFormatUtil.getRevisionFormat().format(revision);
-                revisionInt = addCode(revision, formattedRevision);
-            }
-            return revisionInt;
-        }
-
-        @Override public int addLocalName(String localName) {
-            int localNameInt = getCode(localName);
-            if(localNameInt == -1) {
-                localNameInt = addCode(localName, localName.toString());
-            }
-            return localNameInt;
-
-        }
-
-        public int addCode(Object code, String codeStr){
-            int count = codes.size();
-            codes.add(codeStr);
-            codeMap.put(code, Integer.valueOf(count));
-            return count;
-        }
-
-        public int getCode(Object code){
-            if(codeMap.containsKey(code)){
-                return codeMap.get(code);
-            }
-            return -1;
-        }
     }
 
-    private static class DeSerializer implements NormalizedNodeDeSerializationContext {
-        private static Map<NormalizedNodeType, DeSerializationFunction>
-            deSerializationFunctions = new EnumMap<>(NormalizedNodeType.class);
-
+    public static class DeSerializer extends QNameDeSerializationContextImpl
+                                     implements NormalizedNodeDeSerializationContext {
+        private static final Map<NormalizedNodeType, DeSerializationFunction> DESERIALIZATION_FUNCTIONS;
         static {
-            deSerializationFunctions.put(CONTAINER_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode>
-                            builder = Builders.containerBuilder();
-
-                        builder
-                            .withNodeIdentifier(deSerializer.toNodeIdentifier(
-                                node.getPathArgument()));
-
-                        return deSerializer.buildDataContainer(builder, node);
-
-                    }
-
-                });
-
-            deSerializationFunctions.put(LEAF_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, Object, LeafNode<Object>>
-                            builder = Builders.leafBuilder();
-
-                        builder
-                            .withNodeIdentifier(deSerializer.toNodeIdentifier(
-                                node.getPathArgument()));
-
-                        return deSerializer.buildNormalizedNode(builder, node);
-
-                    }
-                });
-
-            deSerializationFunctions.put(MAP_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        CollectionNodeBuilder<MapEntryNode, MapNode>
-                            builder = Builders.mapBuilder();
-
-                        return deSerializer.buildCollectionNode(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(MAP_ENTRY_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
-                            builder = Builders.mapEntryBuilder();
+            final EnumMap<NormalizedNodeType, DeSerializationFunction> m = new EnumMap<>(NormalizedNodeType.class);
 
-                        builder.withNodeIdentifier(deSerializer.toNodeIdentifierWithPredicates(
-                            node.getPathArgument()));
+            m.put(CONTAINER_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    DataContainerNodeAttrBuilder<NodeIdentifier, ContainerNode> builder = Builders.containerBuilder()
+                            .withNodeIdentifier(deSerializer.toNodeIdentifier(node.getPathArgument()));
 
-                        return deSerializer.buildDataContainer(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(AUGMENTATION_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        DataContainerNodeBuilder<YangInstanceIdentifier.AugmentationIdentifier, AugmentationNode>
-                            builder = Builders.augmentationBuilder();
-
-                        builder.withNodeIdentifier(
-                            deSerializer.toAugmentationIdentifier(
-                                node.getPathArgument()));
-
-                        return deSerializer.buildDataContainer(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(LEAF_SET_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        ListNodeBuilder<Object, LeafSetEntryNode<Object>>
-                            builder = Builders.leafSetBuilder();
-
-                        return deSerializer.buildListNode(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(LEAF_SET_ENTRY_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeWithValue, Object, LeafSetEntryNode<Object>>
-                            builder = Builders.leafSetEntryBuilder();
-
-                        builder.withNodeIdentifier(deSerializer.toNodeWithValue(
-                            node.getPathArgument()));
-
-                        return deSerializer.buildNormalizedNode(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(CHOICE_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifier, ChoiceNode>
-                            builder =
-                            Builders.choiceBuilder();
-
-                        builder
-                            .withNodeIdentifier(deSerializer.toNodeIdentifier(
+                    return deSerializer.buildDataContainer(builder, node);
+                }
+            });
+            m.put(LEAF_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    NormalizedNodeAttrBuilder<NodeIdentifier, Object, LeafNode<Object>> builder = Builders.leafBuilder()
+                            .withNodeIdentifier(deSerializer.toNodeIdentifier(node.getPathArgument()));
+
+                    return deSerializer.buildNormalizedNode(builder, node);
+                }
+            });
+            m.put(MAP_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    return deSerializer.buildCollectionNode(Builders.mapBuilder(), node);
+                }
+            });
+            m.put(MAP_ENTRY_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    DataContainerNodeAttrBuilder<NodeIdentifierWithPredicates, MapEntryNode> builder =
+                            Builders.mapEntryBuilder().withNodeIdentifier(deSerializer.toNodeIdentifierWithPredicates(
                                 node.getPathArgument()));
 
-                        return deSerializer.buildDataContainer(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(ORDERED_LEAF_SET_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        ListNodeBuilder<Object, LeafSetEntryNode<Object>>
-                            builder =
-                            Builders.orderedLeafSetBuilder();
-
-                        return deSerializer.buildListNode(builder, node);
-
-
-                    }
-                });
-
-            deSerializationFunctions.put(ORDERED_MAP_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        CollectionNodeBuilder<MapEntryNode, OrderedMapNode>
-                            builder =
-                            Builders.orderedMapBuilder();
-
-                        return deSerializer.buildCollectionNode(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(UNKEYED_LIST_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode>
-                            builder =
-                            Builders.unkeyedListBuilder();
-
-                        return deSerializer.buildCollectionNode(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(UNKEYED_LIST_ENTRY_NODE_TYPE,
-                new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, UnkeyedListEntryNode>
-                            builder =
-                            Builders.unkeyedListEntryBuilder();
-
-                        builder
-                            .withNodeIdentifier(deSerializer.toNodeIdentifier(
+                    return deSerializer.buildDataContainer(builder, node);
+                }
+            });
+            m.put(AUGMENTATION_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    DataContainerNodeBuilder<AugmentationIdentifier, AugmentationNode> builder =
+                            Builders.augmentationBuilder().withNodeIdentifier(
+                                deSerializer.toAugmentationIdentifier(node.getPathArgument()));
+
+                    return deSerializer.buildDataContainer(builder, node);
+                }
+            });
+            m.put(LEAF_SET_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    return deSerializer.buildListNode(Builders.leafSetBuilder(), node);
+                }
+            });
+            m.put(LEAF_SET_ENTRY_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    NormalizedNodeAttrBuilder<NodeWithValue, Object, LeafSetEntryNode<Object>> builder =
+                            Builders.leafSetEntryBuilder().withNodeIdentifier(deSerializer.toNodeWithValue(
                                 node.getPathArgument()));
 
-                        return deSerializer.buildDataContainer(builder, node);
-                    }
-                });
-
-            deSerializationFunctions.put(ANY_XML_NODE_TYPE,
-                new DeSerializationFunction() {
-
-                    @Override public NormalizedNode apply(
-                        DeSerializer deSerializer,
-                        NormalizedNodeMessages.Node node) {
-                        NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, Node<?>, AnyXmlNode>
-                            builder =
-                            Builders.anyXmlBuilder();
-
-                        builder
-                            .withNodeIdentifier(deSerializer.toNodeIdentifier(
+                    return deSerializer.buildNormalizedNode(builder, node);
+                }
+            });
+            m.put(CHOICE_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    DataContainerNodeBuilder<NodeIdentifier, ChoiceNode> builder = Builders.choiceBuilder()
+                            .withNodeIdentifier(deSerializer.toNodeIdentifier(node.getPathArgument()));
+
+                    return deSerializer.buildDataContainer(builder, node);
+                }
+            });
+            m.put(ORDERED_LEAF_SET_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    return deSerializer.buildListNode(Builders.orderedLeafSetBuilder(), node);
+                }
+            });
+            m.put(ORDERED_MAP_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    return deSerializer.buildCollectionNode(Builders.orderedMapBuilder(), node);
+                }
+            });
+            m.put(UNKEYED_LIST_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    return deSerializer.buildCollectionNode(Builders.unkeyedListBuilder(), node);
+                }
+            });
+            m.put(UNKEYED_LIST_ENTRY_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    DataContainerNodeAttrBuilder<NodeIdentifier, UnkeyedListEntryNode> builder =
+                            Builders.unkeyedListEntryBuilder().withNodeIdentifier(deSerializer.toNodeIdentifier(
                                 node.getPathArgument()));
 
-                        return deSerializer.buildNormalizedNode(builder, node);
-                    }
-                });
+                    return deSerializer.buildDataContainer(builder, node);
+                }
+            });
+            m.put(ANY_XML_NODE_TYPE, new DeSerializationFunction() {
+                @Override
+                public NormalizedNode<?, ?> apply(final DeSerializer deSerializer, final NormalizedNodeMessages.Node node) {
+                    NormalizedNodeAttrBuilder<NodeIdentifier, DOMSource, AnyXmlNode> builder = Builders.anyXmlBuilder()
+                            .withNodeIdentifier(deSerializer.toNodeIdentifier(node.getPathArgument()));
+
+                    return deSerializer.buildNormalizedNode(builder, node);
+                }
+            });
 
+            DESERIALIZATION_FUNCTIONS = Maps.immutableEnumMap(m);
         }
 
         private final NormalizedNodeMessages.Node node;
+        private final NormalizedNodeMessages.InstanceIdentifier path;
+        private YangInstanceIdentifier deserializedPath;
 
-        public DeSerializer(NormalizedNodeMessages.Node node){
+        public DeSerializer(final NormalizedNodeMessages.InstanceIdentifier path,
+                final NormalizedNodeMessages.Node node) {
+            super(node.getCodeList());
+            this.path = path;
             this.node = node;
         }
 
-        public NormalizedNode deSerialize(){
-            return deSerialize(node);
+        public YangInstanceIdentifier getDeserializedPath() {
+            return deserializedPath;
+        }
+
+        public NormalizedNode<?, ?> deSerialize() {
+            NormalizedNode<?, ?> deserializedNode = deSerialize(node);
+            if(path != null) {
+                deserializedPath = InstanceIdentifierUtils.fromSerializable(path, this);
+            }
+
+            return deserializedNode;
         }
 
-        private NormalizedNode deSerialize(NormalizedNodeMessages.Node node){
+        private NormalizedNode<?, ?> deSerialize(final NormalizedNodeMessages.Node node){
             Preconditions.checkNotNull(node, "node should not be null");
 
-            DeSerializationFunction deSerializationFunction = deSerializationFunctions.get(
+            DeSerializationFunction deSerializationFunction = DESERIALIZATION_FUNCTIONS.get(
                     NormalizedNodeType.values()[node.getIntType()]);
 
             return deSerializationFunction.apply(this, node);
         }
 
 
-        private NormalizedNode buildCollectionNode(
-            CollectionNodeBuilder builder,
-            NormalizedNodeMessages.Node node) {
+        private NormalizedNode<?, ?> buildCollectionNode(
+            final CollectionNodeBuilder builder,
+            final NormalizedNodeMessages.Node node) {
 
             builder.withNodeIdentifier(toNodeIdentifier(node.getPathArgument()));
 
@@ -471,9 +366,9 @@ public class NormalizedNodeSerializer {
         }
 
 
-        private NormalizedNode buildListNode(
-            ListNodeBuilder<Object, LeafSetEntryNode<Object>> builder,
-            NormalizedNodeMessages.Node node) {
+        private NormalizedNode<?, ?> buildListNode(
+            final ListNodeBuilder<Object, LeafSetEntryNode<Object>> builder,
+            final NormalizedNodeMessages.Node node) {
             builder.withNodeIdentifier(toNodeIdentifier(node.getPathArgument()));
 
             for(NormalizedNodeMessages.Node child : node.getChildList()){
@@ -483,7 +378,7 @@ public class NormalizedNodeSerializer {
             return builder.build();
         }
 
-        private NormalizedNode buildDataContainer(DataContainerNodeBuilder builder, NormalizedNodeMessages.Node node){
+        private NormalizedNode<?, ?> buildDataContainer(final DataContainerNodeBuilder<?, ?> builder, final NormalizedNodeMessages.Node node){
 
             for(NormalizedNodeMessages.Node child : node.getChildList()){
                 builder.withChild((DataContainerChild<?, ?>) deSerialize(child));
@@ -494,7 +389,7 @@ public class NormalizedNodeSerializer {
             return builder.build();
         }
 
-        private NormalizedNode buildNormalizedNode(NormalizedNodeAttrBuilder builder, NormalizedNodeMessages.Node node){
+        private NormalizedNode<?, ?> buildNormalizedNode(final NormalizedNodeAttrBuilder builder, final NormalizedNodeMessages.Node node){
 
             builder.withValue(ValueSerializer.deSerialize(this, node));
 
@@ -504,47 +399,30 @@ public class NormalizedNodeSerializer {
 
         }
 
-
-        private YangInstanceIdentifier.NodeIdentifierWithPredicates toNodeIdentifierWithPredicates(
-            NormalizedNodeMessages.PathArgument path) {
-            return (YangInstanceIdentifier.NodeIdentifierWithPredicates) PathArgumentSerializer.deSerialize(this, path);
-        }
-
-        private YangInstanceIdentifier.AugmentationIdentifier toAugmentationIdentifier(
-            NormalizedNodeMessages.PathArgument path) {
-            return (YangInstanceIdentifier.AugmentationIdentifier) PathArgumentSerializer.deSerialize(this, path);
-        }
-
-        private YangInstanceIdentifier.NodeWithValue toNodeWithValue(
-            NormalizedNodeMessages.PathArgument path) {
-            return (YangInstanceIdentifier.NodeWithValue) PathArgumentSerializer.deSerialize(
-                this, path);
-        }
-
-        private YangInstanceIdentifier.NodeIdentifier toNodeIdentifier(NormalizedNodeMessages.PathArgument path){
-            return (YangInstanceIdentifier.NodeIdentifier) PathArgumentSerializer.deSerialize(
-                this, path);
+        private NodeIdentifierWithPredicates toNodeIdentifierWithPredicates(
+            final NormalizedNodeMessages.PathArgument path) {
+            return (NodeIdentifierWithPredicates) PathArgumentSerializer.deSerialize(this, path);
         }
 
-        @Override public String getNamespace(int namespace) {
-            return node.getCode(namespace);
+        private AugmentationIdentifier toAugmentationIdentifier(final NormalizedNodeMessages.PathArgument path) {
+            return (AugmentationIdentifier) PathArgumentSerializer.deSerialize(this, path);
         }
 
-        @Override public String getRevision(int revision) {
-            return node.getCode(revision);
+        @SuppressWarnings("unchecked")
+        private <T> NodeWithValue<T> toNodeWithValue(final NormalizedNodeMessages.PathArgument path) {
+            return (NodeWithValue<T>) PathArgumentSerializer.deSerialize(this, path);
         }
 
-        @Override public String getLocalName(int localName) {
-            return node.getCode(localName);
+        private NodeIdentifier toNodeIdentifier(final NormalizedNodeMessages.PathArgument path){
+            return (NodeIdentifier) PathArgumentSerializer.deSerialize(this, path);
         }
 
-        public YangInstanceIdentifier.PathArgument deSerialize(
-            NormalizedNodeMessages.PathArgument pathArgument) {
+        public YangInstanceIdentifier.PathArgument deSerialize(final NormalizedNodeMessages.PathArgument pathArgument) {
             return PathArgumentSerializer.deSerialize(this, pathArgument);
         }
 
-        private static interface DeSerializationFunction {
-            NormalizedNode apply(DeSerializer deserializer, NormalizedNodeMessages.Node node);
+        private interface DeSerializationFunction {
+            NormalizedNode<?, ?> apply(DeSerializer deserializer, NormalizedNodeMessages.Node node);
         }
     }
 }