[IOT-1616] CSM signaling supported in CoAP D2S communication
[iotivity.git] / cloud / stack / src / main / java / org / iotivity / cloud / base / protocols / Message.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.base.protocols;
23
24 import java.nio.charset.StandardCharsets;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.StringTokenizer;
29
30 public abstract class Message implements IRequest, IResponse, ISignaling {
31     protected List<byte[]> uri_path  = null;
32     protected List<byte[]> uri_query = null;
33     protected byte[]       payload   = null;
34
35     // Message properties are intersection of HTTP and COAP with observe.
36
37     @Override
38     public List<String> getUriPathSegments() {
39         if (uri_path == null) {
40             return null;
41         }
42         List<String> segments = new ArrayList<>();
43         for (byte[] pathSegment : uri_path) {
44             segments.add(new String(pathSegment, StandardCharsets.UTF_8));
45         }
46         return segments;
47     }
48
49     @Override
50     public String getUriPath() {
51         if (uri_path == null) {
52             return null;
53         }
54         StringBuilder path = new StringBuilder("/");
55         int nItem = uri_path.size();
56         for (byte[] pathSegment : uri_path) {
57             path.append(new String(pathSegment, StandardCharsets.UTF_8));
58             if (--nItem > 0) {
59                 path.append('/');
60             }
61         }
62         return path.toString();
63     }
64
65     @Override
66     public String getUriQuery() {
67         if (uri_query == null) {
68             return null;
69         }
70         StringBuilder uriQuery = new StringBuilder();
71         int nItem = uri_query.size();
72         for (byte[] querySegment : uri_query) {
73             uriQuery.append(new String(querySegment, StandardCharsets.UTF_8));
74             if (--nItem > 0) {
75                 uriQuery.append(';');
76             }
77         }
78         return uriQuery.toString();
79     }
80
81     @Override
82     public List<String> getUriQuerySegments() {
83         if (uri_query == null) {
84             return null;
85         }
86         List<String> segments = new ArrayList<>();
87         for (byte[] querySegment : uri_query) {
88             segments.add(new String(querySegment, StandardCharsets.UTF_8));
89         }
90         return segments;
91     }
92
93     @Override
94     public HashMap<String, List<String>> getUriQueryMap() {
95
96         List<String> segments = getUriQuerySegments();
97         if (segments == null) {
98             return null;
99         }
100
101         HashMap<String, List<String>> queryMap = new HashMap<>();
102         for (String segment : segments) {
103             StringTokenizer keyValuePair = new StringTokenizer(segment, "=");
104             if (keyValuePair.countTokens() == 2) {
105                 String key = keyValuePair.nextToken();
106                 String value = keyValuePair.nextToken();
107                 if (queryMap.containsKey(key) == false) {
108                     queryMap.put(key, new ArrayList<String>());
109                 }
110                 queryMap.get(key).add(value);
111             }
112         }
113
114         return queryMap;
115     }
116
117     @Override
118     public int getPayloadSize() {
119         return payload == null ? 0 : payload.length;
120     }
121
122     @Override
123     public byte[] getPayload() {
124         return payload;
125     }
126 }