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.accountserver.resources.acl.invite;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import org.iotivity.cloud.accountserver.Constants;
29 import org.iotivity.cloud.accountserver.db.AccountDBManager;
30 import org.iotivity.cloud.accountserver.db.InviteTable;
31 import org.iotivity.cloud.accountserver.util.TypeCastingManager;
32 import org.iotivity.cloud.base.device.Device;
33 import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
34 import org.iotivity.cloud.base.protocols.IRequest;
35 import org.iotivity.cloud.base.protocols.MessageBuilder;
36 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
37 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
38 import org.iotivity.cloud.util.Cbor;
42 * This class provides a set of APIs to invite a user to a group
46 public class InviteManager {
48 private TypeCastingManager<InviteTable> mTypeInvite = new TypeCastingManager<>();
50 private class InviteSubscriber {
51 InviteSubscriber(Device subscriber, IRequest request) {
52 mSubscriber = subscriber;
56 public Device mSubscriber;
57 public IRequest mRequest;
60 // <uid, subscriber list>
61 private HashMap<String, ArrayList<InviteSubscriber>> mSubscribers = new HashMap<>();
63 public void addInvitation(String uid, String gid, String mid) {
65 // create invitation table
66 InviteTable newInviteTable = new InviteTable(uid, gid, mid);
68 HashMap<String, Object> condition = new HashMap<>();
69 condition.put(Constants.KEYFIELD_INVITE_USER, uid);
70 condition.put(Constants.KEYFIELD_GID, gid);
71 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
73 if (AccountDBManager.getInstance()
74 .selectRecord(Constants.INVITE_TABLE, condition).isEmpty()) {
75 AccountDBManager.getInstance().insertRecord(Constants.INVITE_TABLE,
76 mTypeInvite.convertObjectToMap(newInviteTable));
77 notifyToSubscriber(uid);
78 notifyToSubscriber(mid);
82 public void deleteInvitation(String mid, String gid) {
83 HashMap<String, Object> condition = new HashMap<>();
84 condition.put(Constants.REQ_GROUP_ID, gid);
85 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
87 InviteTable getInviteTable = new InviteTable();
89 List<HashMap<String, Object>> getInviteList = AccountDBManager
90 .getInstance().selectRecord(Constants.INVITE_TABLE, condition);
92 ArrayList<String> uidList = new ArrayList<>();
93 for (HashMap<String, Object> getInvite : getInviteList) {
94 getInviteTable = mTypeInvite.convertMaptoObject(getInvite,
96 uidList.add(getInviteTable.getInviteUser());
99 AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE,
102 notifyToSubscriber(mid);
103 for (String uid : uidList) {
104 notifyToSubscriber(uid);
108 public void cancelInvitation(String uid, String gid, String mid) {
110 HashMap<String, Object> condition = new HashMap<>();
112 condition.put(Constants.REQ_GROUP_ID, gid);
113 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
114 condition.put(Constants.KEYFIELD_INVITE_USER, uid);
116 AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE,
119 notifyToSubscriber(uid);
120 notifyToSubscriber(mid);
123 public HashMap<String, Object> getInvitationInfo(String uid) {
124 HashMap<String, Object> responsePayload = new HashMap<>();
126 ArrayList<Object> invitePayloadData = null;
127 ArrayList<Object> invitedPayloadData = null;
129 List<InviteTable> inviteList = getInviteTableList(
130 Constants.KEYFIELD_INVITE_USER, uid);
131 if (!inviteList.isEmpty()) {
132 invitePayloadData = new ArrayList<>();
133 for (InviteTable invite : inviteList) {
134 HashMap<String, String> inviteElement = new HashMap<>();
135 inviteElement.put(Constants.REQ_GROUP_ID, invite.getGid());
136 inviteElement.put(Constants.REQ_MEMBER,
137 invite.getInvitedUser());
138 invitePayloadData.add(inviteElement);
142 List<InviteTable> invitedList = getInviteTableList(
143 Constants.KEYFIELD_INVITED_USER, uid);
144 if (!invitedList.isEmpty()) {
145 invitedPayloadData = new ArrayList<>();
146 for (InviteTable invited : invitedList) {
147 HashMap<String, String> invitedElement = new HashMap<>();
148 invitedElement.put(Constants.REQ_GROUP_ID, invited.getGid());
149 invitedElement.put(Constants.REQ_MEMBER,
150 invited.getInviteUser());
151 invitedPayloadData.add(invitedElement);
155 responsePayload.put(Constants.RESP_INVITE, invitePayloadData);
156 responsePayload.put(Constants.RESP_INVITED, invitedPayloadData);
158 return responsePayload;
161 public HashMap<String, Object> addSubscriber(String uid, Device subscriber,
164 InviteSubscriber newSubscriber = new InviteSubscriber(subscriber,
167 synchronized (mSubscribers) {
168 ArrayList<InviteSubscriber> subscriberList = mSubscribers.get(uid);
170 if (subscriberList == null) {
171 subscriberList = new ArrayList<>();
174 subscriberList.add(newSubscriber);
175 mSubscribers.put(uid, subscriberList);
178 return getInvitationInfo(uid);
181 public HashMap<String, Object> removeSubscriber(String uid, IRequest request) {
183 synchronized (mSubscribers) {
184 if (mSubscribers.containsKey(uid)) {
186 mSubscribers.get(uid).removeIf(
187 subscriber -> subscriber.mRequest.getRequestId()
188 .equals(request.getRequestId()));
192 return getInvitationInfo(uid);
195 private void notifyToSubscriber(String id) {
197 synchronized (mSubscribers) {
198 if (!mSubscribers.containsKey(id)) {
202 Cbor<HashMap<String, Object>> cbor = new Cbor<>();
203 byte[] payload = cbor.encodingPayloadToCbor(getInvitationInfo(id));
205 for (InviteSubscriber subscriber : mSubscribers.get(id)) {
207 subscriber.mSubscriber.sendResponse(MessageBuilder
208 .createResponse(subscriber.mRequest,
209 ResponseStatus.CONTENT,
210 ContentFormat.APPLICATION_CBOR, payload));
215 private List<InviteTable> getInviteTableList(String property, String uid) {
217 InviteTable getInviteTable = new InviteTable();
218 ArrayList<InviteTable> inviteList = new ArrayList<>();
220 HashMap<String, Object> condition = new HashMap<>();
221 condition.put(property, uid);
222 ArrayList<HashMap<String, Object>> mapInviteList = AccountDBManager
223 .getInstance().selectRecord(Constants.INVITE_TABLE, condition);
224 if (mapInviteList == null) {
225 throw new BadRequestException("uid is invalid");
227 for (HashMap<String, Object> mapInviteTable : mapInviteList) {
229 getInviteTable = mTypeInvite.convertMaptoObject(mapInviteTable,
231 inviteList.add(getInviteTable);