[Simulator] Minor UI changes fixing the IOT-1087.
[platform/upstream/iotivity.git] / cloud / stack / src / main / java / org / iotivity / cloud / util / CoapLogHandler.java
1 /*
2  *******************************************************************
3  *
4  * Copyright 2016 Samsung Electronics All Rights Reserved.
5  *
6  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22 package org.iotivity.cloud.util;
23
24 import org.iotivity.cloud.base.protocols.coap.CoapMessage;
25 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
26
27 import io.netty.buffer.ByteBuf;
28 import io.netty.channel.ChannelDuplexHandler;
29 import io.netty.channel.ChannelHandler.Sharable;
30 import io.netty.channel.ChannelHandlerContext;
31 import io.netty.channel.ChannelPromise;
32
33 /**
34  *
35  * This class provides a set of APIs to print out logs for CoAP request and
36  * response.
37  *
38  */
39 @Sharable
40 public class CoapLogHandler extends ChannelDuplexHandler {
41
42     @Override
43     public void write(ChannelHandlerContext ctx, Object msg,
44             ChannelPromise promise) {
45
46         if (msg instanceof CoapMessage) {
47
48             CoapMessage coapMessage = (CoapMessage) msg;
49
50             StringBuilder strBuilder = new StringBuilder();
51             strBuilder.append(getStringCtx(ctx));
52             strBuilder.append(
53                     "\n/******************************************************************************/\n");
54             strBuilder.append(getStringCoapMessage(coapMessage));
55             strBuilder.append(
56                     "\n/******************************************************************************/\n");
57             Logger.d(strBuilder.toString());
58
59         } else if (msg instanceof String) {
60
61             String message = (String) msg;
62
63             StringBuilder strBuilder = new StringBuilder();
64             strBuilder.append(getStringCtx(ctx));
65             strBuilder.append(
66                     "\n/******************************************************************************/\n");
67             strBuilder.append(message);
68             strBuilder.append(
69                     "\n/******************************************************************************/\n");
70             Logger.d(strBuilder.toString());
71
72             ByteBuf outByteBuf = ctx.alloc().buffer();
73             outByteBuf.writeBytes(message.getBytes());
74         }
75
76         ctx.write(msg);
77     }
78
79     @Override
80     public void channelRead(ChannelHandlerContext ctx, Object msg)
81             throws Exception {
82
83         if (msg instanceof CoapMessage) {
84
85             CoapMessage coapMessage = (CoapMessage) msg;
86
87             StringBuilder strBuilder = new StringBuilder();
88             strBuilder.append(getStringCtx(ctx));
89             strBuilder.append(
90                     "\n/******************************************************************************/\n");
91             strBuilder.append(getStringCoapMessage(coapMessage));
92             strBuilder.append(
93                     "\n/******************************************************************************/\n");
94             Logger.d(strBuilder.toString());
95
96         } else if (msg instanceof ByteBuf) {
97
98             ByteBuf inByteBuf = (ByteBuf) msg;
99
100             String message = null;
101             StringBuffer strBuffer = new StringBuffer();
102             while (inByteBuf.isReadable()) {
103                 strBuffer.append((char) inByteBuf.readByte());
104             }
105             message = strBuffer.toString();
106
107             StringBuilder strBuilder = new StringBuilder();
108             strBuilder.append(getStringCtx(ctx));
109             strBuilder.append(
110                     "\n/******************************************************************************/\n");
111             strBuilder.append(message);
112             strBuilder.append(
113                     "\n/******************************************************************************/\n");
114             Logger.d(strBuilder.toString());
115         }
116
117         ctx.fireChannelRead(msg);
118     }
119
120     private String getStringCtx(ChannelHandlerContext ctx) {
121
122         StringBuilder strBuilder = new StringBuilder();
123
124         strBuilder.append("\n");
125         strBuilder.append("Local Address: ");
126         strBuilder.append(ctx.channel().localAddress().toString());
127
128         strBuilder.append("\n");
129         strBuilder.append("Remote Address: ");
130         strBuilder.append(ctx.channel().remoteAddress().toString());
131
132         return strBuilder.toString();
133     }
134
135     private String getStringCoapMessage(CoapMessage coapMessage) {
136
137         StringBuilder strBuilder = new StringBuilder();
138
139         strBuilder.append("Code: ");
140         strBuilder.append(coapMessage.getCode());
141         strBuilder.append("\n");
142
143         strBuilder.append("Token Length: ");
144         strBuilder.append(coapMessage.getTokenLength());
145         strBuilder.append("\n");
146
147         strBuilder.append("Token Data: ");
148         strBuilder.append(coapMessage.getTokenString());
149         strBuilder.append("\n");
150
151         if (coapMessage instanceof CoapRequest) {
152
153             CoapRequest coapRequest = (CoapRequest) coapMessage;
154
155             strBuilder.append("Option URI_PATH: ");
156             strBuilder.append(coapRequest.getUriPath());
157             strBuilder.append("\n");
158
159             strBuilder.append("Option URI_QUERY: ");
160             strBuilder.append(coapRequest.getUriQuery());
161             strBuilder.append("\n");
162         }
163
164         strBuilder.append("Option CONTENT_FORMAT: ");
165         strBuilder.append(coapMessage.getContentFormatString());
166         strBuilder.append("\n");
167
168         strBuilder.append("Payload Length: ");
169         strBuilder.append(coapMessage.getPayloadSize());
170
171         strBuilder.append("\n");
172         strBuilder.append("Payload Data: ");
173         strBuilder.append(coapMessage.getPayloadString());
174
175         return strBuilder.toString();
176     }
177 }