2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.cluster.datastore.modification;
11 import java.io.IOException;
12 import java.io.ObjectInput;
13 import java.io.ObjectOutput;
14 import java.util.ArrayList;
15 import java.util.List;
16 import org.opendaylight.controller.cluster.datastore.DataStoreVersions;
17 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeInputStreamReader;
18 import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeOutputStreamWriter;
19 import org.opendaylight.controller.cluster.datastore.utils.SerializationUtils;
20 import org.opendaylight.controller.protobuff.messages.persistent.PersistentMessages;
21 import org.opendaylight.controller.sal.core.spi.data.DOMStoreWriteTransaction;
24 * MutableCompositeModification is just a mutable version of a
25 * CompositeModification {@link org.opendaylight.controller.cluster.datastore.modification.MutableCompositeModification#addModification(Modification)}
27 public class MutableCompositeModification implements CompositeModification {
28 private static final long serialVersionUID = 1L;
30 private final List<Modification> modifications;
32 public MutableCompositeModification() {
33 modifications = new ArrayList<>();
37 public void apply(DOMStoreWriteTransaction transaction) {
38 for (Modification modification : modifications) {
39 modification.apply(transaction);
44 public byte getType() {
49 * Add a new Modification to the list of Modifications represented by this
54 public void addModification(Modification modification) {
55 modifications.add(modification);
59 public List<Modification> getModifications() {
64 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
67 int size = in.readInt();
70 SerializationUtils.REUSABLE_READER_TL.set(new NormalizedNodeInputStreamReader(in));
74 for(int i = 0; i < size; i++) {
75 byte type = in.readByte();
77 case Modification.WRITE:
78 modifications.add(WriteModification.fromStream(in));
81 case Modification.MERGE:
82 modifications.add(MergeModification.fromStream(in));
85 case Modification.DELETE:
86 modifications.add(DeleteModification.fromStream(in));
91 SerializationUtils.REUSABLE_READER_TL.remove();
96 public void writeExternal(ObjectOutput out) throws IOException {
97 out.writeShort(DataStoreVersions.CURRENT_VERSION);
99 out.writeInt(modifications.size());
101 if(modifications.size() > 1) {
102 SerializationUtils.REUSABLE_WRITER_TL.set(new NormalizedNodeOutputStreamWriter(out));
106 for(Modification mod: modifications) {
107 out.writeByte(mod.getType());
108 mod.writeExternal(out);
111 SerializationUtils.REUSABLE_WRITER_TL.remove();
117 public Object toSerializable() {
118 PersistentMessages.CompositeModification.Builder builder =
119 PersistentMessages.CompositeModification.newBuilder();
121 builder.setTimeStamp(System.nanoTime());
123 for (Modification m : modifications) {
124 builder.addModification(
125 (PersistentMessages.Modification) m.toSerializable());
128 return builder.build();
131 public static MutableCompositeModification fromSerializable(Object serializable) {
132 if(serializable instanceof MutableCompositeModification) {
133 return (MutableCompositeModification)serializable;
135 return fromLegacySerializable(serializable);
139 private static MutableCompositeModification fromLegacySerializable(Object serializable) {
140 PersistentMessages.CompositeModification o = (PersistentMessages.CompositeModification) serializable;
141 MutableCompositeModification compositeModification = new MutableCompositeModification();
143 for(PersistentMessages.Modification m : o.getModificationList()){
144 if(m.getType().equals(DeleteModification.class.toString())){
145 compositeModification.addModification(DeleteModification.fromSerializable(m));
146 } else if(m.getType().equals(WriteModification.class.toString())){
147 compositeModification.addModification(WriteModification.fromSerializable(m));
148 } else if(m.getType().equals(MergeModification.class.toString())){
149 compositeModification.addModification(MergeModification.fromSerializable(m));
153 return compositeModification;