d018924db1e41ad41addf79f15cd801838b277c1
[iotivity.git] / cloud / account / src / main / java / org / iotivity / cloud / accountserver / resources / acl / invite / InviteResource.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.accountserver.resources.acl.invite;
23
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.HashMap;
27 import java.util.List;
28
29 import org.iotivity.cloud.accountserver.Constants;
30 import org.iotivity.cloud.base.device.Device;
31 import org.iotivity.cloud.base.exception.ServerException;
32 import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
33 import org.iotivity.cloud.base.exception.ServerException.PreconditionFailedException;
34 import org.iotivity.cloud.base.protocols.IRequest;
35 import org.iotivity.cloud.base.protocols.IResponse;
36 import org.iotivity.cloud.base.protocols.MessageBuilder;
37 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
38 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
39 import org.iotivity.cloud.base.resource.Resource;
40 import org.iotivity.cloud.util.Cbor;
41
42 /**
43  * 
44  * This class provides a set of APIs to handle requests to Invite resource.
45  *
46  */
47 public class InviteResource extends Resource {
48
49     private InviteManager                 mInviteManager = new InviteManager();
50
51     private Cbor<HashMap<String, Object>> mCbor          = new Cbor<>();
52
53     private enum ReqType {
54         NONE, CANCEL_INVITATION, DELETE_INVITATION
55     };
56
57     public InviteResource() {
58         super(Arrays.asList(Constants.PREFIX_OIC, Constants.ACL_URI,
59                 Constants.INVITE_URI));
60     }
61
62     @Override
63     public void onDefaultRequestReceived(Device srcDevice, IRequest request)
64             throws ServerException {
65
66         IResponse response = null;
67
68         switch (request.getMethod()) {
69             case GET:
70                 response = handleGetRequest(srcDevice, request);
71                 break;
72             case POST:
73                 // handle send-invitation message
74                 response = handlePostRequest(request);
75                 break;
76             case DELETE:
77                 response = handleDeleteRequest(request);
78                 break;
79             default:
80                 throw new BadRequestException(
81                         request.getMethod() + " request type is not supported");
82         }
83
84         srcDevice.sendResponse(response);
85     }
86
87     private IResponse handleGetRequest(Device srcDevice, IRequest request)
88             throws ServerException {
89
90         checkQueryException(Constants.REQ_UUID_ID, request.getUriQueryMap());
91
92         String uid = request.getUriQueryMap().get(Constants.REQ_UUID_ID).get(0);
93         HashMap<String, Object> responsePayload = null;
94
95         switch (request.getObserve()) {
96             case NOTHING:
97                 responsePayload = mInviteManager.getInvitationInfo(uid);
98                 break;
99             case SUBSCRIBE:
100                 responsePayload = mInviteManager.addSubscriber(uid, srcDevice,
101                         request);
102                 break;
103             case UNSUBSCRIBE:
104                 responsePayload = mInviteManager.removeSubscriber(uid, request);
105                 break;
106             default:
107                 break;
108         }
109
110         return MessageBuilder.createResponse(request, ResponseStatus.CONTENT,
111                 ContentFormat.APPLICATION_CBOR,
112                 mCbor.encodingPayloadToCbor(responsePayload));
113     }
114
115     @SuppressWarnings("unchecked")
116     private IResponse handlePostRequest(IRequest request)
117             throws ServerException {
118
119         HashMap<String, Object> payload = mCbor
120                 .parsePayloadFromCbor(request.getPayload(), HashMap.class);
121
122         // check properties in payload
123         checkPayloadException(
124                 Arrays.asList(Constants.REQ_UUID_ID, Constants.REQ_INVITE),
125                 payload);
126
127         // get user uid
128         String uid = (String) payload.get(Constants.REQ_UUID_ID);
129         ArrayList<HashMap<String, String>> inviteList = (ArrayList<HashMap<String, String>>) payload
130                 .get(Constants.REQ_INVITE);
131
132         for (HashMap<String, String> invite : inviteList) {
133
134             String gid = invite.get(Constants.REQ_GROUP_ID);
135             String mid = invite.get(Constants.REQ_MEMBER);
136
137             if (gid == null || mid == null) {
138
139                 throw new PreconditionFailedException(
140                         "value of invite property is invalid");
141             }
142
143             mInviteManager.addInvitation(uid, gid, mid);
144         }
145
146         return MessageBuilder.createResponse(request, ResponseStatus.CHANGED);
147     }
148
149     private IResponse handleDeleteRequest(IRequest request)
150             throws ServerException {
151
152         HashMap<String, List<String>> queryParams = request.getUriQueryMap();
153
154         checkQueryException(
155                 Arrays.asList(Constants.REQ_UUID_ID, Constants.REQ_GROUP_ID),
156                 queryParams);
157
158         String gid = queryParams.get(Constants.REQ_GROUP_ID).get(0);
159         String uid = queryParams.get(Constants.REQ_UUID_ID).get(0);
160
161         ReqType reqType = ReqType.NONE;
162         if (queryParams.get(Constants.REQ_MEMBER) == null) {
163             reqType = ReqType.DELETE_INVITATION;
164         } else {
165             reqType = ReqType.CANCEL_INVITATION;
166         }
167
168         if (reqType.equals(ReqType.DELETE_INVITATION)) {
169
170             String acceptStr = queryParams.get(Constants.REQ_INVITE_ACCEPT)
171                     .get(0);
172             boolean accepted = false;
173             if (acceptStr.equals(Constants.INVITE_ACCEPT)) {
174                 accepted = true;
175             }
176
177             mInviteManager.deleteInvitation(uid, gid, accepted);
178
179         } else if (reqType.equals(ReqType.CANCEL_INVITATION)) {
180
181             String mid = queryParams.get(Constants.REQ_MEMBER).get(0);
182             mInviteManager.cancelInvitation(uid, gid, mid);
183
184         } else {
185
186             throw new BadRequestException("queryData is not enough");
187         }
188
189         return MessageBuilder.createResponse(request, ResponseStatus.DELETED);
190     }
191
192 }