From: eunok.shin Date: Tue, 16 Aug 2016 09:45:39 +0000 (+0900) Subject: modify the payload format of device presence resource according to the specifications X-Git-Tag: 1.2.0+RC1~70^2~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=11fd67fcd98477ff770bc1bc4697a3510f7ee16d;p=platform%2Fupstream%2Fiotivity.git modify the payload format of device presence resource according to the specifications Change-Id: I6031880957198acea537a83a327724114cdc8d46 Signed-off-by: eunok.shin Reviewed-on: https://gerrit.iotivity.org/gerrit/10507 Tested-by: jenkins-iotivity Reviewed-by: Jee Hyeok Kim --- diff --git a/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/Constants.java b/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/Constants.java index 04e4673..57ef745 100644 --- a/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/Constants.java +++ b/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/Constants.java @@ -57,6 +57,7 @@ public class Constants extends OICConstants { // for '/oic/prs' resource public static final String PRESENCE_STATE = "state"; + public static final String PRESENCE_LIST = "prslist"; public static final String RS_NON = "non"; public static final String RS_TRIGGER = "trg"; diff --git a/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/resources/presence/device/DevicePresenceResource.java b/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/resources/presence/device/DevicePresenceResource.java index 6a085be..bd8780b 100644 --- a/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/resources/presence/device/DevicePresenceResource.java +++ b/cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/resources/presence/device/DevicePresenceResource.java @@ -29,7 +29,6 @@ import java.util.List; import org.iotivity.cloud.base.device.Device; import org.iotivity.cloud.base.exception.ServerException; import org.iotivity.cloud.base.exception.ServerException.BadRequestException; -import org.iotivity.cloud.base.exception.ServerException.PreconditionFailedException; import org.iotivity.cloud.base.protocols.IRequest; import org.iotivity.cloud.base.protocols.IResponse; import org.iotivity.cloud.base.protocols.MessageBuilder; @@ -77,17 +76,7 @@ public class DevicePresenceResource extends Resource { switch (request.getMethod()) { case GET: - switch (request.getObserve()) { - case SUBSCRIBE: - response = handleRegisterRequest(srcDevice, request); - break; - case UNSUBSCRIBE: - response = handleCancelRequest(request); - break; - default: - throw new BadRequestException( - "Subscribe or Unsubscribe required"); - } + response = handleGetRequest(srcDevice, request); break; case POST: @@ -95,110 +84,71 @@ public class DevicePresenceResource extends Resource { break; default: - throw new BadRequestException(request.getMethod() - + " request type is not supported"); + throw new BadRequestException( + request.getMethod() + " request type is not supported"); } srcDevice.sendResponse(response); } - private IResponse handleRegisterRequest(Device srcDevice, IRequest request) + private IResponse handleGetRequest(Device srcDevice, IRequest request) throws ServerException { HashMap> queryMap = request.getUriQueryMap(); - if (queryMap == null) { - throw new PreconditionFailedException("query is null"); - } - - List deviceList = queryMap.get(Constants.DEVICE_ID); + byte[] payload = null; - if (deviceList == null) { - throw new PreconditionFailedException("deviceList is null"); - } + if (checkQueryException(Arrays.asList(Constants.DEVICE_ID), queryMap)) { - addObserver(srcDevice, request, deviceList); + List deviceList = queryMap.get(Constants.DEVICE_ID); - ArrayList> getPayload = new ArrayList>(); + switch (request.getObserve()) { + case SUBSCRIBE: + addObserver(srcDevice, request, deviceList); + break; + case UNSUBSCRIBE: + removeObserver(request); + break; + default: + } - for (String deviceId : deviceList) { - HashMap payloadSegment = new HashMap(); - payloadSegment.put(Constants.DEVICE_ID, deviceId); - payloadSegment.put(Constants.PRESENCE_STATE, DBManager - .getInstance().findDeviceState(deviceId)); - getPayload.add(payloadSegment); + payload = makeResponsePayload(deviceList); } - Log.i("Get observe response" + getPayload.toString()); - return MessageBuilder.createResponse(request, ResponseStatus.CONTENT, - ContentFormat.APPLICATION_CBOR, - mCbor.encodingPayloadToCbor(getPayload)); + ContentFormat.APPLICATION_CBOR, payload); } - private IResponse handleCancelRequest(IRequest request) + public IResponse handlePostRequest(IRequest request) throws ServerException { - - HashMap> queryMap = request.getUriQueryMap(); - - if (queryMap == null) { - throw new PreconditionFailedException("query is null"); - } - - List deviceList = queryMap.get(Constants.DEVICE_ID); - - if (deviceList == null) { - throw new PreconditionFailedException("deviceList is null"); - } - - removeObserver(request); - - ArrayList> getPayload = new ArrayList>(); - - for (String deviceId : deviceList) { - HashMap payloadSegment = new HashMap(); - payloadSegment.put(Constants.DEVICE_ID, deviceId); - payloadSegment.put(Constants.PRESENCE_STATE, DBManager - .getInstance().findDeviceState(deviceId)); - getPayload.add(payloadSegment); - } - Log.i("Get observe response" + getPayload.toString()); - - return MessageBuilder.createResponse(request, ResponseStatus.CONTENT, - ContentFormat.APPLICATION_CBOR, - mCbor.encodingPayloadToCbor(getPayload)); - } - - public IResponse handlePostRequest(IRequest request) throws ServerException { // check payload byte[] payload = request.getPayload(); - if (payload == null) { - throw new PreconditionFailedException("payload is null"); - } - - HashMap parsedPayload = mCbor.parsePayloadFromCbor( - payload, HashMap.class); + HashMap parsedPayload = mCbor + .parsePayloadFromCbor(payload, HashMap.class); - checkPayloadException( + if (checkPayloadException( Arrays.asList(Constants.DEVICE_ID, Constants.PRESENCE_STATE), - parsedPayload); + parsedPayload)) { - String deviceId = parsedPayload.get(Constants.DEVICE_ID).toString(); - String state = parsedPayload.get(Constants.PRESENCE_STATE).toString(); - DeviceState deviceState = new DeviceState(); - deviceState.setDi(deviceId); - deviceState.setState(state); + String deviceId = parsedPayload.get(Constants.DEVICE_ID).toString(); + String state = parsedPayload.get(Constants.PRESENCE_STATE) + .toString(); + DeviceState deviceState = new DeviceState(); + deviceState.setDi(deviceId); + deviceState.setState(state); - TypeCastingManager deviceStateTypeManager = new TypeCastingManager(); - HashMap storeMap = deviceStateTypeManager - .convertObjectToMap(deviceState); + TypeCastingManager deviceStateTypeManager = new TypeCastingManager(); + HashMap storeMap = deviceStateTypeManager + .convertObjectToMap(deviceState); - // store db - DBManager.getInstance().updateDeviceState(storeMap); + // store db + DBManager.getInstance().updateDeviceState(storeMap); - // notification to observers - notifyToObservers(deviceId); - return MessageBuilder.createResponse(request, ResponseStatus.CREATED); + // notification to observers + notifyToObservers(deviceId); + } + + return MessageBuilder.createResponse(request, ResponseStatus.CHANGED); } private void addObserver(Device srcDevice, IRequest request, @@ -213,8 +163,8 @@ public class DevicePresenceResource extends Resource { mDeviceSubscriber.put(deviceId, subscribers); } - subscribers.put(request.getRequestId(), new PresenceSubscriber( - srcDevice, request)); + subscribers.put(request.getRequestId(), + new PresenceSubscriber(srcDevice, request)); } mSubscribedDevices.put(request.getRequestId(), deviceIdList); @@ -222,8 +172,8 @@ public class DevicePresenceResource extends Resource { private void removeObserver(IRequest request) { - List deviceIdList = mSubscribedDevices.get(request - .getRequestId()); + List deviceIdList = mSubscribedDevices + .get(request.getRequestId()); if (deviceIdList == null) { return; @@ -243,23 +193,37 @@ public class DevicePresenceResource extends Resource { private void notifyToObservers(String deviceId) { - HashMap response = new HashMap<>(); - response.put(Constants.DEVICE_ID, deviceId); - String state = DBManager.getInstance().findDeviceState(deviceId); - response.put(Constants.PRESENCE_STATE, state); - HashMap tokenNSubscribers = mDeviceSubscriber .get(deviceId); if (tokenNSubscribers != null) { + byte[] paylod = makeResponsePayload(Arrays.asList(deviceId)); + for (PresenceSubscriber subscriber : tokenNSubscribers.values()) { - subscriber.mSubscriber.sendResponse(MessageBuilder - .createResponse(subscriber.mRequest, + subscriber.mSubscriber.sendResponse( + MessageBuilder.createResponse(subscriber.mRequest, ResponseStatus.CONTENT, - ContentFormat.APPLICATION_CBOR, - mCbor.encodingPayloadToCbor(response))); + ContentFormat.APPLICATION_CBOR, paylod)); } } } + + private byte[] makeResponsePayload(List deviceList) { + + HashMap getPayload = new HashMap<>(); + ArrayList> prsList = new ArrayList>(); + + for (String deviceId : deviceList) { + HashMap payloadSegment = new HashMap(); + payloadSegment.put(Constants.DEVICE_ID, deviceId); + payloadSegment.put(Constants.PRESENCE_STATE, + DBManager.getInstance().findDeviceState(deviceId)); + prsList.add(payloadSegment); + } + getPayload.put(Constants.PRESENCE_LIST, prsList); + Log.i("Get observe response" + getPayload.toString()); + + return mCbor.encodingPayloadToCbor(getPayload); + } } diff --git a/cloud/resourcedirectory/src/test/java/org/iotivity/cloud/testrdserver/DevicePresenceResourceTest.java b/cloud/resourcedirectory/src/test/java/org/iotivity/cloud/testrdserver/DevicePresenceResourceTest.java index 91e6f9e..3e4e851 100644 --- a/cloud/resourcedirectory/src/test/java/org/iotivity/cloud/testrdserver/DevicePresenceResourceTest.java +++ b/cloud/resourcedirectory/src/test/java/org/iotivity/cloud/testrdserver/DevicePresenceResourceTest.java @@ -22,12 +22,14 @@ package org.iotivity.cloud.testrdserver; import static java.util.concurrent.TimeUnit.SECONDS; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; + import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.CountDownLatch; + import org.iotivity.cloud.base.device.CoapDevice; import org.iotivity.cloud.base.protocols.IRequest; import org.iotivity.cloud.base.protocols.IResponse; @@ -50,18 +52,18 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class DevicePresenceResourceTest { - private Cbor> mCbor = new Cbor<>(); - private ResourceDirectoryResource mRDResource = null; - private DevicePresenceResource mockDevicePresenceResource = null; - private CoapDevice mockDevice = null; - CountDownLatch latch = null; - IResponse res; + private Cbor> mCbor = new Cbor<>(); + private ResourceDirectoryResource mRDResource = null; + private DevicePresenceResource mockDevicePresenceResource = null; + private CoapDevice mockDevice = null; + private CountDownLatch mLatch = null; + private IResponse mResponse; @Before public void setUp() throws Exception { - res = null; + mResponse = null; mockDevice = mock(CoapDevice.class); - latch = new CountDownLatch(1); + mLatch = new CountDownLatch(1); mRDResource = new ResourceDirectoryResource(); mockDevicePresenceResource = new DevicePresenceResource(); // callback mock @@ -70,9 +72,9 @@ public class DevicePresenceResourceTest { public CoapResponse answer(InvocationOnMock invocation) throws Throwable { CoapResponse resp = (CoapResponse) invocation.getArguments()[0]; - latch.countDown(); - res = resp; - return resp; + mLatch.countDown(); + mResponse = resp; + return null; } }).when(mockDevice).sendResponse(Mockito.anyObject()); } @@ -83,7 +85,7 @@ public class DevicePresenceResourceTest { } private IRequest makePresenceGetRequest(Observe obs) { - String query = "di=" + RDServerTestUtils.DI; + String query = Constants.DEVICE_ID + "=" + RDServerTestUtils.DI; IRequest request = null; if (obs.compareTo(Observe.SUBSCRIBE) == 0) { request = MessageBuilder.createRequest(RequestMethod.GET, @@ -93,38 +95,30 @@ public class DevicePresenceResourceTest { devices.add(RDServerTestUtils.DI); HashMap> payload = new HashMap<>(); payload.put(Constants.DEVICE_LIST_KEY, devices); - Cbor> cbor = new Cbor<>(); request = MessageBuilder.createRequest(RequestMethod.GET, RDServerTestUtils.DEVICE_PRS_REQ_URI, query, ContentFormat.APPLICATION_CBOR, - cbor.encodingPayloadToCbor(payload)); + mCbor.encodingPayloadToCbor(payload)); } ((CoapRequest) request).setObserve(obs); return request; } - @Test - public void testHandleGetSubscribeRequest_notExistVaule() throws Exception { - System.out - .println("\t------testHandleGetSubscribeRequest_notExistVaule"); - IRequest request = makePresenceGetRequest(Observe.SUBSCRIBE); - mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, - request); - // assertion: if the response status is "CONTENT" - assertTrue(latch.await(2L, SECONDS)); - assertTrue(methodCheck(res, ResponseStatus.CONTENT)); - // assertion : if the payload has "di" and "state" - assertTrue(arrayHashmapCheck(res, "di")); - assertTrue(arrayHashmapCheck(res, "state")); - ArrayList payloadData = mCbor - .parsePayloadFromCbor(res.getPayload(), ArrayList.class); - HashMap mapData = (HashMap) payloadData - .get(0); - assertNull(mapData.get("state")); + private HashMap parsePayload(IResponse response) { + + HashMap payloadData = mCbor + .parsePayloadFromCbor(response.getPayload(), HashMap.class); + + ArrayList> prsList = (ArrayList>) payloadData + .get(Constants.PRESENCE_LIST); + + HashMap mapData = prsList.get(0); + + return mapData; } @Test - public void testHandleGetSubscribeRequest() throws Exception { + public void testSubscribeRequest() throws Exception { System.out.println("\t------testHandleGetSubscribeRequest"); mRDResource.onDefaultRequestReceived(mockDevice, RDServerTestUtils.makePublishRequest()); @@ -132,21 +126,16 @@ public class DevicePresenceResourceTest { mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, request); // assertion: if the response status is "CONTENT" - assertTrue(latch.await(2L, SECONDS)); - assertTrue(methodCheck(res, ResponseStatus.CONTENT)); + assertTrue(mLatch.await(2L, SECONDS)); + assertTrue(checkResponseCode(mResponse, ResponseStatus.CONTENT)); // assertion : if the payload has "di" and "state" - assertTrue(arrayHashmapCheck(res, "di")); - assertTrue(arrayHashmapCheck(res, "state")); - Cbor> mCbor = new Cbor<>(); - ArrayList payloadData = mCbor - .parsePayloadFromCbor(res.getPayload(), ArrayList.class); - HashMap mapData = (HashMap) payloadData - .get(0); - assertNull(mapData.get("state")); + assertTrue(checkPayloadProperty(mResponse, Constants.DEVICE_ID)); + assertTrue(checkPayloadProperty(mResponse, Constants.PRESENCE_STATE)); + assertNull(parsePayload(mResponse).get(Constants.PRESENCE_STATE)); } @Test - public void testHandleGetUnsubscribeRequest() throws Exception { + public void testUnsubscribeRequest() throws Exception { System.out.println("\t------testHandleGetUnsubscribeRequest"); IRequest request = makePresenceGetRequest(Observe.UNSUBSCRIBE); mRDResource.onDefaultRequestReceived(mockDevice, @@ -154,75 +143,84 @@ public class DevicePresenceResourceTest { mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, request); // assertion: if the response status is "CONTENT" - assertTrue(latch.await(2L, SECONDS)); - assertTrue(methodCheck(res, ResponseStatus.CONTENT)); + assertTrue(mLatch.await(2L, SECONDS)); + assertTrue(checkResponseCode(mResponse, ResponseStatus.CONTENT)); // assertion : if the payload has "di" and "state" - assertTrue(arrayHashmapCheck(res, "di")); - assertTrue(arrayHashmapCheck(res, "state")); - Cbor> mCbor = new Cbor<>(); - ArrayList payloadData = mCbor - .parsePayloadFromCbor(res.getPayload(), ArrayList.class); - HashMap mapData = (HashMap) payloadData - .get(0); - assertNull(mapData.get("state")); + assertTrue(checkPayloadProperty(mResponse, Constants.DEVICE_ID)); + assertTrue(checkPayloadProperty(mResponse, Constants.PRESENCE_STATE)); + assertNull(parsePayload(mResponse).get(Constants.PRESENCE_STATE)); } @Test - public void testHandlePostRequest_presenceOn() throws Exception { - System.out.println("\t------testHandlePostRequest_presenceOn"); - // POST device presence on + public void testSubscribeRequest_existDevice() throws Exception { + System.out.println("\t------testSubscribeRequest_existDevice"); + CoapDevice observerDevice = mock(CoapDevice.class); + CountDownLatch observerLatch = new CountDownLatch(2); + // callback mock for observer Device + Mockito.doAnswer(new Answer() { + @Override + public CoapResponse answer(InvocationOnMock invocation) + throws Throwable { + CoapResponse response = (CoapResponse) invocation + .getArguments()[0]; + observerLatch.countDown(); + // assertion for observer device (subscribe response) + if (observerLatch.getCount() == 1) { + assertTrue(checkResponseCode(response, + ResponseStatus.CONTENT)); + } + if (observerLatch.getCount() == 0) { + assertTrue(checkResponseCode(response, + ResponseStatus.CONTENT)); + assertTrue(checkPayloadProperty(response, + Constants.DEVICE_ID)); + assertTrue(checkPayloadProperty(response, + Constants.PRESENCE_STATE)); + assertTrue(parsePayload(response) + .get(Constants.PRESENCE_STATE).equals("on")); + } + + return null; + } + + }).when(observerDevice).sendResponse(Mockito.anyObject()); + // subscribe request (specific device) + IRequest subRequest = makePresenceGetRequest(Observe.SUBSCRIBE); + mockDevicePresenceResource.onDefaultRequestReceived(observerDevice, + subRequest); + // POST device presence off HashMap payload = new HashMap<>(); - Cbor> cbor = new Cbor<>(); payload.put(Constants.DEVICE_ID, RDServerTestUtils.DI); payload.put(Constants.PRESENCE_STATE, "on"); IRequest request = MessageBuilder.createRequest(RequestMethod.POST, RDServerTestUtils.DEVICE_PRS_REQ_URI, null, ContentFormat.APPLICATION_CBOR, - cbor.encodingPayloadToCbor(payload)); + mCbor.encodingPayloadToCbor(payload)); mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, request); - // subscribe request (specific device) - IRequest subRequest = makePresenceGetRequest(Observe.SUBSCRIBE); - mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, - subRequest); - // assertion: if the response status is "CONTENT" - assertTrue(latch.await(2L, SECONDS)); - assertTrue(methodCheck(res, ResponseStatus.CONTENT)); - // assertion: if the device status is "on" - assertTrue(arrayHashmapCheck(res, "di")); - assertTrue(arrayHashmapCheck(res, "state")); - Cbor> mCbor = new Cbor<>(); - ArrayList payloadData = mCbor - .parsePayloadFromCbor(res.getPayload(), ArrayList.class); - HashMap mapData = (HashMap) payloadData - .get(0); - assertTrue(mapData.get("state").equals("on")); + // assertion for resource server device : responseStatus is "CHANGED" + assertTrue(mLatch.await(2L, SECONDS)); + assertTrue(observerLatch.await(2L, SECONDS)); + assertTrue(checkResponseCode(mResponse, ResponseStatus.CHANGED)); } @Test - public void testHandlePostRequest_presenceOff() throws Exception { - System.out.println("\t------testHandlePostRequest_presenceOff"); + public void testUnSubscribeRequest_existDevice() throws Exception { + System.out.println("\t------testUnSubscribeRequest_existDevice"); CoapDevice observerDevice = mock(CoapDevice.class); - CountDownLatch observerLatch = new CountDownLatch(2); + CountDownLatch observerLatch = new CountDownLatch(1); // callback mock for observer Device Mockito.doAnswer(new Answer() { @Override public CoapResponse answer(InvocationOnMock invocation) throws Throwable { - CoapResponse resp = (CoapResponse) invocation.getArguments()[0]; + CoapResponse response = (CoapResponse) invocation + .getArguments()[0]; observerLatch.countDown(); // assertion for observer device (subscribe response) - if (observerLatch.getCount() == 1) { - assertTrue(methodCheck(resp, ResponseStatus.CONTENT)); - } - // assertion for observer device (prs off response) if (observerLatch.getCount() == 0) { - assertTrue(methodCheck(resp, ResponseStatus.CONTENT)); - Cbor> mCbor = new Cbor<>(); - HashMap payloadData = mCbor - .parsePayloadFromCbor(resp.getPayload(), - HashMap.class); - assertTrue(payloadData.get("state").equals("off")); + assertTrue(checkResponseCode(response, + ResponseStatus.CONTENT)); } return null; @@ -230,39 +228,40 @@ public class DevicePresenceResourceTest { }).when(observerDevice).sendResponse(Mockito.anyObject()); // subscribe request (specific device) - IRequest subRequest = makePresenceGetRequest(Observe.SUBSCRIBE); + IRequest subRequest = makePresenceGetRequest(Observe.UNSUBSCRIBE); mockDevicePresenceResource.onDefaultRequestReceived(observerDevice, subRequest); - // POST device presence off HashMap payload = new HashMap<>(); - Cbor> cbor = new Cbor<>(); payload.put(Constants.DEVICE_ID, RDServerTestUtils.DI); payload.put(Constants.PRESENCE_STATE, "off"); IRequest request = MessageBuilder.createRequest(RequestMethod.POST, RDServerTestUtils.DEVICE_PRS_REQ_URI, null, ContentFormat.APPLICATION_CBOR, - cbor.encodingPayloadToCbor(payload)); + mCbor.encodingPayloadToCbor(payload)); mockDevicePresenceResource.onDefaultRequestReceived(mockDevice, request); - // assertion for resource server device : responseStatus is "CREATED" - assertTrue(latch.await(2L, SECONDS)); + // assertion for resource server device : responseStatus is "CHANGED" + assertTrue(mLatch.await(2L, SECONDS)); assertTrue(observerLatch.await(2L, SECONDS)); - assertTrue(methodCheck(res, ResponseStatus.CREATED)); + assertTrue(checkResponseCode(mResponse, ResponseStatus.CHANGED)); } - private boolean arrayHashmapCheck(IResponse response, String propertyName) { - Cbor> mCbor = new Cbor<>(); - ArrayList payloadData = mCbor - .parsePayloadFromCbor(response.getPayload(), ArrayList.class); - HashMap mapData = (HashMap) payloadData - .get(0); + private boolean checkPayloadProperty(IResponse response, + String propertyName) { + HashMap payloadData = mCbor + .parsePayloadFromCbor(response.getPayload(), HashMap.class); + + ArrayList> prsList = (ArrayList>) payloadData + .get(Constants.PRESENCE_LIST); + + HashMap mapData = prsList.get(0); if (mapData.containsKey(propertyName)) return true; else return false; } - private boolean methodCheck(IResponse response, + private boolean checkResponseCode(IResponse response, ResponseStatus responseStatus) { if (responseStatus == response.getStatus()) return true;