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=d974d7efa2744f0b4b05115930eda3fb959df28f;hb=refs%2Fchanges%2F65%2F84765%2F3;hp=163e23d2d158b3028be3af5df661a37a64bd3e4d;hpb=925cb4a228d0fda99c7bfeb432eb25285a223887;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 163e23d2d1..d974d7efa2 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 @@ -5,22 +5,26 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.cluster.datastore.modification; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + 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.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.cluster.datastore.utils.SerializationUtils; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction; +import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction; +import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; +import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter; /** * MutableCompositeModification is just a mutable version of a CompositeModification. @@ -29,24 +33,25 @@ public class MutableCompositeModification extends VersionedExternalizableMessage private static final long serialVersionUID = 1L; private final List modifications = new ArrayList<>(); + private List immutableModifications = null; public MutableCompositeModification() { this(DataStoreVersions.CURRENT_VERSION); } - public MutableCompositeModification(short version) { + public MutableCompositeModification(final short version) { super(version); } @Override - public void apply(DOMStoreWriteTransaction transaction) { + public void apply(final DOMStoreWriteTransaction transaction) { for (Modification modification : modifications) { modification.apply(transaction); } } @Override - public void apply(DataTreeModification transaction) { + public void apply(final DataTreeModification transaction) { for (Modification modification : modifications) { modification.apply(transaction); } @@ -62,71 +67,78 @@ public class MutableCompositeModification extends VersionedExternalizableMessage * * @param modification the modification to add. */ - public void addModification(Modification modification) { - modifications.add(modification); + public void addModification(final Modification modification) { + modifications.add(requireNonNull(modification)); + } + + public void addModifications(final Iterable newMods) { + for (Modification mod : newMods) { + addModification(mod); + } } @Override public List getModifications() { - return modifications; + if (immutableModifications == null) { + immutableModifications = Collections.unmodifiableList(modifications); + } + + return immutableModifications; } @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); int size = in.readInt(); + if (size > 0) { + final NormalizedNodeDataInput input = NormalizedNodeInputOutput.newDataInputWithoutValidation(in); + final ReusableStreamReceiver receiver = ReusableImmutableNormalizedNodeStreamWriter.create(); - 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())); + modifications.add(WriteModification.fromStream(input, getVersion(), receiver)); break; case Modification.MERGE: - modifications.add(MergeModification.fromStream(in, getVersion())); + modifications.add(MergeModification.fromStream(input, getVersion(), receiver)); break; case Modification.DELETE: - modifications.add(DeleteModification.fromStream(in, getVersion())); + modifications.add(DeleteModification.fromStream(input, getVersion())); break; default: break; } } - } finally { - SerializationUtils.REUSABLE_READER_TL.remove(); } } @Override - public void writeExternal(ObjectOutput out) throws IOException { + public void writeExternal(final 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); + final int size = modifications.size(); + out.writeInt(size); + if (size > 0) { + try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out, getStreamVersion())) { + for (Modification mod : modifications) { + out.writeByte(mod.getType()); + mod.writeTo(stream); + } } - } finally { - SerializationUtils.REUSABLE_WRITER_TL.remove(); } } - public static MutableCompositeModification fromSerializable(Object serializable) { - Preconditions.checkArgument(serializable instanceof MutableCompositeModification); + public static MutableCompositeModification fromSerializable(final Object serializable) { + checkArgument(serializable instanceof MutableCompositeModification); return (MutableCompositeModification)serializable; } + + @Override + public void writeTo(final NormalizedNodeDataOutput out) throws IOException { + throw new UnsupportedOperationException(); + } }