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;
27 public class CompositeModificationByteStringPayload extends Payload implements
29 private static final long serialVersionUID = 1L;
31 private ByteString byteString;
32 private SoftReference<PersistentMessages.CompositeModification> modificationReference;
33 private static final Logger LOG = LoggerFactory.getLogger(CompositeModificationByteStringPayload.class);
35 public CompositeModificationByteStringPayload(){
38 public CompositeModificationByteStringPayload(Object modification){
39 this(((PersistentMessages.CompositeModification) modification).toByteString());
40 this.modificationReference = new SoftReference<>((PersistentMessages.CompositeModification) modification);
43 private CompositeModificationByteStringPayload(ByteString byteString){
44 this.byteString = Preconditions.checkNotNull(byteString, "byteString should not be null");
49 public Map<GeneratedMessage.GeneratedExtension, PersistentMessages.CompositeModification> encode() {
50 Preconditions.checkState(byteString!=null);
51 Map<GeneratedMessage.GeneratedExtension, PersistentMessages.CompositeModification> map = new HashMap<>();
52 map.put(org.opendaylight.controller.protobuff.messages.shard.CompositeModificationPayload.modification,
53 getModificationInternal());
58 public Payload decode(
59 AppendEntriesMessages.AppendEntries.ReplicatedLogEntry.Payload payload) {
60 PersistentMessages.CompositeModification modification = payload
62 org.opendaylight.controller.protobuff.messages.shard.CompositeModificationPayload.modification);
64 // The extension was put in the unknown field.
65 // This is because extensions need to be registered
66 // see org.opendaylight.controller.mdsal.CompositeModificationPayload.registerAllExtensions
67 // also see https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/ExtensionRegistry
68 // If that is not done then on the other end the extension shows up as an unknown field
69 // Need to figure out a better way to do this
70 if(payload.getUnknownFields().hasField(2)){
71 UnknownFieldSet.Field field =
72 payload.getUnknownFields().getField(2);
74 return new CompositeModificationByteStringPayload(field.getLengthDelimitedList().get(0));
77 return new CompositeModificationByteStringPayload(modification);
80 public Object getModification(){
81 return getModificationInternal();
84 private PersistentMessages.CompositeModification getModificationInternal(){
85 if(this.modificationReference != null && this.modificationReference.get() != null){
86 return this.modificationReference.get();
89 PersistentMessages.CompositeModification compositeModification = PersistentMessages.CompositeModification.parseFrom(this.byteString);
90 this.modificationReference = new SoftReference<>(compositeModification);
91 return compositeModification;
92 } catch (InvalidProtocolBufferException e) {
93 LOG.error("Unexpected exception occurred when parsing byteString to CompositeModification", e);
100 return byteString.size();
103 private void writeObject(java.io.ObjectOutputStream stream)
105 byteString.writeTo(stream);
108 private void readObject(java.io.ObjectInputStream stream)
109 throws IOException, ClassNotFoundException {
110 byteString = ByteString.readFrom(stream);
114 public void clearModificationReference(){
115 if(this.modificationReference != null) {
116 this.modificationReference.clear();