1 package org.iotivity.cloud.accountserver.resources.acl.id;
3 import java.util.Arrays;
4 import java.util.HashMap;
7 import org.iotivity.cloud.accountserver.Constants;
8 import org.iotivity.cloud.base.device.Device;
9 import org.iotivity.cloud.base.exception.ServerException;
10 import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
11 import org.iotivity.cloud.base.exception.ServerException.PreconditionFailedException;
12 import org.iotivity.cloud.base.protocols.IRequest;
13 import org.iotivity.cloud.base.protocols.IResponse;
14 import org.iotivity.cloud.base.protocols.MessageBuilder;
15 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
16 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
17 import org.iotivity.cloud.base.resource.Resource;
18 import org.iotivity.cloud.util.Cbor;
20 public class AclResource extends Resource {
22 private Cbor<HashMap<String, Object>> mCbor = new Cbor<>();
23 private static AclManager mAclManager = new AclManager();
25 public AclResource() {
26 super(Arrays.asList(Constants.PREFIX_OIC, Constants.ACL_URI,
30 public static AclManager getInstance() {
35 public void onDefaultRequestReceived(Device srcDevice, IRequest request)
36 throws ServerException {
38 IResponse response = null;
40 if (request.getUriPathSegments().size() > getUriPathSegments().size()
42 throw new BadRequestException("uriPath is invalid");
45 switch (request.getMethod()) {
47 response = handlePutRequest(request);
50 response = handlePostRequest(request);
53 response = handleGetRequest(srcDevice, request);
56 response = handleDeleteRequest(request);
59 throw new BadRequestException(
60 request.getMethod() + " request type is not support");
63 srcDevice.sendResponse(response);
66 private IResponse handlePutRequest(IRequest request)
67 throws ServerException {
69 if (getUriPathSegments().containsAll(request.getUriPathSegments())) {
70 String oid = request.getUriQueryMap().get(Constants.REQ_OWNER_ID)
72 String di = request.getUriQueryMap().get(Constants.REQ_DEVICE_ID)
74 if (mAclManager.getAclid(di) == null) {
75 return MessageBuilder.createResponse(request,
76 ResponseStatus.CREATED, ContentFormat.APPLICATION_CBOR,
77 mCbor.encodingPayloadToCbor(
78 mAclManager.createAcl(oid, di)));
80 throw new BadRequestException(
81 "aclid already exists for the given di");
85 throw new BadRequestException("uriPath is invalid");
88 private IResponse handlePostRequest(IRequest request)
89 throws ServerException {
91 HashMap<String, Object> payloadData = mCbor
92 .parsePayloadFromCbor(request.getPayload(), HashMap.class);
94 if (null !=request.getUriQueryMap()) {
95 String aclid = request.getUriPathSegments().get(getUriPathSegments().size());
96 String aceid = request.getUriQueryMap().get(Constants.REQ_ACE_ID).get(0);
97 List<HashMap<String, Object>> aclist = (List<HashMap<String, Object>>) payloadData
98 .get(Constants.REQ_ACL_LIST);
99 mAclManager.updateACE(aclid, aceid, aclist.get(0));
100 return MessageBuilder.createResponse(request, ResponseStatus.CHANGED);
102 else if (!getUriPathSegments().containsAll(request.getUriPathSegments())) {
103 String aclid = request.getUriPathSegments().get(getUriPathSegments().size());
105 List<HashMap<String, Object>> aclist = null;
106 if (!payloadData.containsKey(Constants.REQ_ACL_LIST)) {
107 throw new BadRequestException("aclist not included in payload");
109 aclist = (List<HashMap<String, Object>>) payloadData
110 .get(Constants.REQ_ACL_LIST);
111 aclist= mAclManager.addAclACE(aclid, aclist);
112 payloadData.put(Constants.REQ_ACL_LIST, aclist);
113 return MessageBuilder.createResponse(request, ResponseStatus.CHANGED,
114 ContentFormat.APPLICATION_CBOR,
115 mCbor.encodingPayloadToCbor(payloadData));
117 throw new BadRequestException("uriPath is invalid");
121 @SuppressWarnings("unchecked")
123 private IResponse handleGetRequest(Device srcDevice, IRequest request)
124 throws ServerException {
126 HashMap<String, Object> responsePayload = null;
129 if (getUriPathSegments().containsAll(request.getUriPathSegments())) {
130 di = request.getUriQueryMap().get(Constants.REQ_DEVICE_ID).get(0);
132 throw new PreconditionFailedException("di is invalid");
134 responsePayload = mAclManager.getAclid(di);
136 String aclid = request.getUriPathSegments()
137 .get(getUriPathSegments().size());
138 switch (request.getObserve()) {
140 responsePayload = mAclManager.getAclInfo(aclid);
143 di = request.getUriQueryMap().get(Constants.REQ_DEVICE_ID)
145 responsePayload = mAclManager.addAclSubscriber(aclid, di,
149 di = request.getUriQueryMap().get(Constants.REQ_DEVICE_ID)
151 responsePayload = mAclManager.removeAclSubscriber(aclid,
155 throw new BadRequestException(request.getObserve()
156 + " observe type is not supported");
161 return MessageBuilder.createResponse(request, ResponseStatus.CONTENT,
162 ContentFormat.APPLICATION_CBOR,
163 mCbor.encodingPayloadToCbor(responsePayload));
167 private IResponse handleDeleteRequest(IRequest request)
168 throws ServerException {
172 if (getUriPathSegments().containsAll(request.getUriPathSegments())) {
173 aclid = request.getUriQueryMap().get(Constants.REQ_ACL_ID).get(0);
175 throw new PreconditionFailedException("aclid is invalid");
177 mAclManager.deleteAcl(aclid);
179 aclid = request.getUriPathSegments()
180 .get(getUriPathSegments().size());
182 if (request.getUriQueryMap() == null)
184 mAclManager.deleteAclAclist(aclid);
186 else if (request.getUriQueryMap()
187 .containsKey(Constants.REQ_ACE_ID)) {
188 String aceid = request.getUriQueryMap().get(Constants.REQ_ACE_ID)
190 mAclManager.deleteAclACE(aclid, aceid);
193 throw new BadRequestException("uriPath is invalid");
197 return MessageBuilder.createResponse(request, ResponseStatus.DELETED);