Imported Upstream version 1.1.0
[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 java.nio.charset.StandardCharsets;
25
26 import org.iotivity.cloud.base.protocols.coap.CoapMessage;
27 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
28
29 import io.netty.buffer.ByteBuf;
30 import io.netty.channel.ChannelDuplexHandler;
31 import io.netty.channel.ChannelHandler.Sharable;
32 import io.netty.channel.ChannelHandlerContext;
33 import io.netty.channel.ChannelPromise;
34
35 /**
36  *
37  * This class provides a set of APIs to print out logs for CoAP request and
38  * response.
39  *
40  */
41 @Sharable
42 public class CoapLogHandler extends ChannelDuplexHandler {
43
44     @Override
45     public void write(ChannelHandlerContext ctx, Object msg,
46             ChannelPromise promise) {
47
48         if (msg instanceof CoapMessage) {
49
50             CoapMessage coapMessage = (CoapMessage) msg;
51
52             StringBuilder strBuilder = new StringBuilder();
53             strBuilder.append(getStringCtx(ctx));
54             strBuilder.append(
55                     "\n/******************************************************************************/\n");
56             strBuilder.append(getStringCoapMessage(coapMessage));
57             strBuilder.append(
58                     "\n/******************************************************************************/\n");
59             Logger.d(strBuilder.toString());
60
61         } else if (msg instanceof String) {
62
63             String message = (String) msg;
64
65             StringBuilder strBuilder = new StringBuilder();
66             strBuilder.append(getStringCtx(ctx));
67             strBuilder.append(
68                     "\n/******************************************************************************/\n");
69             strBuilder.append(message);
70             strBuilder.append(
71                     "\n/******************************************************************************/\n");
72             Logger.d(strBuilder.toString());
73
74             ByteBuf outByteBuf = ctx.alloc().buffer();
75             outByteBuf.writeBytes(message.getBytes(StandardCharsets.UTF_8));
76         }
77
78         ctx.write(msg);
79     }
80
81     @Override
82     public void channelRead(ChannelHandlerContext ctx, Object msg)
83             throws Exception {
84
85         if (msg instanceof CoapMessage) {
86
87             CoapMessage coapMessage = (CoapMessage) msg;
88
89             StringBuilder strBuilder = new StringBuilder();
90             strBuilder.append(getStringCtx(ctx));
91             strBuilder.append(
92                     "\n/******************************************************************************/\n");
93             strBuilder.append(getStringCoapMessage(coapMessage));
94             strBuilder.append(
95                     "\n/******************************************************************************/\n");
96             Logger.d(strBuilder.toString());
97
98         } else if (msg instanceof ByteBuf) {
99
100             ByteBuf inByteBuf = (ByteBuf) msg;
101
102             String message = null;
103             StringBuffer strBuffer = new StringBuffer();
104             while (inByteBuf.isReadable()) {
105                 strBuffer.append((char) inByteBuf.readByte());
106             }
107             message = strBuffer.toString();
108
109             StringBuilder strBuilder = new StringBuilder();
110             strBuilder.append(getStringCtx(ctx));
111             strBuilder.append(
112                     "\n/******************************************************************************/\n");
113             strBuilder.append(message);
114             strBuilder.append(
115                     "\n/******************************************************************************/\n");
116             Logger.d(strBuilder.toString());
117         }
118
119         ctx.fireChannelRead(msg);
120     }
121
122     private String getStringCtx(ChannelHandlerContext ctx) {
123
124         StringBuilder strBuilder = new StringBuilder();
125
126         strBuilder.append("\n");
127         strBuilder.append("Local Address: ");
128         strBuilder.append(ctx.channel().localAddress().toString());
129
130         strBuilder.append("\n");
131         strBuilder.append("Remote Address: ");
132         strBuilder.append(ctx.channel().remoteAddress().toString());
133
134         return strBuilder.toString();
135     }
136
137     private String getStringCoapMessage(CoapMessage coapMessage) {
138
139         StringBuilder strBuilder = new StringBuilder();
140
141         strBuilder.append("Code: ");
142         strBuilder.append(coapMessage.getCode());
143         strBuilder.append("\n");
144
145         strBuilder.append("Token Length: ");
146         strBuilder.append(coapMessage.getTokenLength());
147         strBuilder.append("\n");
148
149         strBuilder.append("Token Data: ");
150         strBuilder.append(coapMessage.getTokenString());
151         strBuilder.append("\n");
152
153         if (coapMessage instanceof CoapRequest) {
154
155             CoapRequest coapRequest = (CoapRequest) coapMessage;
156
157             strBuilder.append("Option URI_PATH: ");
158             strBuilder.append(coapRequest.getUriPath());
159             strBuilder.append("\n");
160
161             strBuilder.append("Option URI_QUERY: ");
162             strBuilder.append(coapRequest.getUriQuery());
163             strBuilder.append("\n");
164         }
165
166         strBuilder.append("Option CONTENT_FORMAT: ");
167         strBuilder.append(coapMessage.getContentFormatString());
168         strBuilder.append("\n");
169
170         strBuilder.append("Payload Length: ");
171         strBuilder.append(coapMessage.getPayloadSize());
172
173         strBuilder.append("\n");
174         strBuilder.append("Payload Data: ");
175         strBuilder.append(coapMessage.getPayloadString());
176
177         return strBuilder.toString();
178     }
179 }