c5bc4b5acdb32ec1beac0c29406f59964c798034
[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 public class InviteResource extends Resource {
43
44     private InviteManager                 mInviteManager = new InviteManager();
45
46     private Cbor<HashMap<String, Object>> mCbor          = new Cbor<>();
47
48     public InviteResource() {
49         super(Arrays.asList(Constants.PREFIX_WELL_KNOWN, Constants.PREFIX_OCF,
50                 Constants.ACL_URI, Constants.INVITE_URI));
51     }
52
53     @Override
54     public void onDefaultRequestReceived(Device srcDevice, IRequest request)
55             throws ServerException {
56
57         IResponse response = null;
58
59         switch (request.getMethod()) {
60             case GET:
61                 response = handleGetRequest(srcDevice, request);
62                 break;
63             case POST:
64                 response = handlePostRequest(request);
65                 break;
66             case DELETE:
67                 response = handleDeleteRequest(request);
68                 break;
69             default:
70                 throw new BadRequestException(request.getMethod()
71                         + " request type is not supported");
72         }
73
74         srcDevice.sendResponse(response);
75     }
76
77     private IResponse handleGetRequest(Device srcDevice, IRequest request)
78             throws ServerException {
79
80         checkQueryException(Constants.REQ_UUID_ID, request.getUriQueryMap());
81
82         String uid = request.getUriQueryMap().get(Constants.REQ_UUID_ID).get(0);
83         HashMap<String, Object> responsePayload = null;
84
85         switch (request.getObserve()) {
86             case NOTHING:
87                 responsePayload = mInviteManager.getInvitationInfo(uid);
88                 break;
89             case SUBSCRIBE:
90                 responsePayload = mInviteManager.addSubscriber(uid, srcDevice,
91                         request);
92                 break;
93             case UNSUBSCRIBE:
94                 responsePayload = mInviteManager.removeSubscriber(uid);
95                 break;
96             default:
97                 break;
98         }
99
100         return MessageBuilder.createResponse(request, ResponseStatus.CONTENT,
101                 ContentFormat.APPLICATION_CBOR,
102                 mCbor.encodingPayloadToCbor(responsePayload));
103     }
104
105     @SuppressWarnings("unchecked")
106     private IResponse handlePostRequest(IRequest request)
107             throws ServerException {
108
109         HashMap<String, Object> payload = mCbor.parsePayloadFromCbor(
110                 request.getPayload(), HashMap.class);
111
112         checkPayloadException(
113                 Arrays.asList(Constants.REQ_UUID_ID, Constants.REQ_INVITE),
114                 payload);
115
116         String uid = (String) payload.get(Constants.REQ_UUID_ID);
117         ArrayList<HashMap<String, String>> inviteList = (ArrayList<HashMap<String, String>>) payload
118                 .get(Constants.REQ_INVITE);
119
120         for (HashMap<String, String> invite : inviteList) {
121
122             String gid = invite.get(Constants.REQ_GROUP_ID);
123             String mid = invite.get(Constants.REQ_MEMBER);
124
125             if (gid == null || mid == null) {
126
127                 throw new PreconditionFailedException(
128                         "value of invite property is invalid");
129             }
130
131             mInviteManager.addInvitation(uid, gid, mid);
132         }
133
134         return MessageBuilder.createResponse(request, ResponseStatus.CHANGED);
135     }
136
137     private IResponse handleDeleteRequest(IRequest request)
138             throws ServerException {
139
140         HashMap<String, List<String>> queryParams = request.getUriQueryMap();
141
142         checkQueryException(
143                 Arrays.asList(Constants.REQ_UUID_ID, Constants.REQ_GROUP_ID),
144                 queryParams);
145
146         String gid = queryParams.get(Constants.REQ_GROUP_ID).get(0);
147         String uid = queryParams.get(Constants.REQ_UUID_ID).get(0);
148
149         if (queryParams.get(Constants.REQ_MEMBER) == null) {
150             mInviteManager.deleteInvitation(uid, gid);
151         } else {
152             String mid = queryParams.get(Constants.REQ_MEMBER).get(0);
153             mInviteManager.cancelInvitation(uid, gid, mid);
154         }
155
156         return MessageBuilder.createResponse(request, ResponseStatus.DELETED);
157     }
158
159 }