2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.cluster.datastore.messages;
11 import java.io.Externalizable;
12 import java.io.IOException;
13 import java.io.ObjectInput;
14 import java.io.ObjectOutput;
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;
28 public class DataChanged implements Externalizable {
29 private static final long serialVersionUID = 1L;
31 private AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
33 public DataChanged() {
36 public DataChanged(AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
40 public AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange() {
45 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
46 in.readShort(); // Read the version
48 NormalizedNodeInputStreamReader streamReader = new NormalizedNodeInputStreamReader(in);
50 // Note: the scope passed to builder is not actually used.
51 Builder builder = DOMImmutableDataChangeEvent.builder(DataChangeScope.SUBTREE);
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);
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);
75 for(int i = 0; i < size; i++) {
76 YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
77 NormalizedNode<?, ?> node = streamReader.readNormalizedNode();
78 builder.addRemoved(path, node);
81 // Read original subtree
83 boolean present = in.readBoolean();
85 builder.setBefore(streamReader.readNormalizedNode());
88 // Read updated subtree
90 present = in.readBoolean();
92 builder.setAfter(streamReader.readNormalizedNode());
95 change = builder.build();
99 public void writeExternal(ObjectOutput out) throws IOException {
100 out.writeShort(DataStoreVersions.CURRENT_VERSION);
102 NormalizedNodeOutputStreamWriter streamWriter = new NormalizedNodeOutputStreamWriter(out);
103 NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(streamWriter);
105 // Write created data
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());
114 // Write updated data
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());
125 // Write removed data
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));
134 // Write original subtree
136 NormalizedNode<?, ?> originalSubtree = change.getOriginalSubtree();
137 out.writeBoolean(originalSubtree != null);
138 if(originalSubtree != null) {
139 nodeWriter.write(originalSubtree);
142 // Write original subtree
144 NormalizedNode<?, ?> updatedSubtree = change.getUpdatedSubtree();
145 out.writeBoolean(updatedSubtree != null);
146 if(updatedSubtree != null) {
147 nodeWriter.write(updatedSubtree);