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%2Fmodification%2FMutableCompositeModification.java;h=f2a8c00d19035120b8bcac7b522d3d97465cd29e;hb=2bc808b02828fde2da3dd9bfabab658156faa3c6;hp=983ac860e1e458f068b2cbf5df7575d38e7ba6b2;hpb=324c96119dec46d0fee5e641f0a26caac478c23b;p=controller.git 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 983ac860e1..f2a8c00d19 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,28 +8,138 @@ package org.opendaylight.controller.cluster.datastore.modification; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; - +import com.google.common.base.Preconditions; +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.messages.VersionedExternalizableMessage; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputOutput; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader; +import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; +import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; +import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; + +/** + * MutableCompositeModification is just a mutable version of a CompositeModification. + */ +public class MutableCompositeModification extends VersionedExternalizableMessage implements CompositeModification { + private static final long serialVersionUID = 1L; + + private final List modifications = new ArrayList<>(); + private List immutableModifications = null; + + public MutableCompositeModification() { + this(DataStoreVersions.CURRENT_VERSION); + } -public class MutableCompositeModification implements CompositeModification { - private final List modifications = new ArrayList<>(); + public MutableCompositeModification(short version) { + super(version); + } + + @Override + public void apply(DOMStoreWriteTransaction transaction) { + for (Modification modification : modifications) { + modification.apply(transaction); + } + } + + @Override + public void apply(DataTreeModification transaction) { + for (Modification modification : modifications) { + modification.apply(transaction); + } + } + + @Override + public byte getType() { + return COMPOSITE; + } - @Override - public void apply(DOMStoreWriteTransaction transaction) { - for(Modification modification : modifications){ - modification.apply(transaction); + /** + * Add a new Modification to the list of Modifications represented by this composite. + * + * @param modification the modification to add. + */ + public void addModification(Modification modification) { + Preconditions.checkNotNull(modification); + modifications.add(modification); } - } - public void addModification(Modification modification){ - modifications.add(modification); - } + public void addModifications(Iterable newMods) { + for (Modification mod : newMods) { + addModification(mod); + } + } - public List getModifications(){ - return Collections.unmodifiableList(modifications); - } + @Override + public List getModifications() { + if (immutableModifications == null) { + immutableModifications = Collections.unmodifiableList(modifications); + } + return immutableModifications; + } + + @Override + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + + 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, getVersion())); + break; + + case Modification.MERGE: + modifications.add(MergeModification.fromStream(in, getVersion())); + break; + + case Modification.DELETE: + modifications.add(DeleteModification.fromStream(in, getVersion())); + break; + default: + break; + } + } + } finally { + SerializationUtils.REUSABLE_READER_TL.remove(); + } + } + + @Override + public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + + out.writeInt(modifications.size()); + + if (modifications.size() > 1) { + SerializationUtils.REUSABLE_WRITER_TL.set(NormalizedNodeInputOutput.newDataOutput(out)); + } + + try { + for (Modification mod: modifications) { + out.writeByte(mod.getType()); + mod.writeExternal(out); + } + } finally { + SerializationUtils.REUSABLE_WRITER_TL.remove(); + } + } + + public static MutableCompositeModification fromSerializable(Object serializable) { + Preconditions.checkArgument(serializable instanceof MutableCompositeModification); + return (MutableCompositeModification)serializable; + } }