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%2Fmodification%2FMutableCompositeModification.java;h=b597742319f08a2c04a8b633baf6d525e97dff14;hp=1a005d856e30ceb3b9cd359b5fd14ef42bc14cf0;hb=2a735bfd69e79cfcf0cbd08d4596e48e3cc1069c;hpb=11e9ade9af527aba7faeb633d3c9c7552fd09d2d diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java index 1a005d856e..b597742319 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MutableCompositeModification.java @@ -8,24 +8,35 @@ package org.opendaylight.controller.cluster.datastore.modification; -import org.opendaylight.controller.protobuff.messages.persistent.PersistentMessages; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import org.opendaylight.controller.cluster.datastore.DataStoreVersions; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeOutputStreamWriter; +import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils; +import org.opendaylight.controller.protobuff.messages.persistent.PersistentMessages; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; /** * MutableCompositeModification is just a mutable version of a * CompositeModification {@link org.opendaylight.controller.cluster.datastore.modification.MutableCompositeModification#addModification(Modification)} */ -public class MutableCompositeModification - implements CompositeModification { - - private static final long serialVersionUID = 1163377899140186790L; +public class MutableCompositeModification implements CompositeModification { + private static final long serialVersionUID = 1L; private final List modifications = new ArrayList<>(); + private short version; + + public MutableCompositeModification() { + this(DataStoreVersions.CURRENT_VERSION); + } + + public MutableCompositeModification(short version) { + this.version = version; + } @Override public void apply(DOMStoreWriteTransaction transaction) { @@ -34,6 +45,19 @@ public class MutableCompositeModification } } + @Override + public byte getType() { + return COMPOSITE; + } + + public short getVersion() { + return version; + } + + public void setVersion(short version) { + this.version = version; + } + /** * Add a new Modification to the list of Modifications represented by this * composite @@ -44,23 +68,87 @@ public class MutableCompositeModification modifications.add(modification); } + @Override public List getModifications() { - return Collections.unmodifiableList(modifications); + return modifications; } - @Override public Object toSerializable() { + @Override + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + version = in.readShort(); + + int size = in.readInt(); + + if(size > 1) { + SerializationUtils.REUSABLE_READER_TL.set(new NormalizedNodeInputStreamReader(in)); + } + + try { + for(int i = 0; i < size; i++) { + byte type = in.readByte(); + switch(type) { + case Modification.WRITE: + modifications.add(WriteModification.fromStream(in, version)); + break; + + case Modification.MERGE: + modifications.add(MergeModification.fromStream(in, version)); + break; + + case Modification.DELETE: + modifications.add(DeleteModification.fromStream(in, version)); + break; + } + } + } finally { + SerializationUtils.REUSABLE_READER_TL.remove(); + } + } + + @Override + public void writeExternal(ObjectOutput out) throws IOException { + out.writeShort(version); + + out.writeInt(modifications.size()); + + if(modifications.size() > 1) { + SerializationUtils.REUSABLE_WRITER_TL.set(new NormalizedNodeOutputStreamWriter(out)); + } + + try { + for(Modification mod: modifications) { + out.writeByte(mod.getType()); + mod.writeExternal(out); + } + } finally { + SerializationUtils.REUSABLE_WRITER_TL.remove(); + } + } + + @Override + @Deprecated + public Object toSerializable() { PersistentMessages.CompositeModification.Builder builder = - PersistentMessages.CompositeModification.newBuilder(); + PersistentMessages.CompositeModification.newBuilder(); + + builder.setTimeStamp(System.nanoTime()); for (Modification m : modifications) { - builder.addModification( - (PersistentMessages.Modification) m.toSerializable()); + builder.addModification((PersistentMessages.Modification) m.toSerializable()); } return builder.build(); } - public static MutableCompositeModification fromSerializable(Object serializable, SchemaContext schemaContext){ + public static MutableCompositeModification fromSerializable(Object serializable) { + if(serializable instanceof MutableCompositeModification) { + return (MutableCompositeModification)serializable; + } else { + return fromLegacySerializable(serializable); + } + } + + private static MutableCompositeModification fromLegacySerializable(Object serializable) { PersistentMessages.CompositeModification o = (PersistentMessages.CompositeModification) serializable; MutableCompositeModification compositeModification = new MutableCompositeModification(); @@ -68,9 +156,9 @@ public class MutableCompositeModification if(m.getType().equals(DeleteModification.class.toString())){ compositeModification.addModification(DeleteModification.fromSerializable(m)); } else if(m.getType().equals(WriteModification.class.toString())){ - compositeModification.addModification(WriteModification.fromSerializable(m, schemaContext)); + compositeModification.addModification(WriteModification.fromSerializable(m)); } else if(m.getType().equals(MergeModification.class.toString())){ - compositeModification.addModification(MergeModification.fromSerializable(m, schemaContext)); + compositeModification.addModification(MergeModification.fromSerializable(m)); } }