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;
40 public class InviteManager {
42 private TypeCastingManager<InviteTable> mTypeInvite = new TypeCastingManager<>();
44 private class InviteSubscriber {
45 InviteSubscriber(Device subscriber, IRequest request) {
46 mSubscriber = subscriber;
50 public Device mSubscriber;
51 public IRequest mRequest;
54 private HashMap<String, InviteSubscriber> mSubscribers = new HashMap<>();
56 public void addInvitation(String uid, String gid, String mid) {
58 InviteTable newInviteTable = new InviteTable(uid, gid, mid);
60 HashMap<String, Object> condition = new HashMap<>();
61 condition.put(Constants.KEYFIELD_INVITE_USER, uid);
62 condition.put(Constants.KEYFIELD_GID, gid);
63 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
65 if (AccountDBManager.getInstance()
66 .selectRecord(Constants.INVITE_TABLE, condition).isEmpty()) {
67 AccountDBManager.getInstance().insertRecord(Constants.INVITE_TABLE,
68 mTypeInvite.convertObjectToMap(newInviteTable));
69 notifyToSubscriber(uid);
70 notifyToSubscriber(mid);
74 public void deleteInvitation(String mid, String gid) {
75 HashMap<String, Object> condition = new HashMap<>();
76 condition.put(Constants.REQ_GROUP_ID, gid);
77 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
79 InviteTable getInviteTable = new InviteTable();
81 List<HashMap<String, Object>> getInviteList = AccountDBManager
82 .getInstance().selectRecord(Constants.INVITE_TABLE, condition);
84 ArrayList<String> uidList = new ArrayList<>();
85 for (HashMap<String, Object> getInvite : getInviteList) {
86 getInviteTable = mTypeInvite.convertMaptoObject(getInvite,
88 uidList.add(getInviteTable.getInviteUser());
91 AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE,
94 notifyToSubscriber(mid);
95 for (String uid : uidList) {
96 notifyToSubscriber(uid);
100 public void cancelInvitation(String uid, String gid, String mid) {
102 HashMap<String, Object> condition = new HashMap<>();
104 condition.put(Constants.REQ_GROUP_ID, gid);
105 condition.put(Constants.KEYFIELD_INVITED_USER, mid);
106 condition.put(Constants.KEYFIELD_INVITE_USER, uid);
108 AccountDBManager.getInstance().deleteRecord(Constants.INVITE_TABLE,
111 notifyToSubscriber(uid);
112 notifyToSubscriber(mid);
115 public HashMap<String, Object> getInvitationInfo(String uid) {
116 HashMap<String, Object> responsePayload = new HashMap<>();
118 ArrayList<Object> invitePayloadData = null;
119 ArrayList<Object> invitedPayloadData = null;
121 List<InviteTable> inviteList = getInviteTableList(
122 Constants.KEYFIELD_INVITE_USER, uid);
123 if (!inviteList.isEmpty()) {
124 invitePayloadData = new ArrayList<>();
125 for (InviteTable invite : inviteList) {
126 HashMap<String, String> inviteElement = new HashMap<>();
127 inviteElement.put(Constants.REQ_GROUP_ID, invite.getGid());
128 inviteElement.put(Constants.REQ_MEMBER,
129 invite.getInvitedUser());
130 invitePayloadData.add(inviteElement);
134 List<InviteTable> invitedList = getInviteTableList(
135 Constants.KEYFIELD_INVITED_USER, uid);
136 if (inviteList.isEmpty()) {
137 invitedPayloadData = new ArrayList<>();
138 for (InviteTable invited : invitedList) {
139 HashMap<String, String> invitedElement = new HashMap<>();
140 invitedElement.put(Constants.REQ_GROUP_ID, invited.getGid());
141 invitedElement.put(Constants.REQ_MEMBER,
142 invited.getInviteUser());
143 invitedPayloadData.add(invitedElement);
147 responsePayload.put(Constants.RESP_INVITE, invitePayloadData);
148 responsePayload.put(Constants.RESP_INVITED, invitedPayloadData);
150 return responsePayload;
153 public HashMap<String, Object> addSubscriber(String uid, Device subscriber,
156 InviteSubscriber newSubscriber = new InviteSubscriber(subscriber,
158 mSubscribers.put(uid, newSubscriber);
160 return getInvitationInfo(uid);
163 public HashMap<String, Object> removeSubscriber(String uid) {
165 if (mSubscribers.containsKey(uid)) {
166 mSubscribers.remove(uid);
169 return getInvitationInfo(uid);
172 private void notifyToSubscriber(String id) {
174 synchronized (mSubscribers) {
175 if (!mSubscribers.containsKey(id)) {
178 Cbor<HashMap<String, Object>> cbor = new Cbor<>();
179 mSubscribers.get(id).mSubscriber.sendResponse(
180 MessageBuilder.createResponse(mSubscribers.get(id).mRequest,
181 ResponseStatus.CONTENT,
182 ContentFormat.APPLICATION_CBOR,
183 cbor.encodingPayloadToCbor(getInvitationInfo(id))));
187 private List<InviteTable> getInviteTableList(String property, String uid) {
189 InviteTable getInviteTable = new InviteTable();
190 ArrayList<InviteTable> inviteList = new ArrayList<>();
192 HashMap<String, Object> condition = new HashMap<>();
193 condition.put(property, uid);
194 ArrayList<HashMap<String, Object>> mapInviteList = AccountDBManager
195 .getInstance().selectRecord(Constants.INVITE_TABLE, condition);
196 if (mapInviteList == null) {
197 throw new BadRequestException("uid is invalid");
199 for (HashMap<String, Object> mapInviteTable : mapInviteList) {
201 getInviteTable = mTypeInvite.convertMaptoObject(mapInviteTable,
203 inviteList.add(getInviteTable);