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.NormalizedNodeDataInput;
19 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataOutput;
20 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput;
21 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader;
22 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
23 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
24 import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent;
25 import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder;
26 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
27 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
29 public class DataChanged implements Externalizable {
30 private static final long serialVersionUID = 1L;
32 private AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change;
34 public DataChanged() {
37 public DataChanged(AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> change) {
41 public AsyncDataChangeEvent<YangInstanceIdentifier, NormalizedNode<?, ?>> getChange() {
46 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
47 in.readShort(); // Read the version
49 NormalizedNodeDataInput streamReader = new NormalizedNodeInputStreamReader(in);
51 // Note: the scope passed to builder is not actually used.
52 Builder builder = DOMImmutableDataChangeEvent.builder(DataChangeScope.SUBTREE);
56 int size = in.readInt();
57 for(int i = 0; i < size; i++) {
58 YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
59 NormalizedNode<?, ?> node = streamReader.readNormalizedNode();
60 builder.addCreated(path, node);
66 for(int i = 0; i < size; i++) {
67 YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
68 NormalizedNode<?, ?> before = streamReader.readNormalizedNode();
69 NormalizedNode<?, ?> after = streamReader.readNormalizedNode();
70 builder.addUpdated(path, before, after);
76 for(int i = 0; i < size; i++) {
77 YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier();
78 NormalizedNode<?, ?> node = streamReader.readNormalizedNode();
79 builder.addRemoved(path, node);
82 // Read original subtree
84 boolean present = in.readBoolean();
86 builder.setBefore(streamReader.readNormalizedNode());
89 // Read updated subtree
91 present = in.readBoolean();
93 builder.setAfter(streamReader.readNormalizedNode());
96 change = builder.build();
100 public void writeExternal(ObjectOutput out) throws IOException {
101 out.writeShort(DataStoreVersions.CURRENT_VERSION);
103 NormalizedNodeDataOutput streamWriter = NormalizedNodeInputOutput.newDataOutput(out);
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 streamWriter.writeNormalizedNode(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 streamWriter.writeNormalizedNode(originalData.get(e.getKey()));
122 streamWriter.writeNormalizedNode(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 streamWriter.writeNormalizedNode(originalData.get(path));
134 // Write original subtree
136 NormalizedNode<?, ?> originalSubtree = change.getOriginalSubtree();
137 out.writeBoolean(originalSubtree != null);
138 if(originalSubtree != null) {
139 streamWriter.writeNormalizedNode(originalSubtree);
142 // Write original subtree
144 NormalizedNode<?, ?> updatedSubtree = change.getUpdatedSubtree();
145 out.writeBoolean(updatedSubtree != null);
146 if(updatedSubtree != null) {
147 streamWriter.writeNormalizedNode(updatedSubtree);