X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fmessages%2FDataChanged.java;h=c753ad27646f213237e0171a38d965922b23de2e;hp=c55dae56dd5d77564750b6e650096bf7dff365fe;hb=bd11e415d86b815a30e3559e199f1ad4637bd02b;hpb=0d78fea60c4818145e7bd8479427dfc04f0f8145 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..c753ad2764 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.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 { + // Read the version + in.readShort(); + + NormalizedNodeDataInput streamReader = NormalizedNodeInputOutput.newDataInputWithoutValidation(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); + } + } }