2 * //******************************************************************
4 * // Copyright 2016 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
12 * // http://www.apache.org/licenses/LICENSE-2.0
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.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 package org.iotivity.cloud.ciserver.resources;
24 import java.util.ArrayList;
25 import java.util.Collections;
26 import java.util.HashMap;
27 import java.util.Iterator;
30 import java.util.Timer;
31 import java.util.TimerTask;
33 import org.iotivity.cloud.base.Resource;
34 import org.iotivity.cloud.base.SessionManager;
35 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
36 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
37 import org.iotivity.cloud.base.protocols.coap.enums.CoapStatus;
38 import org.iotivity.cloud.ciserver.Constants;
39 import org.iotivity.cloud.util.Cbor;
40 import org.iotivity.cloud.util.Logger;
42 import io.netty.channel.ChannelHandlerContext;
46 * This class provides a set of APIs to use KeepAlive Resource for ensuring the
50 public class KeepAliveResource extends Resource {
52 private int[] intervals;
53 private HashMap<ChannelHandlerContext, Long> connectPool;
55 private Cbor<HashMap<String, Integer>> cbor;
56 private SessionManager sessionManager = null;
58 public void setIntervals(int[] intervals) {
59 this.intervals = intervals;
62 public int[] getIntervals() {
63 return this.intervals;
66 public KeepAliveResource(SessionManager sessionManager, int[] intervals) {
67 setUri(Constants.KEEP_ALIVE_URI);
68 setIntervals(intervals);
69 this.sessionManager = sessionManager;
70 connectPool = new HashMap<ChannelHandlerContext, Long>();
72 timer.schedule(new KeepAliveTask(), 30000, 60000);
73 cbor = new Cbor<HashMap<String, Integer>>();
77 * API for receiving message(message to keepalive resource)
80 * ChannelHandlerContext of request message
82 * CoAP request message
85 public void onRequestReceived(ChannelHandlerContext ctx,
86 CoapRequest request) {
88 CoapResponse response = null;
90 switch (request.getRequestMethod()) {
91 // First message to KeepAlive from resource
93 if (intervals != null) {
94 response = makePingConfigMessage(request);
95 connectPool.put(ctx, System.currentTimeMillis()
96 + (intervals[0] * (long) 60000));
99 // interval Message to KeepAlive After receiving GET Message
101 HashMap<String, Integer> payloadData = null;
102 payloadData = cbor.parsePayloadFromCbor(request.getPayload(),
103 new HashMap<String, Integer>().getClass());
105 Logger.d("Receive payloadData : " + payloadData);
106 Logger.d("interval : " + payloadData.get("in"));
108 connectPool.put(ctx, System.currentTimeMillis()
109 + (payloadData.get("in") * (long) 60000));
111 response = makeResponse(request);
121 ctx.writeAndFlush(response);
125 * API for making response to Resource
128 * ChannelHandlerContext of request message
130 private CoapResponse makeResponse(CoapRequest request) {
131 CoapResponse response = new CoapResponse(CoapStatus.VALID);
132 response.setToken(request.getToken());
138 * API for making interval and first response to Resource
141 * ChannelHandlerContext of request message
143 private CoapResponse makePingConfigMessage(CoapRequest request) {
144 CoapResponse response = new CoapResponse(CoapStatus.CONTENT);
145 response.setToken(request.getToken());
147 HashMap<String, int[]> payloadData = new HashMap<String, int[]>();
148 payloadData.put("inarray", intervals);
150 byte[] cborData = cbor.encodingPayloadToCbor(payloadData);
152 response.setPayload(cborData);
154 Logger.d("Send payloadData : " + payloadData);
160 * API for managing session
162 public class KeepAliveTask extends TimerTask {
166 Map<ChannelHandlerContext, Long> map = Collections
167 .synchronizedMap(connectPool);
168 Set<ChannelHandlerContext> keySet = map.keySet();
169 ArrayList<ChannelHandlerContext> deleteList = new ArrayList<ChannelHandlerContext>();
170 Iterator<ChannelHandlerContext> iterator = null;
172 iterator = keySet.iterator();
173 Long currentTime = System.currentTimeMillis();
175 while (iterator.hasNext()) {
176 ChannelHandlerContext key = iterator.next();
177 Long lifeTime = (Long) map.get(key);
178 Logger.d("KeepAliveTask Operating : "
179 + key.channel().toString() + ", Time : "
180 + (lifeTime - currentTime));
181 if (lifeTime < currentTime) {
187 iterator = deleteList.iterator();
189 while (iterator.hasNext()) {
190 ChannelHandlerContext key = iterator.next();
191 Logger.d("KeepAliveTask Remove");
192 connectPool.remove(key);
193 sessionManager.removeSessionByChannel(key);