Bug 2265: Use new NormalizedNode streaming in messages
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / messages / DataChanged.java
1 /*
2  * Copyright (c) 2014 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.messages;
10
11 import java.io.Externalizable;
12 import java.io.IOException;
13 import java.io.ObjectInput;
14 import java.io.ObjectOutput;
15 import java.util.Map;
16 import java.util.Set;
17 import org.opendaylight.controller.cluster.datastore.DataStoreVersions;
18 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader;
19 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeOutputStreamWriter;
20 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
21 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
22 import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent;
23 import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
26 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
27
28 public class DataChanged implements Externalizable {
29     private static final long serialVersionUID = 1L;
30
31     private AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
32
33     public DataChanged() {
34     }
35
36     public DataChanged(AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
37         this.change = change;
38     }
39
40     public AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange() {
41         return change;
42     }
43
44     @Override
45     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
46         in.readShort(); // Read the version
47
48         NormalizedNodeInputStreamReader streamReader = new NormalizedNodeInputStreamReader(in);
49
50         // Note: the scope passed to builder is not actually used.
51         Builder builder = DOMImmutableDataChangeEvent.builder(DataChangeScope.SUBTREE);
52
53         // Read created data
54
55         int size = in.readInt();
56         for(int i = 0; i < size; i++) {
57             YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
58             NormalizedNode<?, ?> node = streamReader.readNormalizedNode();
59             builder.addCreated(path, node);
60         }
61
62         // Read updated data
63
64         size = in.readInt();
65         for(int i = 0; i < size; i++) {
66             YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
67             NormalizedNode<?, ?> before = streamReader.readNormalizedNode();
68             NormalizedNode<?, ?> after = streamReader.readNormalizedNode();
69             builder.addUpdated(path, before, after);
70         }
71
72         // Read removed data
73
74         size = in.readInt();
75         for(int i = 0; i < size; i++) {
76             YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
77             NormalizedNode<?, ?> node = streamReader.readNormalizedNode();
78             builder.addRemoved(path, node);
79         }
80
81         // Read original subtree
82
83         boolean present = in.readBoolean();
84         if(present) {
85             builder.setBefore(streamReader.readNormalizedNode());
86         }
87
88         // Read updated subtree
89
90         present = in.readBoolean();
91         if(present) {
92             builder.setAfter(streamReader.readNormalizedNode());
93         }
94
95         change = builder.build();
96     }
97
98     @Override
99     public void writeExternal(ObjectOutput out) throws IOException {
100         out.writeShort(DataStoreVersions.CURRENT_VERSION);
101
102         NormalizedNodeOutputStreamWriter streamWriter = new NormalizedNodeOutputStreamWriter(out);
103         NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(streamWriter);
104
105         // Write created data
106
107         Map<YangInstanceIdentifier, NormalizedNode<?, ?>> createdData = change.getCreatedData();
108         out.writeInt(createdData.size());
109         for(Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> e: createdData.entrySet()) {
110             streamWriter.writeYangInstanceIdentifier(e.getKey());
111             nodeWriter.write(e.getValue());
112         }
113
114         // Write updated data
115
116         Map<YangInstanceIdentifier, NormalizedNode<?, ?>> originalData = change.getOriginalData();
117         Map<YangInstanceIdentifier, NormalizedNode<?, ?>> updatedData = change.getUpdatedData();
118         out.writeInt(updatedData.size());
119         for(Map.Entry<YangInstanceIdentifier, NormalizedNode<?, ?>> e: updatedData.entrySet()) {
120             streamWriter.writeYangInstanceIdentifier(e.getKey());
121             nodeWriter.write(originalData.get(e.getKey()));
122             nodeWriter.write(e.getValue());
123         }
124
125         // Write removed data
126
127         Set<YangInstanceIdentifier> removed = change.getRemovedPaths();
128         out.writeInt(removed.size());
129         for(YangInstanceIdentifier path: removed) {
130             streamWriter.writeYangInstanceIdentifier(path);
131             nodeWriter.write(originalData.get(path));
132         }
133
134         // Write original subtree
135
136         NormalizedNode<?, ?> originalSubtree = change.getOriginalSubtree();
137         out.writeBoolean(originalSubtree != null);
138         if(originalSubtree != null) {
139             nodeWriter.write(originalSubtree);
140         }
141
142         // Write original subtree
143
144         NormalizedNode<?, ?> updatedSubtree = change.getUpdatedSubtree();
145         out.writeBoolean(updatedSubtree != null);
146         if(updatedSubtree != null) {
147             nodeWriter.write(updatedSubtree);
148         }
149     }
150 }