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.raft.protobuff.client.messages;
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Preconditions;
13 import com.google.protobuf.ByteString;
14 import com.google.protobuf.GeneratedMessage;
15 import com.google.protobuf.InvalidProtocolBufferException;
16 import com.google.protobuf.UnknownFieldSet;
17 import java.io.IOException;
18 import java.io.Serializable;
19 import java.lang.ref.SoftReference;
20 import java.util.HashMap;
22 import org.opendaylight.controller.protobuff.messages.cluster.raft.AppendEntriesMessages;
23 import org.opendaylight.controller.protobuff.messages.persistent.PersistentMessages;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
28 public class CompositeModificationByteStringPayload extends Payload implements
30 private static final long serialVersionUID = 1L;
32 private ByteString byteString;
33 private SoftReference<PersistentMessages.CompositeModification> modificationReference;
34 private static final Logger LOG = LoggerFactory.getLogger(CompositeModificationByteStringPayload.class);
36 public CompositeModificationByteStringPayload(){
39 public CompositeModificationByteStringPayload(Object modification){
40 this(((PersistentMessages.CompositeModification) modification).toByteString());
41 this.modificationReference = new SoftReference<>((PersistentMessages.CompositeModification) modification);
44 private CompositeModificationByteStringPayload(ByteString byteString){
45 this.byteString = Preconditions.checkNotNull(byteString, "byteString should not be null");
50 public Map<GeneratedMessage.GeneratedExtension<?, ?>, PersistentMessages.CompositeModification> encode() {
51 Preconditions.checkState(byteString!=null);
52 Map<GeneratedMessage.GeneratedExtension<?, ?>, PersistentMessages.CompositeModification> map = new HashMap<>();
53 map.put(org.opendaylight.controller.protobuff.messages.shard.CompositeModificationPayload.modification,
54 getModificationInternal());
59 public Payload decode(
60 AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload payload) {
61 PersistentMessages.CompositeModification modification = payload
63 org.opendaylight.controller.protobuff.messages.shard.CompositeModificationPayload.modification);
65 // The extension was put in the unknown field.
66 // This is because extensions need to be registered
67 // see org.opendaylight.controller.mdsal.CompositeModificationPayload.registerAllExtensions
68 // also see https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ExtensionRegistry
69 // If that is not done then on the other end the extension shows up as an unknown field
70 // Need to figure out a better way to do this
71 if(payload.getUnknownFields().hasField(2)){
72 UnknownFieldSet.Field field =
73 payload.getUnknownFields().getField(2);
75 return new CompositeModificationByteStringPayload(field.getLengthDelimitedList().get(0));
78 return new CompositeModificationByteStringPayload(modification);
81 public Object getModification(){
82 return getModificationInternal();
85 private PersistentMessages.CompositeModification getModificationInternal(){
86 if(this.modificationReference != null && this.modificationReference.get() != null){
87 return this.modificationReference.get();
90 PersistentMessages.CompositeModification compositeModification = PersistentMessages.CompositeModification.parseFrom(this.byteString);
91 this.modificationReference = new SoftReference<>(compositeModification);
92 return compositeModification;
93 } catch (InvalidProtocolBufferException e) {
94 LOG.error("Unexpected exception occurred when parsing byteString to CompositeModification", e);
102 return byteString.size();
105 private void writeObject(java.io.ObjectOutputStream stream)
107 byteString.writeTo(stream);
110 private void readObject(java.io.ObjectInputStream stream)
111 throws IOException, ClassNotFoundException {
112 byteString = ByteString.readFrom(stream);
116 public void clearModificationReference(){
117 if(this.modificationReference != null) {
118 this.modificationReference.clear();