X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fmessages%2FDataChanged.java;h=97231dc366f38b24efe7b7424f8cec1da3f9e312;hb=8ec73bf853a9b6708b455c0321a585992e02b125;hp=c55dae56dd5d77564750b6e650096bf7dff365fe;hpb=0d78fea60c4818145e7bd8479427dfc04f0f8145;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java index c55dae56dd..97231dc366 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/DataChanged.java @@ -8,20 +8,143 @@ package org.opendaylight.controller.cluster.datastore.messages; +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.util.Map; +import java.util.Set; +import org.opendaylight.controller.cluster.datastore.DataStoreVersions; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataInput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataOutput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent; +import org.opendaylight.controller.md.sal.dom.store.impl.DOMImmutableDataChangeEvent.Builder; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -public class DataChanged { - private final AsyncDataChangeEvent> - change; +public class DataChanged implements Externalizable { + private static final long serialVersionUID = 1L; - public DataChanged( - AsyncDataChangeEvent> change) { + private AsyncDataChangeEvent> change; + + public DataChanged() { + } + + public DataChanged(AsyncDataChangeEvent> change) { this.change = change; } - public AsyncDataChangeEvent> getChange() { + public AsyncDataChangeEvent> getChange() { return change; } + + @Override + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + in.readShort(); // Read the version + + NormalizedNodeDataInput streamReader = new NormalizedNodeInputStreamReader(in); + + // Note: the scope passed to builder is not actually used. + Builder builder = DOMImmutableDataChangeEvent.builder(DataChangeScope.SUBTREE); + + // Read created data + + int size = in.readInt(); + for(int i = 0; i < size; i++) { + YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); + NormalizedNode node = streamReader.readNormalizedNode(); + builder.addCreated(path, node); + } + + // Read updated data + + size = in.readInt(); + for(int i = 0; i < size; i++) { + YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); + NormalizedNode before = streamReader.readNormalizedNode(); + NormalizedNode after = streamReader.readNormalizedNode(); + builder.addUpdated(path, before, after); + } + + // Read removed data + + size = in.readInt(); + for(int i = 0; i < size; i++) { + YangInstanceIdentifier path = streamReader.readYangInstanceIdentifier(); + NormalizedNode node = streamReader.readNormalizedNode(); + builder.addRemoved(path, node); + } + + // Read original subtree + + boolean present = in.readBoolean(); + if(present) { + builder.setBefore(streamReader.readNormalizedNode()); + } + + // Read updated subtree + + present = in.readBoolean(); + if(present) { + builder.setAfter(streamReader.readNormalizedNode()); + } + + change = builder.build(); + } + + @Override + public void writeExternal(ObjectOutput out) throws IOException { + out.writeShort(DataStoreVersions.CURRENT_VERSION); + + NormalizedNodeDataOutput streamWriter = NormalizedNodeInputOutput.newDataOutput(out); + + // Write created data + + Map> createdData = change.getCreatedData(); + out.writeInt(createdData.size()); + for(Map.Entry> e: createdData.entrySet()) { + streamWriter.writeYangInstanceIdentifier(e.getKey()); + streamWriter.writeNormalizedNode(e.getValue()); + } + + // Write updated data + + Map> originalData = change.getOriginalData(); + Map> updatedData = change.getUpdatedData(); + out.writeInt(updatedData.size()); + for(Map.Entry> e: updatedData.entrySet()) { + streamWriter.writeYangInstanceIdentifier(e.getKey()); + streamWriter.writeNormalizedNode(originalData.get(e.getKey())); + streamWriter.writeNormalizedNode(e.getValue()); + } + + // Write removed data + + Set removed = change.getRemovedPaths(); + out.writeInt(removed.size()); + for(YangInstanceIdentifier path: removed) { + streamWriter.writeYangInstanceIdentifier(path); + streamWriter.writeNormalizedNode(originalData.get(path)); + } + + // Write original subtree + + NormalizedNode originalSubtree = change.getOriginalSubtree(); + out.writeBoolean(originalSubtree != null); + if(originalSubtree != null) { + streamWriter.writeNormalizedNode(originalSubtree); + } + + // Write original subtree + + NormalizedNode updatedSubtree = change.getUpdatedSubtree(); + out.writeBoolean(updatedSubtree != null); + if(updatedSubtree != null) { + streamWriter.writeNormalizedNode(updatedSubtree); + } + } }