2 * Copyright (c) 2017 Inocybe Technologies 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
8 package org.opendaylight.controller.cluster.messaging;
10 import akka.actor.ActorRef;
11 import akka.serialization.JavaSerializer;
12 import akka.serialization.Serialization;
13 import com.google.common.base.Preconditions;
14 import java.io.Externalizable;
15 import java.io.IOException;
16 import java.io.ObjectInput;
17 import java.io.ObjectOutput;
18 import java.io.Serializable;
19 import java.util.Optional;
20 import org.opendaylight.yangtools.concepts.Identifier;
23 * The reply message for {@link MessageSlice}.
25 * @author Thomas Pantelis
27 public final class MessageSliceReply implements Serializable {
28 private static final long serialVersionUID = 1L;
30 private final Identifier identifier;
31 private final int sliceIndex;
32 private final MessageSliceException failure;
33 private final ActorRef sendTo;
35 private MessageSliceReply(final Identifier identifier, final int sliceIndex, final MessageSliceException failure,
36 final ActorRef sendTo) {
37 this.identifier = Preconditions.checkNotNull(identifier);
38 this.sliceIndex = sliceIndex;
39 this.sendTo = Preconditions.checkNotNull(sendTo);
40 this.failure = failure;
43 public static MessageSliceReply success(final Identifier identifier, final int sliceIndex, final ActorRef sendTo) {
44 return new MessageSliceReply(identifier, sliceIndex, null, sendTo);
47 public static MessageSliceReply failed(final Identifier identifier, final MessageSliceException failure,
48 final ActorRef sendTo) {
49 return new MessageSliceReply(identifier, -1, failure, sendTo);
52 public Identifier getIdentifier() {
56 public int getSliceIndex() {
60 public ActorRef getSendTo() {
64 public Optional<MessageSliceException> getFailure() {
65 return Optional.ofNullable(failure);
69 public String toString() {
70 return "MessageSliceReply [identifier=" + identifier + ", sliceIndex=" + sliceIndex + ", failure=" + failure
71 + ", sendTo=" + sendTo + "]";
74 private Object writeReplace() {
75 return new Proxy(this);
78 private static class Proxy implements Externalizable {
79 private static final long serialVersionUID = 1L;
81 private MessageSliceReply messageSliceReply;
83 // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't
84 // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection.
85 @SuppressWarnings("checkstyle:RedundantModifier")
89 Proxy(final MessageSliceReply messageSliceReply) {
90 this.messageSliceReply = messageSliceReply;
94 public void writeExternal(final ObjectOutput out) throws IOException {
95 out.writeObject(messageSliceReply.identifier);
96 out.writeInt(messageSliceReply.sliceIndex);
97 out.writeObject(messageSliceReply.failure);
98 out.writeObject(Serialization.serializedActorPath(messageSliceReply.sendTo));
102 public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
103 final Identifier identifier = (Identifier) in.readObject();
104 final int sliceIndex = in.readInt();
105 final MessageSliceException failure = (MessageSliceException) in.readObject();
106 ActorRef sendTo = JavaSerializer.currentSystem().value().provider()
107 .resolveActorRef((String) in.readObject());
109 messageSliceReply = new MessageSliceReply(identifier, sliceIndex, failure, sendTo);
112 private Object readResolve() {
113 return messageSliceReply;