8ca0e76b014961fed6232839570cc23b71c97ee1
[controller.git] / opendaylight / md-sal / sal-clustering-commons / src / main / java / org / opendaylight / controller / cluster / datastore / node / NormalizedNodeToNodeCodec.java
1 /*
2  * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.cluster.datastore.node;
10
11 import org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeSerializer;
12 import org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeSerializer.DeSerializer;
13 import org.opendaylight.controller.cluster.datastore.node.utils.serialization.NormalizedNodeSerializer.Serializer;
14 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages;
15 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages.Container;
16 import org.opendaylight.controller.protobuff.messages.common.NormalizedNodeMessages.InstanceIdentifier;
17 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
18 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
19
20 public class NormalizedNodeToNodeCodec {
21     public interface Encoded {
22         NormalizedNodeMessages.Container getEncodedNode();
23
24         NormalizedNodeMessages.InstanceIdentifier getEncodedPath();
25     }
26
27     public interface Decoded {
28         NormalizedNode<?,?> getDecodedNode();
29
30         YangInstanceIdentifier getDecodedPath();
31     }
32
33     public NormalizedNodeToNodeCodec() {
34     }
35
36     public NormalizedNodeMessages.Container encode(NormalizedNode<?,?> node) {
37         return encode(null, node).getEncodedNode();
38     }
39
40     public Encoded encode(YangInstanceIdentifier path, NormalizedNode<?,?> node) {
41
42         NormalizedNodeMessages.InstanceIdentifier serializedPath = null;
43
44         NormalizedNodeMessages.Container.Builder builder = NormalizedNodeMessages.Container.newBuilder();
45
46         // Note: parent path is no longer used
47         builder.setParentPath("");
48
49         if (node != null) {
50             if (path == null) {
51                 builder.setNormalizedNode(NormalizedNodeSerializer.serialize(node));
52             } else {
53                 Serializer serializer = NormalizedNodeSerializer.newSerializer(node);
54                 builder.setNormalizedNode(serializer.serialize(path));
55                 serializedPath = serializer.getSerializedPath();
56             }
57         }
58
59         return new EncodedImpl(builder.build(), serializedPath);
60     }
61
62
63     public NormalizedNode<?,?> decode(NormalizedNodeMessages.Node node) {
64         return decode(null, node).getDecodedNode();
65     }
66
67     public Decoded decode(NormalizedNodeMessages.InstanceIdentifier path,
68             NormalizedNodeMessages.Node node) {
69         if (node.getIntType() < 0 || node.getSerializedSize() == 0) {
70             return new DecodedImpl(null, null);
71         }
72
73         DeSerializer deSerializer = NormalizedNodeSerializer.newDeSerializer(path, node);
74         NormalizedNode<?,?> decodedNode = deSerializer.deSerialize();
75         return new DecodedImpl(decodedNode, deSerializer.getDeserializedPath());
76     }
77
78     private static class DecodedImpl implements Decoded {
79
80         private final NormalizedNode<?, ?> decodedNode;
81         private final YangInstanceIdentifier decodedPath;
82
83         DecodedImpl(NormalizedNode<?, ?> decodedNode, YangInstanceIdentifier decodedPath) {
84             this.decodedNode = decodedNode;
85             this.decodedPath = decodedPath;
86         }
87
88         @Override
89         public NormalizedNode<?, ?> getDecodedNode() {
90             return decodedNode;
91         }
92
93         @Override
94         public YangInstanceIdentifier getDecodedPath() {
95             return decodedPath;
96         }
97     }
98
99     private static class EncodedImpl implements Encoded {
100
101         private final Container encodedNode;
102         private final InstanceIdentifier encodedPath;
103
104         EncodedImpl(Container encodedNode, InstanceIdentifier encodedPath) {
105             this.encodedNode = encodedNode;
106             this.encodedPath = encodedPath;
107         }
108
109         @Override
110         public Container getEncodedNode() {
111             return encodedNode;
112         }
113
114         @Override
115         public InstanceIdentifier getEncodedPath() {
116             return encodedPath;
117         }
118     }
119 }