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.id;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.HashMap;
28 import java.util.HashSet;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.UUID;
32 import java.util.ListIterator;
34 import org.iotivity.cloud.accountserver.Constants;
35 import org.iotivity.cloud.accountserver.db.AccountDBManager;
36 import org.iotivity.cloud.accountserver.db.AclTable;
37 import org.iotivity.cloud.accountserver.util.TypeCastingManager;
38 import org.iotivity.cloud.base.device.Device;
39 import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
40 import org.iotivity.cloud.base.exception.ServerException.InternalServerErrorException;
41 import org.iotivity.cloud.base.exception.ServerException.UnAuthorizedException;
42 import org.iotivity.cloud.base.protocols.IRequest;
43 import org.iotivity.cloud.base.protocols.MessageBuilder;
44 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
45 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
46 import org.iotivity.cloud.util.Cbor;
47 import org.iotivity.cloud.util.Log;
51 private Cbor<HashMap<String, Object>> mCbor = new Cbor<>();
52 private String mAclid = null;
53 private String mOid = null;
54 private String mDi = null;
55 private TypeCastingManager<AclTable> mTypeAcl = new TypeCastingManager<>();
57 public Acl(String aclid) {
61 public Acl(String aclid, String oid, String di) {
67 private class AclSubscriber {
68 AclSubscriber(Device subscriber, IRequest request) {
69 mSubscriber = subscriber;
73 public Device mSubscriber;
74 public IRequest mRequest;
77 private HashMap<String, AclSubscriber> mSubscribers = new HashMap<>();
79 public static String valueOf(Object object) {
80 return (object == null) ? "" : object.toString();
83 @SuppressWarnings("unchecked")
84 public static AclTable convertMaptoAclObject(HashMap<String, Object> aclMap) {
85 AclTable aclTable = new AclTable();
87 aclTable.setAclid(valueOf(aclMap.get(Constants.KEYFIELD_ACLID)));
88 aclTable.setDi(valueOf(aclMap.get(Constants.KEYFIELD_DI)));
89 aclTable.setOid(valueOf(aclMap.get(Constants.REQ_OWNER_ID)));
90 aclTable.setRowneruuid(valueOf(aclMap.get(Constants.REQ_ROWNER_ID)));
92 List<Ace> aceList = new ArrayList<Ace>();
94 List<HashMap<String, Object>> aclist = (List<HashMap<String, Object>>) aclMap
95 .get(Constants.REQ_ACL_LIST);
101 for (HashMap<String, Object> eachAce : aclist) {
105 ace.setAceid(valueOf(eachAce.get(Constants.REQ_ACE_ID)));
106 ace.setSubjectuuid(valueOf(eachAce
107 .get(Constants.KEYFIELD_ACE_SUBJECT_ID)));
108 ace.setStype(Integer.valueOf(eachAce.get(
109 Constants.KEYFIELD_ACE_SUBJECT_TYPE).toString()));
110 ace.setPermission(Integer.valueOf(eachAce.get(
111 Constants.KEYFIELD_ACE_PERMISSION).toString()));
113 Object validity = eachAce.get(Constants.KEYFIELD_ACE_VALIDITY);
114 if (validity != null) {
115 ace.setValidity((List<String>) validity);
118 List<AceResource> resourceLst = new ArrayList<AceResource>();
119 List<HashMap<String, Object>> resourceList = (List<HashMap<String, Object>>) eachAce
120 .get(Constants.KEYFIELD_ACE_RESOURCE);
121 for (HashMap<String, Object> resrouce : resourceList) {
123 AceResource aceResource = new AceResource();
124 aceResource.setHref(valueOf(resrouce
125 .get(Constants.KEYFIELD_ACE_RESOURCE_HREF)));
126 List<String> rtList = (List<String>) resrouce
127 .get(Constants.KEYFIELD_ACE_RESOURCE_RT);
128 aceResource.setRt(rtList);
129 List<String> ifList = (List<String>) resrouce
130 .get(Constants.KEYFIELD_ACE_RESOURCE_IF);
131 aceResource.setOicif(ifList);
133 resourceLst.add(aceResource);
135 ace.setResources(resourceLst);
140 aclTable.setAclist(aceList);
141 } catch (Exception e) {
142 throw new InternalServerErrorException(
143 "Map to Acl Object casting error " + e.getMessage());
149 @SuppressWarnings("unchecked")
151 public List<HashMap<String, Object>> addACE(List<HashMap<String, Object>> aclist) {
153 HashMap<String, Object> hashmap = AccountDBManager.getInstance()
154 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
155 if (hashmap == null) {
156 throw new BadRequestException("aclid is invalid");
158 List<HashMap<String, Object>> aclDbList = (List<HashMap<String, Object>>) hashmap
159 .get(Constants.REQ_ACL_LIST);
162 ListIterator<HashMap<String, Object>> iterator = aclist.listIterator();
163 while (iterator.hasNext()) {
164 HashMap<String, Object> aceMap = iterator.next();
165 if (aceMap.get(Constants.KEYFIELD_ACE_SUBJECT_ID)
166 .equals(hashmap.get(Constants.REQ_OWNER_ID))) {
167 // remove current iterator
171 aceMap.put(Constants.REQ_ACE_ID, UUID.randomUUID().toString());
174 List<HashMap<String, Object>> newAcList = new ArrayList<HashMap<String, Object>>(
177 if (aclDbList != null) {
178 newAcList.addAll(aclDbList);
180 hashmap.put(Constants.REQ_ACL_LIST, newAcList);
181 AccountDBManager.getInstance().updateRecord(Constants.ACL_TABLE,
183 notifyToSubscriber(getResponsePayload(true));
188 public HashMap<String, Object> getACE(String aceid) {
189 HashMap<String, Object> hashmap = AccountDBManager.getInstance()
190 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
191 if (hashmap == null) {
192 throw new BadRequestException("aclid is invalid");
195 List<HashMap<String, Object>> aclDbList = (List<HashMap<String, Object>>) hashmap
196 .get(Constants.REQ_ACL_LIST);
197 ListIterator<HashMap<String, Object>> iterator = aclDbList
199 while (iterator.hasNext()) {
200 HashMap<String, Object> aceMap = iterator.next();
201 if (aceMap.get(Constants.REQ_ACE_ID).equals(aceid)) {
202 // Return the current element from the iterator
206 throw new BadRequestException("aceid is invalid");
208 public boolean isValidAceId(String aceid) {
209 HashMap<String, Object> hashmap = AccountDBManager.getInstance()
210 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
211 if (hashmap == null) {
215 List<HashMap<String, Object>> aclDbList = (List<HashMap<String, Object>>) hashmap
216 .get(Constants.REQ_ACL_LIST);
217 ListIterator<HashMap<String, Object>> iterator = aclDbList
219 while (iterator.hasNext()) {
220 HashMap<String, Object> aceMap = iterator.next();
221 if (aceMap.get(Constants.REQ_ACE_ID).equals(aceid)) {
227 public void updateACE(String aceid, HashMap<String, Object> ace) {
228 Log.v("IN updateACE");
230 HashMap<String, Object> hashmap = AccountDBManager.getInstance()
231 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
233 List<HashMap<String, Object>> aclDbList = (List<HashMap<String, Object>>) hashmap.get(Constants.REQ_ACL_LIST);
235 ace.put(Constants.REQ_ACE_ID, aceid);
237 ListIterator<HashMap<String, Object>> iterator = aclDbList.listIterator();
238 while (iterator.hasNext()) {
239 HashMap<String, Object> aceMap = iterator.next();
240 if (aceMap.get(Constants.REQ_ACE_ID).equals(aceid)) {
241 // replace current iterator with new element
247 hashmap.put(Constants.REQ_ACL_LIST, aclDbList);
248 AccountDBManager.getInstance().updateRecord(Constants.ACL_TABLE, hashmap);
249 notifyToSubscriber(getResponsePayload(true));
250 Log.v("OUT updateACE");
254 public void deleteACE(String aceid) {
256 HashMap<String, Object> hashmap = AccountDBManager.getInstance()
257 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
259 List<HashMap<String, Object>> aclDbList = (List<HashMap<String, Object>>) hashmap
260 .get(Constants.REQ_ACL_LIST);
263 ListIterator<HashMap<String, Object>> iterator = aclDbList.listIterator();
264 while (iterator.hasNext()) {
265 HashMap<String, Object> aceMap = iterator.next();
266 if (aceMap.get(Constants.REQ_ACE_ID).equals(aceid)) {
267 // Remove the current element from the iterator
273 hashmap.put(Constants.REQ_ACL_LIST, aclDbList);
274 AccountDBManager.getInstance().updateRecord(Constants.ACL_TABLE,
276 notifyToSubscriber(getResponsePayload(true));
279 public void deleteAclist() {
280 AclTable aclTable = getAclTable();
281 aclTable.setAclist(null);
282 AccountDBManager.getInstance().updateRecord(Constants.ACL_TABLE,
283 mTypeAcl.convertObjectToMap(aclTable));
284 notifyToSubscriber(getResponsePayload(true));
287 public HashMap<String, Object> getInfo() {
288 return getResponsePayload(true);
291 public HashMap<String, Object> addSubscriber(String di, Device subscriber,
294 verifyAclTableDi(di);
295 AclSubscriber newSubscriber = new AclSubscriber(subscriber, request);
296 mSubscribers.put(di, newSubscriber);
300 public HashMap<String, Object> removeSubscriber(String di) {
302 HashMap<String, Object> responsePayload = getResponsePayload(true);
303 if (mSubscribers.containsKey(di)) {
304 mSubscribers.remove(di);
306 return responsePayload;
309 private void verifyAclTableDi(String di) {
310 AclTable aclTable = getAclTable();
311 if (aclTable.getDi() == null) {
312 throw new BadRequestException("di is invalid in Acl");
314 String mDi = aclTable.getDi();
315 if (!mDi.equals(di)) {
316 throw new UnAuthorizedException(
317 di + "is not Device ID of this ACL");
321 private void notifyToSubscriber(
322 HashMap<String, Object> notifyBytePayloadData) {
323 synchronized (mSubscribers) {
325 Iterator<String> iterator = mSubscribers.keySet().iterator();
326 while(iterator.hasNext()) {
327 String key = iterator.next();
328 AclSubscriber aclSubscriber = mSubscribers.get(key);
329 aclSubscriber.mSubscriber.sendResponse(
330 MessageBuilder.createResponse(aclSubscriber.mRequest,
331 ResponseStatus.CONTENT,
332 ContentFormat.APPLICATION_CBOR,
333 mCbor.encodingPayloadToCbor(
334 notifyBytePayloadData)));
339 private AclTable getAclTable() {
340 AclTable getAclTable = new AclTable();
341 getAclTable = convertMaptoAclObject(
342 AccountDBManager.getInstance().selectRecord(
343 Constants.ACL_TABLE, getCondition()).get(0));
347 private HashMap<String, Object> getAclTablePayLoad() {
348 HashMap<String, Object> aclPayload = new HashMap<>();
349 aclPayload = AccountDBManager.getInstance()
350 .selectRecord(Constants.ACL_TABLE, getCondition()).get(0);
354 private HashMap<String, Object> getResponsePayload(boolean isAliveAcl) {
355 return isAliveAcl ? getAclTablePayLoad() : null;
358 private HashMap<String, Object> getCondition() {
359 HashMap<String, Object> condition = new HashMap<>();
360 condition.put(Constants.REQ_ACL_ID, mAclid);