Merge "Fix raw references to Iterator"
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / utils / serialization / NormalizedNodeSerializer.java
index 3e1bd35632385d3ec973ba96c882587867170b94..c7bf7d1f7ac2d90d9eb548b5a73a05701f5bab92 100644 (file)
@@ -9,8 +9,9 @@
 package org.opendaylight.controller.cluster.datastore.node.utils.serialization;
 
 import com.google.common.base.Preconditions;
+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.controller.protobuff.messages.common.NormalizedNodeMessages.Node.Builder;
 import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode;
@@ -32,14 +33,8 @@ import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContaine
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 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.HashMap;
-import java.util.List;
+import java.util.EnumMap;
 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;
@@ -86,11 +81,15 @@ public class NormalizedNodeSerializer {
      * @param node
      * @return
      */
-    public static NormalizedNodeMessages.Node serialize(NormalizedNode node){
+    public static NormalizedNodeMessages.Node serialize(NormalizedNode<?, ?> node){
         Preconditions.checkNotNull(node, "node should not be null");
         return new Serializer(node).serialize();
     }
 
+    public static Serializer newSerializer(NormalizedNode<?, ?> node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new Serializer(node);
+    }
 
     /**
      * DeSerialize a protocol buffer message back into a NormalizedNode
@@ -98,8 +97,15 @@ public class NormalizedNodeSerializer {
      * @param node
      * @return
      */
-    public static NormalizedNode deSerialize(NormalizedNodeMessages.Node node){
-        return new DeSerializer(node).deSerialize();
+    public static NormalizedNode<?, ?> deSerialize(NormalizedNodeMessages.Node node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new DeSerializer(null, node).deSerialize();
+    }
+
+    public static DeSerializer newDeSerializer(NormalizedNodeMessages.InstanceIdentifier path,
+            NormalizedNodeMessages.Node node) {
+        Preconditions.checkNotNull(node, "node should not be null");
+        return new DeSerializer(path, node);
     }
 
     /**
@@ -115,29 +121,40 @@ public class NormalizedNodeSerializer {
      * @param pathArgument
      * @return
      */
-    public static YangInstanceIdentifier.PathArgument deSerialize(NormalizedNodeMessages.Node node, NormalizedNodeMessages.PathArgument pathArgument){
+    public static YangInstanceIdentifier.PathArgument deSerialize(NormalizedNodeMessages.Node node,
+            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(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(YangInstanceIdentifier path) {
+            Builder builder = serialize(node);
+            serializedPath = InstanceIdentifierUtils.toSerializable(path, this);
+            return builder.addAllCode(getCodes()).build();
         }
 
         private NormalizedNodeMessages.Node.Builder serialize(
-            NormalizedNode node) {
+            NormalizedNode<?, ?> node) {
             NormalizedNodeMessages.Node.Builder builder =
                 NormalizedNodeMessages.Node.newBuilder();
 
@@ -162,17 +179,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 {
 
@@ -181,63 +198,17 @@ 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 {
+    public static class DeSerializer extends QNameDeSerializationContextImpl
+                                     implements NormalizedNodeDeSerializationContext {
         private static Map<NormalizedNodeType, DeSerializationFunction>
-            deSerializationFunctions = new HashMap<>();
+            deSerializationFunctions = new EnumMap<>(NormalizedNodeType.class);
 
         static {
             deSerializationFunctions.put(CONTAINER_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode>
@@ -255,7 +226,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(LEAF_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, Object, LeafNode<Object>>
@@ -272,7 +243,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(MAP_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         CollectionNodeBuilder<MapEntryNode, MapNode>
@@ -284,7 +255,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(MAP_ENTRY_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode>
@@ -299,7 +270,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(AUGMENTATION_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         DataContainerNodeBuilder<YangInstanceIdentifier.AugmentationIdentifier, AugmentationNode>
@@ -315,7 +286,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(LEAF_SET_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         ListNodeBuilder<Object, LeafSetEntryNode<Object>>
@@ -327,7 +298,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(LEAF_SET_ENTRY_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeWithValue, Object, LeafSetEntryNode<Object>>
@@ -342,7 +313,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(CHOICE_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         DataContainerNodeBuilder<YangInstanceIdentifier.NodeIdentifier, ChoiceNode>
@@ -359,7 +330,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(ORDERED_LEAF_SET_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         ListNodeBuilder<Object, LeafSetEntryNode<Object>>
@@ -374,7 +345,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(ORDERED_MAP_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         CollectionNodeBuilder<MapEntryNode, OrderedMapNode>
@@ -387,7 +358,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(UNKEYED_LIST_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         CollectionNodeBuilder<UnkeyedListEntryNode, UnkeyedListNode>
@@ -400,7 +371,7 @@ public class NormalizedNodeSerializer {
 
             deSerializationFunctions.put(UNKEYED_LIST_ENTRY_NODE_TYPE,
                 new DeSerializationFunction() {
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, UnkeyedListEntryNode>
@@ -418,7 +389,7 @@ public class NormalizedNodeSerializer {
             deSerializationFunctions.put(ANY_XML_NODE_TYPE,
                 new DeSerializationFunction() {
 
-                    @Override public NormalizedNode apply(
+                    @Override public NormalizedNode<?, ?> apply(
                         DeSerializer deSerializer,
                         NormalizedNodeMessages.Node node) {
                         NormalizedNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, Node<?>, AnyXmlNode>
@@ -436,25 +407,40 @@ public class NormalizedNodeSerializer {
         }
 
         private final NormalizedNodeMessages.Node node;
+        private final NormalizedNodeMessages.InstanceIdentifier path;
+        private YangInstanceIdentifier deserializedPath;
 
-        public DeSerializer(NormalizedNodeMessages.Node node){
+        public DeSerializer(NormalizedNodeMessages.InstanceIdentifier path,
+                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(NormalizedNodeMessages.Node node){
             Preconditions.checkNotNull(node, "node should not be null");
-            DeSerializationFunction deSerializationFunction =
-                Preconditions.checkNotNull(deSerializationFunctions.get(NormalizedNodeType.values()[node.getIntType()]), "Unknown type " + node);
+
+            DeSerializationFunction deSerializationFunction = deSerializationFunctions.get(
+                    NormalizedNodeType.values()[node.getIntType()]);
 
             return deSerializationFunction.apply(this, node);
         }
 
 
-        private NormalizedNode buildCollectionNode(
+        private NormalizedNode<?, ?> buildCollectionNode(
             CollectionNodeBuilder builder,
             NormalizedNodeMessages.Node node) {
 
@@ -468,7 +454,7 @@ public class NormalizedNodeSerializer {
         }
 
 
-        private NormalizedNode buildListNode(
+        private NormalizedNode<?, ?> buildListNode(
             ListNodeBuilder<Object, LeafSetEntryNode<Object>> builder,
             NormalizedNodeMessages.Node node) {
             builder.withNodeIdentifier(toNodeIdentifier(node.getPathArgument()));
@@ -480,7 +466,7 @@ public class NormalizedNodeSerializer {
             return builder.build();
         }
 
-        private NormalizedNode buildDataContainer(DataContainerNodeBuilder builder, NormalizedNodeMessages.Node node){
+        private NormalizedNode<?, ?> buildDataContainer(DataContainerNodeBuilder builder, NormalizedNodeMessages.Node node){
 
             for(NormalizedNodeMessages.Node child : node.getChildList()){
                 builder.withChild((DataContainerChild<?, ?>) deSerialize(child));
@@ -491,7 +477,7 @@ public class NormalizedNodeSerializer {
             return builder.build();
         }
 
-        private NormalizedNode buildNormalizedNode(NormalizedNodeAttrBuilder builder, NormalizedNodeMessages.Node node){
+        private NormalizedNode<?, ?> buildNormalizedNode(NormalizedNodeAttrBuilder builder, NormalizedNodeMessages.Node node){
 
             builder.withValue(ValueSerializer.deSerialize(this, node));
 
@@ -523,29 +509,13 @@ public class NormalizedNodeSerializer {
                 this, path);
         }
 
-        @Override public String getNamespace(int namespace) {
-            return node.getCode(namespace);
-        }
-
-        @Override public String getRevision(int revision) {
-            return node.getCode(revision);
-        }
-
-        @Override public String getLocalName(int localName) {
-            return node.getCode(localName);
-        }
-
         public YangInstanceIdentifier.PathArgument deSerialize(
             NormalizedNodeMessages.PathArgument pathArgument) {
             return PathArgumentSerializer.deSerialize(this, pathArgument);
         }
 
         private static interface DeSerializationFunction {
-            NormalizedNode apply(DeSerializer deserializer, NormalizedNodeMessages.Node node);
+            NormalizedNode<?, ?> apply(DeSerializer deserializer, NormalizedNodeMessages.Node node);
         }
     }
-
-
-
-
 }