blob: ba3c896fdb2f0a25c56f5ba936b733a40de7fee1 [file] [log] [blame]
Thomas Vachuska24c849c2014-10-27 09:53:05 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska24c849c2014-10-27 09:53:05 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska24c849c2014-10-27 09:53:05 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska24c849c2014-10-27 09:53:05 -070015 */
Madan Jampaniab6d3112014-10-02 16:30:14 -070016package org.onlab.netty;
17
18import java.io.IOException;
19
Yuta HIGUCHI0a0b9e42015-02-11 16:57:12 -080020import org.onlab.util.ByteArraySizeHashPrinter;
21
22import com.google.common.base.MoreObjects;
23
Madan Jampaniab6d3112014-10-02 16:30:14 -070024/**
25 * Internal message representation with additional attributes
26 * for supporting, synchronous request/reply behavior.
27 */
28public final class InternalMessage implements Message {
29
Madan Jampani49115e92015-03-14 10:43:33 -070030 public static final String REPLY_MESSAGE_TYPE = "NETTY_MESSAGING_REQUEST_REPLY";
Yuta HIGUCHIc65f5122014-10-07 10:05:59 -070031
Madan Jampaniab6d3112014-10-02 16:30:14 -070032 private long id;
33 private Endpoint sender;
Madan Jampani49115e92015-03-14 10:43:33 -070034 private String type;
Madan Jampani53e44e62014-10-07 12:39:51 -070035 private byte[] payload;
Madan Jampaniab6d3112014-10-02 16:30:14 -070036 private transient NettyMessagingService messagingService;
Madan Jampaniab6d3112014-10-02 16:30:14 -070037
38 // Must be created using the Builder.
39 private InternalMessage() {}
40
Madan Jampani49115e92015-03-14 10:43:33 -070041 InternalMessage(long id, Endpoint sender, String type, byte[] payload) {
Yuta HIGUCHI91768e32014-11-22 05:06:35 -080042 this.id = id;
43 this.sender = sender;
44 this.type = type;
45 this.payload = payload;
46 }
47
Madan Jampaniab6d3112014-10-02 16:30:14 -070048 public long id() {
49 return id;
50 }
51
Madan Jampani49115e92015-03-14 10:43:33 -070052 public String type() {
Madan Jampaniab6d3112014-10-02 16:30:14 -070053 return type;
54 }
55
56 public Endpoint sender() {
57 return sender;
58 }
59
60 @Override
Madan Jampani53e44e62014-10-07 12:39:51 -070061 public byte[] payload() {
Madan Jampaniab6d3112014-10-02 16:30:14 -070062 return payload;
63 }
64
Madan Jampani86ed0552014-10-03 16:45:42 -070065 protected void setMessagingService(NettyMessagingService messagingService) {
66 this.messagingService = messagingService;
67 }
68
Madan Jampaniab6d3112014-10-02 16:30:14 -070069 @Override
Madan Jampani53e44e62014-10-07 12:39:51 -070070 public void respond(byte[] data) throws IOException {
Madan Jampaniab6d3112014-10-02 16:30:14 -070071 Builder builder = new Builder(messagingService);
72 InternalMessage message = builder.withId(this.id)
Madan Jampani87100932014-10-21 16:46:12 -070073 .withSender(messagingService.localEp())
Madan Jampaniab6d3112014-10-02 16:30:14 -070074 .withPayload(data)
75 .withType(REPLY_MESSAGE_TYPE)
76 .build();
77 messagingService.sendAsync(sender, message);
78 }
79
Yuta HIGUCHI0a0b9e42015-02-11 16:57:12 -080080 @Override
81 public String toString() {
82 return MoreObjects.toStringHelper(this)
83 .add("id", id)
84 .add("type", type)
85 .add("sender", sender)
86 .add("payload", ByteArraySizeHashPrinter.of(payload))
87 .toString();
88 }
Madan Jampaniab6d3112014-10-02 16:30:14 -070089
90 /**
91 * Builder for InternalMessages.
92 */
Yuta HIGUCHI24fb2992014-10-06 22:51:45 -070093 public static final class Builder {
Madan Jampaniab6d3112014-10-02 16:30:14 -070094 private InternalMessage message;
95
96 public Builder(NettyMessagingService messagingService) {
97 message = new InternalMessage();
98 message.messagingService = messagingService;
99 }
100
101 public Builder withId(long id) {
102 message.id = id;
103 return this;
104 }
105
Madan Jampani49115e92015-03-14 10:43:33 -0700106 public Builder withType(String type) {
Madan Jampaniab6d3112014-10-02 16:30:14 -0700107 message.type = type;
108 return this;
109 }
110
111 public Builder withSender(Endpoint sender) {
112 message.sender = sender;
113 return this;
114 }
Madan Jampani53e44e62014-10-07 12:39:51 -0700115 public Builder withPayload(byte[] payload) {
Madan Jampaniab6d3112014-10-02 16:30:14 -0700116 message.payload = payload;
117 return this;
118 }
119
120 public InternalMessage build() {
121 return message;
122 }
123 }
Yuta HIGUCHI92626c02014-10-06 15:46:18 -0700124}