[IOT-1604] Fix cloud routing code
authorJung Seungho <shonest.jung@samsung.com>
Fri, 25 Nov 2016 05:58:59 +0000 (14:58 +0900)
committerJee Hyeok Kim <jihyeok13.kim@samsung.com>
Mon, 28 Nov 2016 08:50:58 +0000 (08:50 +0000)
- Fix on do GET request to discovered resource server.
- changed DiResource to RouteResource
- code clean up

https://jira.iotivity.org/browse/IOT-1604

Change-Id: If1ccc98bb4d8e288d5264d1cadaf540ef0ca4794
Signed-off-by: Jee Hyeok Kim <jihyeok13.kim@samsung.com>
Signed-off-by: Jung Seungho <shonest.jung@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/14781
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
17 files changed:
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/CloudInterfaceServer.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/Constants.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/DeviceServerSystem.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/DiResource.java [deleted file]
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/RouteResource.java [new file with mode: 0644]
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/account/Account.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/DevicePresence.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceDirectory.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFind.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourcePresence.java
cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/DiResourceTest.java [deleted file]
cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/RouteResourceTest.java [new file with mode: 0644]
cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceDirectoryTest.java
cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/proxy/rd/ResourceFindTest.java
cloud/stack/src/main/java/org/iotivity/cloud/base/OICConstants.java
cloud/stack/src/main/java/org/iotivity/cloud/base/connector/CoapClient.java
cloud/stack/src/main/java/org/iotivity/cloud/base/device/CoapDevice.java

index f9487715bc9d16a139c1342ac653fc553147a269..62f0164a129eb2142ea6926029a57bd7b58a894e 100755 (executable)
@@ -27,7 +27,7 @@ import java.util.Scanner;
 import org.iotivity.cloud.base.connector.ConnectorPool;
 import org.iotivity.cloud.base.server.CoapServer;
 import org.iotivity.cloud.ciserver.DeviceServerSystem.CoapDevicePool;
-import org.iotivity.cloud.ciserver.resources.DiResource;
+import org.iotivity.cloud.ciserver.resources.RouteResource;
 import org.iotivity.cloud.ciserver.resources.KeepAliveResource;
 import org.iotivity.cloud.ciserver.resources.proxy.account.Account;
 import org.iotivity.cloud.ciserver.resources.proxy.account.AccountSession;
@@ -113,7 +113,7 @@ public class CloudInterfaceServer {
 
         deviceServer.addResource(resKeepAlive);
 
-        deviceServer.addResource(new DiResource(devicePool));
+        deviceServer.addResource(new RouteResource(devicePool));
 
         deviceServer.addServer(new CoapServer(
                 new InetSocketAddress(Integer.parseInt(args[0]))));
index af91bcc876b77895649e516af16701a875ee2547..ac921ae1266d16b58a50497fc56d853ec666e5ea 100644 (file)
@@ -43,6 +43,7 @@ public class Constants extends OICConstants {
     public static final String REQ_MEMBER_ID       = "mid";
     public static final String REQ_MEMBER_LIST     = "members";
     public static final String REQ_DEVICE_ID       = "di";
+    public static final String REQ_DEVICE_ROUTE    = "route";
     public static final String REQ_DEVICE_LIST     = "devices";
     public static final String REQ_INVITE          = "invite";
     public static final String REQ_PING_ARRAY      = "inarray";
index 8aa5823de45c6fa71ef300d6caa05a16ed15fb0a..4571b802fbf76ce066eab7d409cbf29de952a1a8 100644 (file)
@@ -109,8 +109,7 @@ public class DeviceServerSystem extends ServerSystem {
             Iterator<String> iterator = mMapDevice.keySet().iterator();
             while (iterator.hasNext()) {
                 String deviceId = iterator.next();
-                CoapDevice getDevice = (CoapDevice) mDevicePool
-                        .queryDevice(deviceId);
+                CoapDevice getDevice = (CoapDevice) queryDevice(deviceId);
                 getDevice.removeObserveChannel(
                         ((CoapDevice) device).getRequestChannel());
             }
@@ -154,11 +153,14 @@ public class DeviceServerSystem extends ServerSystem {
 
                     CoapRequest coapRequest = (CoapRequest) msg;
                     IRequestChannel targetChannel = null;
-                    if (coapRequest.getUriPathSegments()
-                            .contains(Constants.REQ_DEVICE_ID)) {
+                    if (coapRequest.getUriPath()
+                            .contains(Constants.ROUTE_FULL_URI)) {
+
+                        int RouteResourcePathSize = Constants.ROUTE_FULL_URI
+                                .split("/").length;
                         CoapDevice targetDevice = (CoapDevice) mDevicePool
                                 .queryDevice(coapRequest.getUriPathSegments()
-                                        .get(1));
+                                        .get(RouteResourcePathSize - 1));
                         targetChannel = targetDevice.getRequestChannel();
                     }
                     switch (coapRequest.getObserve()) {
@@ -194,34 +196,32 @@ public class DeviceServerSystem extends ServerSystem {
         public void write(ChannelHandlerContext ctx, Object msg,
                 ChannelPromise promise) throws Exception {
 
-            if (!(msg instanceof CoapResponse)) {
-                throw new BadRequestException(
-                        "this msg type is not CoapResponse");
-            }
-            // This is CoapResponse
-            // Once the response is valid, add this to deviceList
-            CoapResponse response = (CoapResponse) msg;
-
-            switch (response.getUriPath()) {
-                case OICConstants.ACCOUNT_SESSION_FULL_URI:
-                    if (response.getStatus() != ResponseStatus.CHANGED) {
-                        throw new UnAuthorizedException();
-                    }
+            boolean bCloseConnection = false;
 
-                    if (response.getPayload() != null) {
-                        break;
-                    }
+            if (msg instanceof CoapResponse) {
+                // This is CoapResponse
+                // Once the response is valid, add this to deviceList
+                CoapResponse response = (CoapResponse) msg;
 
-                    ctx.close();
-                    break;
-                case OICConstants.ACCOUNT_FULL_URI:
-                    if (response.getStatus() != ResponseStatus.DELETED) {
+                switch (response.getUriPath()) {
+                    case OICConstants.ACCOUNT_SESSION_FULL_URI:
+                        if (response.getStatus() != ResponseStatus.CHANGED) {
+                            bCloseConnection = true;
+                        }
                         break;
-                    }
-                    ctx.close();
-                    break;
+                    case OICConstants.ACCOUNT_FULL_URI:
+                        if (response.getStatus() == ResponseStatus.DELETED) {
+                            bCloseConnection = true;
+                        }
+                        break;
+                }
             }
+
             ctx.writeAndFlush(msg);
+
+            if (bCloseConnection == true) {
+                ctx.close();
+            }
         }
 
         @Override
diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/DiResource.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/DiResource.java
deleted file mode 100644 (file)
index efb81f5..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * //******************************************************************
- * //
- * // Copyright 2016 Samsung Electronics All Rights Reserved.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- * //
- * // Licensed under the Apache License, Version 2.0 (the "License");
- * // you may not use this file except in compliance with the License.
- * // You may obtain a copy of the License at
- * //
- * //      http://www.apache.org/licenses/LICENSE-2.0
- * //
- * // Unless required by applicable law or agreed to in writing, software
- * // distributed under the License is distributed on an "AS IS" BASIS,
- * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * // See the License for the specific language governing permissions and
- * // limitations under the License.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- */
-package org.iotivity.cloud.ciserver.resources;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-import org.iotivity.cloud.base.OICConstants;
-import org.iotivity.cloud.base.connector.ConnectorPool;
-import org.iotivity.cloud.base.device.CoapDevice;
-import org.iotivity.cloud.base.device.Device;
-import org.iotivity.cloud.base.device.IRequestChannel;
-import org.iotivity.cloud.base.device.IResponseEventHandler;
-import org.iotivity.cloud.base.exception.ServerException;
-import org.iotivity.cloud.base.exception.ServerException.BadRequestException;
-import org.iotivity.cloud.base.exception.ServerException.NotFoundException;
-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;
-import org.iotivity.cloud.base.protocols.coap.CoapResponse;
-import org.iotivity.cloud.base.protocols.enums.ContentFormat;
-import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
-import org.iotivity.cloud.base.resource.Resource;
-import org.iotivity.cloud.ciserver.Constants;
-import org.iotivity.cloud.ciserver.DeviceServerSystem.CoapDevicePool;
-import org.iotivity.cloud.util.Cbor;
-
-/**
- *
- * This class provides a set of APIs to send requests about message to another
- * device
- *
- */
-public class DiResource extends Resource {
-
-    private CoapDevicePool                mDevicePool = null;
-    private IRequestChannel               mASServer   = null;
-    private Cbor<HashMap<String, Object>> mCbor       = new Cbor<>();
-
-    public DiResource(CoapDevicePool devicePool) {
-        super(Arrays.asList(Constants.REQ_DEVICE_ID));
-        mASServer = ConnectorPool.getConnection("account");
-        mDevicePool = devicePool;
-    }
-
-    private IRequestChannel getTargetDeviceChannel(IRequest request)
-            throws ServerException {
-        List<String> uriPathSegment = request.getUriPathSegments();
-
-        if (uriPathSegment.size() < 2) {
-            throw new PreconditionFailedException();
-        }
-
-        String deviceId = uriPathSegment.get(1);
-        CoapDevice targetDevice = (CoapDevice) mDevicePool
-                .queryDevice(deviceId);
-
-        if (targetDevice == null) {
-            throw new NotFoundException();
-        }
-
-        // Do request and receive response
-        return targetDevice.getRequestChannel();
-    }
-
-    private String extractTargetUriPath(IRequest request) {
-        List<String> uriPathSegment = request.getUriPathSegments();
-
-        // Remove prefix path
-        uriPathSegment.remove(0);
-        uriPathSegment.remove(0);
-
-        StringBuilder uriPath = new StringBuilder();
-        for (String path : uriPathSegment) {
-            uriPath.append("/" + path);
-        }
-
-        return uriPath.toString();
-    }
-
-    private IResponse convertReponseUri(IResponse response, String di) {
-
-        String convertedUri = new String();
-
-        CoapResponse coapResponse = (CoapResponse) response;
-
-        if (coapResponse.getUriPath().isEmpty() == false) {
-            convertedUri = "/di/" + di + "/" + coapResponse.getUriPath();
-        }
-
-        return MessageBuilder.modifyResponse(response, convertedUri, null,
-                null);
-    }
-
-    /**
-     *
-     * This class provides a set of APIs to handling message contains link
-     * interface.
-     *
-     */
-    class LinkInterfaceHandler implements IResponseEventHandler {
-        private Cbor<List<HashMap<String, Object>>> mCbor      = new Cbor<>();
-        private String                              mTargetDI  = null;
-        private Device                              mSrcDevice = null;
-
-        public LinkInterfaceHandler(String targetDI, Device srcDevice) {
-            mTargetDI = targetDI;
-            mSrcDevice = srcDevice;
-        }
-
-        private void convertHref(List<HashMap<String, Object>> linkPayload) {
-            for (HashMap<String, Object> link : linkPayload) {
-                link.put("href", "/di/" + mTargetDI + link.get("href"));
-            }
-        }
-
-        @Override
-        public void onResponseReceived(IResponse response) {
-            List<HashMap<String, Object>> linkPayload = null;
-            if (response.getStatus() == ResponseStatus.CONTENT) {
-                linkPayload = mCbor.parsePayloadFromCbor(response.getPayload(),
-                        ArrayList.class);
-                if (linkPayload == null) {
-                    throw new BadRequestException("payload is null");
-                }
-                convertHref(linkPayload);
-            }
-
-            mSrcDevice.sendResponse(MessageBuilder.modifyResponse(
-                    convertReponseUri(response, mTargetDI),
-                    ContentFormat.APPLICATION_CBOR, linkPayload != null
-                            ? mCbor.encodingPayloadToCbor(linkPayload) : null));
-        }
-    }
-
-    class DefaultResponseHandler implements IResponseEventHandler {
-        private String mTargetDI  = null;
-        private Device mSrcDevice = null;
-
-        public DefaultResponseHandler(String targetDI, Device srcDevice) {
-            mTargetDI = targetDI;
-            mSrcDevice = srcDevice;
-        }
-
-        @Override
-        public void onResponseReceived(IResponse response) {
-
-            mSrcDevice.sendResponse(convertReponseUri(response, mTargetDI));
-        }
-    }
-
-    class AccountReceiveHandler implements IResponseEventHandler {
-        private IRequest mRequest   = null;
-        private Device   mSrcDevice = null;
-
-        public AccountReceiveHandler(Device srcDevice, IRequest request) {
-            mRequest = request;
-            mSrcDevice = srcDevice;
-        }
-
-        @Override
-        public void onResponseReceived(IResponse response) {
-            switch (response.getStatus()) {
-                case CONTENT:
-                    HashMap<String, Object> payloadData = mCbor
-                            .parsePayloadFromCbor(response.getPayload(),
-                                    HashMap.class);
-                    checkPayloadException(Constants.RESP_GRANT_POLICY,
-                            payloadData);
-                    String gp = (String) payloadData
-                            .get(Constants.RESP_GRANT_POLICY);
-                    verifyRequest(mSrcDevice, mRequest, gp);
-                    break;
-                default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
-            }
-
-        }
-    }
-
-    private void verifyRequest(Device srcDevice, IRequest request,
-            String grantPermisson) {
-        switch (grantPermisson) {
-            case Constants.RESP_ACL_ALLOWED:
-                IRequestChannel requestChannel = getTargetDeviceChannel(
-                        request);
-
-                if (requestChannel == null) {
-                    throw new NotFoundException();
-                }
-
-                String deviceId = request.getUriPathSegments().get(1);
-
-                IResponseEventHandler responseHandler = null;
-                if (request.getUriQuery() != null && checkQueryException(
-                        Constants.RS_INTERFACE, request.getUriQueryMap())) {
-                    boolean hasLinkInterface = request.getUriQuery()
-                            .contains(Constants.LINK_INTERFACE);
-                    if (hasLinkInterface) {
-                        responseHandler = new LinkInterfaceHandler(deviceId,
-                                srcDevice);
-                    }
-                } else {
-                    responseHandler = new DefaultResponseHandler(deviceId,
-                            srcDevice);
-                }
-
-                String uriPath = extractTargetUriPath(request);
-                IRequest requestToResource = MessageBuilder
-                        .modifyRequest(request, uriPath, null, null, null);
-                requestChannel.sendRequest(requestToResource, responseHandler);
-                break;
-            case Constants.RESP_ACL_DENIED:
-                srcDevice.sendResponse(MessageBuilder.createResponse(request,
-                        ResponseStatus.UNAUTHORIZED));
-                break;
-            default:
-                srcDevice.sendResponse(MessageBuilder.createResponse(request,
-                        ResponseStatus.BAD_REQUEST));
-        }
-    }
-
-    @Override
-    public void onDefaultRequestReceived(Device srcDevice, IRequest request)
-            throws ServerException {
-        // verify Permission
-        StringBuffer uriQuery = new StringBuffer();
-        uriQuery.append(Constants.REQ_SEARCH_USER_ID + "="
-                + srcDevice.getUserId() + ";");
-        uriQuery.append(Constants.REQ_DEVICE_ID + "="
-                + request.getUriPathSegments().get(1) + ";");
-        uriQuery.append(
-                Constants.REQ_REQUEST_METHOD + "=" + request.getMethod() + ";");
-        uriQuery.append(Constants.REQ_REQUEST_URI + "="
-                + extractTargetUriPath(request));
-
-        IRequest verifyRequest = MessageBuilder.createRequest(RequestMethod.GET,
-                OICConstants.ACL_VERIFY_FULL_URI, uriQuery.toString());
-
-        mASServer.sendRequest(verifyRequest,
-                new AccountReceiveHandler(srcDevice, request));
-    }
-}
\ No newline at end of file
diff --git a/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/RouteResource.java b/cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/RouteResource.java
new file mode 100644 (file)
index 0000000..9ba78a8
--- /dev/null
@@ -0,0 +1,273 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2016 Samsung Electronics All Rights Reserved.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+package org.iotivity.cloud.ciserver.resources;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+import org.iotivity.cloud.base.OICConstants;
+import org.iotivity.cloud.base.connector.ConnectorPool;
+import org.iotivity.cloud.base.device.CoapDevice;
+import org.iotivity.cloud.base.device.Device;
+import org.iotivity.cloud.base.device.IRequestChannel;
+import org.iotivity.cloud.base.device.IResponseEventHandler;
+import org.iotivity.cloud.base.exception.ServerException;
+import org.iotivity.cloud.base.protocols.IRequest;
+import org.iotivity.cloud.base.protocols.IResponse;
+import org.iotivity.cloud.base.protocols.MessageBuilder;
+import org.iotivity.cloud.base.protocols.coap.CoapResponse;
+import org.iotivity.cloud.base.protocols.enums.ContentFormat;
+import org.iotivity.cloud.base.protocols.enums.RequestMethod;
+import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
+import org.iotivity.cloud.base.resource.Resource;
+import org.iotivity.cloud.ciserver.Constants;
+import org.iotivity.cloud.ciserver.DeviceServerSystem.CoapDevicePool;
+import org.iotivity.cloud.util.Cbor;
+
+/**
+ *
+ * This class provides a set of APIs to send requests about message to another
+ * device
+ *
+ */
+public class RouteResource extends Resource {
+
+    private CoapDevicePool                mDevicePool = null;
+    private IRequestChannel               mASServer   = null;
+    private Cbor<HashMap<String, Object>> mCbor       = new Cbor<>();
+
+    public RouteResource(CoapDevicePool devicePool) {
+        super(Arrays.asList(Constants.PREFIX_OIC, Constants.REQ_DEVICE_ROUTE));
+        mASServer = ConnectorPool.getConnection("account");
+        mDevicePool = devicePool;
+    }
+
+    private IRequestChannel getTargetDeviceChannel(IRequest request)
+            throws ServerException {
+
+        CoapDevice targetDevice = (CoapDevice) mDevicePool
+                .queryDevice(getDeviceId(request));
+
+        if (targetDevice == null) {
+            return null;
+        }
+
+        // Do request and receive response
+        return targetDevice.getRequestChannel();
+    }
+
+    private String extractTargetUriPath(IRequest request) {
+        List<String> uriPathSegment = request.getUriPathSegments();
+
+        // Remove prefix path
+        for (String path : getUriPathSegments()) {
+            uriPathSegment.remove(path);
+        }
+        uriPathSegment.remove(0);
+
+        StringBuilder uriPath = new StringBuilder();
+        for (String path : uriPathSegment) {
+            uriPath.append("/" + path);
+        }
+
+        return uriPath.toString();
+    }
+
+    private IResponse convertReponseUri(IResponse response, String di) {
+
+        String convertedUri = new String();
+
+        CoapResponse coapResponse = (CoapResponse) response;
+
+        StringBuilder uriPath = new StringBuilder();
+        for (String path : getUriPathSegments()) {
+            uriPath.append("/" + path);
+        }
+
+        if (coapResponse.getUriPath().isEmpty() == false) {
+            convertedUri = uriPath.toString() + "/" + di
+                    + coapResponse.getUriPath();
+        }
+
+        return MessageBuilder.modifyResponse(response, convertedUri, null,
+                null);
+    }
+
+    private String getDeviceId(IRequest request) {
+        return request.getUriPathSegments().get(getUriPathSegments().size());
+    }
+
+    /**
+     *
+     * This class provides a set of APIs to handling message contains link
+     * interface.
+     *
+     */
+    class LinkInterfaceHandler implements IResponseEventHandler {
+        private Cbor<List<HashMap<String, Object>>> mCbor      = new Cbor<>();
+        private String                              mTargetDI  = null;
+        private Device                              mSrcDevice = null;
+        private IRequest                            mRequest   = null;
+
+        public LinkInterfaceHandler(String targetDI, Device srcDevice,
+                IRequest request) {
+            mTargetDI = targetDI;
+            mSrcDevice = srcDevice;
+            mRequest = request;
+        }
+
+        private void convertHref(List<HashMap<String, Object>> linkPayload) {
+
+            StringBuilder uriPath = new StringBuilder();
+            for (String path : getUriPathSegments()) {
+                uriPath.append("/" + path);
+            }
+
+            for (HashMap<String, Object> link : linkPayload) {
+                link.put("href", uriPath.toString() + "/" + mTargetDI
+                        + link.get("href"));
+            }
+        }
+
+        @Override
+        public void onResponseReceived(IResponse response) {
+            List<HashMap<String, Object>> linkPayload = null;
+            if (response.getStatus().equals(ResponseStatus.CONTENT)) {
+                linkPayload = mCbor.parsePayloadFromCbor(response.getPayload(),
+                        ArrayList.class);
+                if (linkPayload == null) {
+                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
+                            mRequest, ResponseStatus.NOT_FOUND));
+                }
+                convertHref(linkPayload);
+            }
+            mSrcDevice.sendResponse(MessageBuilder.modifyResponse(
+                    convertReponseUri(response, mTargetDI),
+                    ContentFormat.APPLICATION_CBOR, linkPayload != null
+                            ? mCbor.encodingPayloadToCbor(linkPayload) : null));
+        }
+    }
+
+    class DefaultResponseHandler implements IResponseEventHandler {
+        private String mTargetDI  = null;
+        private Device mSrcDevice = null;
+
+        public DefaultResponseHandler(String targetDI, Device srcDevice) {
+            mTargetDI = targetDI;
+            mSrcDevice = srcDevice;
+        }
+
+        @Override
+        public void onResponseReceived(IResponse response) {
+
+            mSrcDevice.sendResponse(convertReponseUri(response, mTargetDI));
+        }
+    }
+
+    class AccountReceiveHandler implements IResponseEventHandler {
+        private IRequest mRequest   = null;
+        private Device   mSrcDevice = null;
+
+        public AccountReceiveHandler(Device srcDevice, IRequest request) {
+            mRequest = request;
+            mSrcDevice = srcDevice;
+        }
+
+        @Override
+        public void onResponseReceived(IResponse response) {
+            switch (response.getStatus()) {
+                case CONTENT:
+                    HashMap<String, Object> payloadData = mCbor
+                            .parsePayloadFromCbor(response.getPayload(),
+                                    HashMap.class);
+                    checkPayloadException(Constants.RESP_GRANT_POLICY,
+                            payloadData);
+                    String gp = (String) payloadData
+                            .get(Constants.RESP_GRANT_POLICY);
+                    verifyRequest(mSrcDevice, mRequest, gp);
+                    break;
+
+                default:
+                    mSrcDevice.sendResponse(response);
+            }
+
+        }
+    }
+
+    private void verifyRequest(Device srcDevice, IRequest request,
+            String grantPermisson) {
+        switch (grantPermisson) {
+            case Constants.RESP_ACL_DENIED:
+                srcDevice.sendResponse(MessageBuilder.createResponse(request,
+                        ResponseStatus.UNAUTHORIZED));
+                break;
+
+            case Constants.RESP_ACL_ALLOWED:
+                IRequestChannel requestChannel = getTargetDeviceChannel(
+                        request);
+
+                if (requestChannel == null) {
+                    srcDevice.sendResponse(MessageBuilder
+                            .createResponse(request, ResponseStatus.NOT_FOUND));
+                    break;
+                }
+
+                IResponseEventHandler responseHandler = new DefaultResponseHandler(
+                        getDeviceId(request), srcDevice);
+                if (request.getUriQuery() != null && request.getUriQuery()
+                        .contains(Constants.LINK_INTERFACE)) {
+                    responseHandler = new LinkInterfaceHandler(
+                            getDeviceId(request), srcDevice, request);
+                }
+
+                String uriPath = extractTargetUriPath(request);
+                IRequest requestToResource = MessageBuilder
+                        .modifyRequest(request, uriPath, null, null, null);
+
+                requestChannel.sendRequest(requestToResource, responseHandler);
+                break;
+        }
+    }
+
+    @Override
+    public void onDefaultRequestReceived(Device srcDevice, IRequest request)
+            throws ServerException {
+        // verify Permission
+        StringBuffer uriQuery = new StringBuffer();
+        uriQuery.append(Constants.REQ_SEARCH_USER_ID + "="
+                + srcDevice.getUserId() + ";");
+        uriQuery.append(
+                Constants.REQ_DEVICE_ID + "=" + getDeviceId(request) + ";");
+        uriQuery.append(
+                Constants.REQ_REQUEST_METHOD + "=" + request.getMethod() + ";");
+        uriQuery.append(Constants.REQ_REQUEST_URI + "="
+                + extractTargetUriPath(request));
+
+        IRequest verifyRequest = MessageBuilder.createRequest(RequestMethod.GET,
+                OICConstants.ACL_VERIFY_FULL_URI, uriQuery.toString());
+
+        mASServer.sendRequest(verifyRequest,
+                new AccountReceiveHandler(srcDevice, request));
+    }
+}
\ No newline at end of file
index 7fbb5c02211418d467c29d9c708fcebdc7cb899f..16494f10629bac2d59438f236a0c1cd8e00e1ec0 100644 (file)
@@ -33,7 +33,6 @@ import org.iotivity.cloud.base.protocols.IRequest;
 import org.iotivity.cloud.base.protocols.IResponse;
 import org.iotivity.cloud.base.protocols.MessageBuilder;
 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
 import org.iotivity.cloud.base.resource.Resource;
 import org.iotivity.cloud.ciserver.Constants;
 
@@ -52,33 +51,6 @@ public class Account extends Resource {
         mASServer = ConnectorPool.getConnection("account");
     }
 
-    class RDReceiveHandler implements IResponseEventHandler {
-
-        private Device    mSrcDevice;
-        private IResponse mResponse;
-        private IRequest  mRequest;
-
-        public RDReceiveHandler(IRequest request, IResponse response,
-                Device srcDevice) {
-            mSrcDevice = srcDevice;
-            mRequest = request;
-            mResponse = response;
-        }
-
-        @Override
-        public void onResponseReceived(IResponse response)
-                throws ClientException {
-            switch (response.getStatus()) {
-                case DELETED:
-                    mSrcDevice.sendResponse(mResponse);
-                    break;
-                default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
-            }
-        }
-    }
-
     class AccountReceiveHandler implements IResponseEventHandler {
 
         IRequestChannel  mRDServer = null;
@@ -102,16 +74,10 @@ public class Account extends Resource {
                     mRDServer.sendRequest(
                             MessageBuilder.createRequest(RequestMethod.DELETE,
                                     uriPath.toString(), mRequest.getUriQuery()),
-                            new RDReceiveHandler(mRequest, response,
-                                    mSrcDevice));
-                    break;
-                case CHANGED:
-                case CONTENT:
-                    mSrcDevice.sendResponse(response);
+                            mSrcDevice);
                     break;
                 default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
+                    mSrcDevice.sendResponse(response);
             }
         }
     }
index fe86968f28f475e9515cd8bf3ea210b716a28409..80d22c04d51e9d3a565fa6ab8b56d6d45f48066d 100644 (file)
@@ -80,12 +80,6 @@ public class DevicePresence extends Resource {
                             .parsePayloadFromCbor(response.getPayload(),
                                     HashMap.class);
 
-                    if (payloadData == null) {
-                        mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                                mRequest, ResponseStatus.BAD_REQUEST));
-                        return;
-                    }
-
                     ArrayList<String> devices = (ArrayList<String>) getResponseDeviceList(
                             payloadData);
 
@@ -101,12 +95,7 @@ public class DevicePresence extends Resource {
                     } else {
                         String additionalQuery = makeAdditionalQuery(
                                 payloadData, mSrcDevice.getDeviceId());
-                        if (additionalQuery == null) {
-                            mSrcDevice.sendResponse(
-                                    MessageBuilder.createResponse(mRequest,
-                                            ResponseStatus.BAD_REQUEST));
-                            return;
-                        }
+
                         String uriQuery = additionalQuery.toString()
                                 + (mRequest.getUriQuery() != null
                                         ? (";" + mRequest.getUriQuery()) : "");
@@ -116,9 +105,9 @@ public class DevicePresence extends Resource {
 
                     mRDServer.sendRequest(mRequest, mSrcDevice);
                     break;
+
                 default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
+                    mSrcDevice.sendResponse(response);
             }
         }
 
index 1be0ebf6283e047115d9798dddc99c40e3866446..b71df9e7297cd8425e401403b8f2d7aa9926d689 100644 (file)
@@ -37,7 +37,6 @@ import org.iotivity.cloud.base.protocols.IResponse;
 import org.iotivity.cloud.base.protocols.MessageBuilder;
 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
 import org.iotivity.cloud.base.resource.Resource;
 import org.iotivity.cloud.ciserver.Constants;
 import org.iotivity.cloud.util.Cbor;
@@ -95,6 +94,7 @@ public class ResourceDirectory extends Resource {
             case DELETE:
                 mRDServer.sendRequest(request, srcDevice);
                 break;
+
             default:
                 throw new BadRequestException(
                         request.getMethod() + " request type is not support");
@@ -116,16 +116,9 @@ public class ResourceDirectory extends Resource {
 
             switch (response.getStatus()) {
                 case CHANGED:
-
                     byte[] convertedPayload = convertPublishHref(mRequest,
                             mSrcDevice);
 
-                    if (convertedPayload == null) {
-
-                        mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                                mRequest, ResponseStatus.PRECONDITION_FAILED));
-                    }
-
                     mRequest = MessageBuilder.modifyRequest(mRequest, null,
                             null, ContentFormat.APPLICATION_CBOR,
                             convertedPayload);
@@ -135,8 +128,7 @@ public class ResourceDirectory extends Resource {
                     break;
 
                 default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
+                    mSrcDevice.sendResponse(response);
             }
         }
 
@@ -147,18 +139,14 @@ public class ResourceDirectory extends Resource {
             HashMap<String, Object> payload = cbor
                     .parsePayloadFromCbor(request.getPayload(), HashMap.class);
 
-            if (verifyPublishPayload(payload) == false) {
-
-                return null;
-            }
-
             ArrayList<HashMap<String, Object>> links = (ArrayList<HashMap<String, Object>>) payload
                     .get(Constants.REQ_LINKS);
 
             for (HashMap<String, Object> link : links) {
 
                 String href = (String) link.get(Constants.REQ_HREF);
-                href = "/di/" + device.getDeviceId() + href;
+                href = Constants.ROUTE_FULL_URI + "/" + device.getDeviceId()
+                        + href;
 
                 link.put(Constants.REQ_HREF, href);
             }
@@ -167,28 +155,6 @@ public class ResourceDirectory extends Resource {
 
             return cbor.encodingPayloadToCbor(payload);
         }
-
-        @SuppressWarnings("unchecked")
-        private boolean verifyPublishPayload(HashMap<String, Object> payload) {
-
-            ArrayList<HashMap<String, Object>> links = (ArrayList<HashMap<String, Object>>) payload
-                    .get(Constants.REQ_LINKS);
-
-            if (links == null || links.isEmpty()) {
-                return false;
-            }
-
-            for (HashMap<String, Object> link : links) {
-
-                String href = (String) link.get(Constants.REQ_HREF);
-
-                if (href == null || href.isEmpty()) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
     }
 
     // handles response to convert href in response payload into original href
@@ -207,13 +173,11 @@ public class ResourceDirectory extends Resource {
 
             switch (response.getStatus()) {
                 case CHANGED:
-
                     response = MessageBuilder.modifyResponse(response,
                             ContentFormat.APPLICATION_CBOR,
                             convertResponseHref(response));
 
                 default:
-
                     mSrcDevice.sendResponse(response);
             }
         }
@@ -235,9 +199,14 @@ public class ResourceDirectory extends Resource {
                 // remove prefix
                 ArrayList<String> hrefSegments = new ArrayList<>(
                         Arrays.asList(href.split("/")));
-                for (int i = 0; i < 3; i++) {
-                    hrefSegments.remove(0);
+
+                ArrayList<String> RouteResourceSegment = new ArrayList<>(
+                        Arrays.asList(Constants.ROUTE_FULL_URI.split("/")));
+
+                for (String path : RouteResourceSegment) {
+                    hrefSegments.remove(path);
                 }
+                hrefSegments.remove(0);
 
                 StringBuilder newHref = new StringBuilder();
                 for (String path : hrefSegments) {
index 55da35eaa851e3e6e2a157c04dc4bbf7f4c71df7..e13382af74cdf64528637a394df4f2f4f28e4b8c 100644 (file)
@@ -36,7 +36,6 @@ import org.iotivity.cloud.base.protocols.IRequest;
 import org.iotivity.cloud.base.protocols.IResponse;
 import org.iotivity.cloud.base.protocols.MessageBuilder;
 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
 import org.iotivity.cloud.base.resource.Resource;
 import org.iotivity.cloud.ciserver.Constants;
 import org.iotivity.cloud.util.Cbor;
@@ -80,39 +79,23 @@ public class ResourceFind extends Resource {
                             .parsePayloadFromCbor(response.getPayload(),
                                     HashMap.class);
 
-                    if (payloadData == null) {
-                        mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                                mRequest, ResponseStatus.BAD_REQUEST));
-                        return;
-                    }
-
                     ArrayList<String> devices = (ArrayList<String>) getResponseDeviceList(
                             payloadData);
 
-                    if (mRequest.getUriQuery() != null
-                            && mRequest.getUriQueryMap()
-                                    .containsKey(Constants.REQ_DEVICE_ID)) {
-                        if (!devices.containsAll(mRequest.getUriQueryMap()
-                                .get(Constants.REQ_DEVICE_ID))) {
-                            mSrcDevice.sendResponse(
-                                    MessageBuilder.createResponse(mRequest,
-                                            ResponseStatus.BAD_REQUEST));
-                        }
-                    } else {
-                        StringBuilder additionalQuery = makeAdditionalQuery(
-                                devices);
-                        String uriQuery = (additionalQuery != null
-                                ? additionalQuery.toString() : "")
-                                + (mRequest.getUriQuery() != null
-                                        ? (";" + mRequest.getUriQuery()) : "");
-                        mRequest = MessageBuilder.modifyRequest(mRequest, null,
-                                uriQuery, null, null);
-                    }
+                    StringBuilder additionalQuery = makeAdditionalQuery(
+                            devices);
+                    String uriQuery = (additionalQuery != null
+                            ? additionalQuery.toString() : "")
+                            + (mRequest.getUriQuery() != null
+                                    ? (";" + mRequest.getUriQuery()) : "");
+                    mRequest = MessageBuilder.modifyRequest(mRequest, null,
+                            uriQuery, null, null);
+
                     mRDServer.sendRequest(mRequest, mSrcDevice);
                     break;
+
                 default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
+                    mSrcDevice.sendResponse(response);
             }
         }
 
@@ -158,6 +141,7 @@ public class ResourceFind extends Resource {
                 .containsKey(Constants.REQ_DEVICE_ID)) {
 
             mRDServer.sendRequest(request, srcDevice);
+
         } else {
             StringBuffer additionalQuery = new StringBuffer();
             additionalQuery
index 59c298164b3893e210ed453ace34119e29e4705d..a8aa8807f59751fe4d996406907b06d2a55e6fa9 100644 (file)
@@ -35,7 +35,6 @@ import org.iotivity.cloud.base.protocols.IRequest;
 import org.iotivity.cloud.base.protocols.IResponse;
 import org.iotivity.cloud.base.protocols.MessageBuilder;
 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
 import org.iotivity.cloud.base.resource.Resource;
 import org.iotivity.cloud.ciserver.Constants;
 import org.iotivity.cloud.util.Cbor;
@@ -78,43 +77,20 @@ public class ResourcePresence extends Resource {
                             .parsePayloadFromCbor(response.getPayload(),
                                     HashMap.class);
 
-                    if (payloadData == null) {
-                        mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                                mRequest, ResponseStatus.BAD_REQUEST));
-                        return;
-                    }
-
-                    if (mRequest.getUriQuery() != null
-                            && mRequest.getUriQueryMap()
-                                    .containsKey(Constants.REQ_DEVICE_ID)) {
-                        if (!getResponseDeviceList(payloadData)
-                                .containsAll(mRequest.getUriQueryMap()
-                                        .get(Constants.REQ_DEVICE_ID))) {
-                            mSrcDevice.sendResponse(
-                                    MessageBuilder.createResponse(mRequest,
-                                            ResponseStatus.BAD_REQUEST));
-                        }
-                    } else {
-                        String additionalQuery = makeAdditionalQuery(
-                                payloadData, mSrcDevice.getDeviceId());
-                        if (additionalQuery == null) {
-                            mSrcDevice.sendResponse(
-                                    MessageBuilder.createResponse(mRequest,
-                                            ResponseStatus.BAD_REQUEST));
-                            return;
-                        }
-                        String uriQuery = additionalQuery.toString()
-                                + (mRequest.getUriQuery() != null
-                                        ? (";" + mRequest.getUriQuery()) : "");
-                        mRequest = MessageBuilder.modifyRequest(mRequest, null,
-                                uriQuery, null, null);
-                    }
+                    String additionalQuery = makeAdditionalQuery(payloadData,
+                            mSrcDevice.getDeviceId());
+
+                    String uriQuery = additionalQuery.toString()
+                            + (mRequest.getUriQuery() != null
+                                    ? (";" + mRequest.getUriQuery()) : "");
+                    mRequest = MessageBuilder.modifyRequest(mRequest, null,
+                            uriQuery, null, null);
 
                     mRDServer.sendRequest(mRequest, mSrcDevice);
                     break;
+
                 default:
-                    mSrcDevice.sendResponse(MessageBuilder.createResponse(
-                            mRequest, ResponseStatus.BAD_REQUEST));
+                    mSrcDevice.sendResponse(response);
             }
         }
 
diff --git a/cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/DiResourceTest.java b/cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/DiResourceTest.java
deleted file mode 100644 (file)
index cb495a3..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * //******************************************************************
- * //
- * // Copyright 2016 Samsung Electronics All Rights Reserved.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- * //
- * // Licensed under the Apache License, Version 2.0 (the "License");
- * // you may not use this file except in compliance with the License.
- * // You may obtain a copy of the License at
- * //
- * //      http://www.apache.org/licenses/LICENSE-2.0
- * //
- * // Unless required by applicable law or agreed to in writing, software
- * // distributed under the License is distributed on an "AS IS" BASIS,
- * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * // See the License for the specific language governing permissions and
- * // limitations under the License.
- * //
- * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- */
-
-package org.iotivity.cloud.ciserver.resources;
-
-import static java.util.concurrent.TimeUnit.SECONDS;
-import static org.junit.Assert.assertEquals;
-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.device.IRequestChannel;
-import org.iotivity.cloud.base.protocols.IRequest;
-import org.iotivity.cloud.base.protocols.IResponse;
-import org.iotivity.cloud.base.protocols.MessageBuilder;
-import org.iotivity.cloud.base.protocols.coap.CoapRequest;
-import org.iotivity.cloud.base.protocols.coap.CoapResponse;
-import org.iotivity.cloud.base.protocols.enums.ContentFormat;
-import org.iotivity.cloud.base.protocols.enums.RequestMethod;
-import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
-import org.iotivity.cloud.ciserver.Constants;
-import org.iotivity.cloud.ciserver.DeviceServerSystem;
-import org.iotivity.cloud.ciserver.DeviceServerSystem.CoapDevicePool;
-import org.iotivity.cloud.ciserver.resources.DiResource.AccountReceiveHandler;
-import org.iotivity.cloud.ciserver.resources.DiResource.DefaultResponseHandler;
-import org.iotivity.cloud.ciserver.resources.DiResource.LinkInterfaceHandler;
-import org.iotivity.cloud.util.Cbor;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-public class DiResourceTest {
-    private static final String           RELAY_URI                          = "/di";
-    private static final String           RESOURCE_URI                       = "/a/light/0";
-    private static final String           VERIFY_URI                         = "/oic/acl/verify";
-    private String                        mDiServer                          = "resourceServerId";
-    private CoapDevice                    mSourceDevice                      = mock(
-            CoapDevice.class);
-    private CoapDevice                    mTargetDevice                      = mock(
-            CoapDevice.class);
-    private IResponse                     mRes                               = null;
-    private IRequest                      mReq                               = null;
-    private DeviceServerSystem            mDeviceServerSystem                = new DeviceServerSystem();
-    private final CountDownLatch          mLatch                             = new CountDownLatch(
-            1);
-    private Cbor<HashMap<String, Object>> mCbor                              = new Cbor<>();
-    private IRequestChannel               mTargetChannel                     = mock(
-            IRequestChannel.class);
-
-    @Mock(name = "mASServer")
-    IRequestChannel                       mRequestChannelASServer;
-
-    @Mock
-    CoapDevicePool                        coapDevicePool;
-
-    @Mock
-    IRequestChannel                       requestChannel;
-
-    @InjectMocks
-    DiResource                            diHandler                          = new DiResource(
-            coapDevicePool);
-
-    @InjectMocks
-    LinkInterfaceHandler                  linkInterfaceHandler               = diHandler.new LinkInterfaceHandler(
-            "targetDeviceId", mSourceDevice);
-
-    @InjectMocks
-    DefaultResponseHandler                defaultResponseHandler             = diHandler.new DefaultResponseHandler(
-            "targetDeviceId", mSourceDevice);
-
-    IRequest                              requestDefault                     = makePutRequest();
-    IRequest                              requestLinkInterface               = makePutLinkInterfaceRequest();
-
-    @InjectMocks
-    AccountReceiveHandler                 accountDefaultReceiveHandler       = diHandler.new AccountReceiveHandler(
-            mSourceDevice, requestDefault);
-
-    @InjectMocks
-    AccountReceiveHandler                 accountLinkInterfaceReceiveHandler = diHandler.new AccountReceiveHandler(
-            mSourceDevice, requestLinkInterface);
-
-    @Before
-    public void setUp() throws Exception {
-        mRes = null;
-        mReq = null;
-        Mockito.doReturn("sourceDeviceId").when(mSourceDevice).getDeviceId();
-        Mockito.doReturn("targetDeviceId").when(mTargetDevice).getDeviceId();
-        MockitoAnnotations.initMocks(this);
-        mDeviceServerSystem.addResource(diHandler);
-        Mockito.doReturn(mTargetDevice).when(coapDevicePool)
-                .queryDevice(Mockito.anyString());
-        Mockito.doReturn(mTargetChannel).when(mTargetDevice)
-                .getRequestChannel();
-
-        // callback mock
-        Mockito.doAnswer(new Answer<Object>() {
-            @Override
-            public CoapResponse answer(InvocationOnMock invocation)
-                    throws Throwable {
-                Object[] args = invocation.getArguments();
-                CoapResponse resp = (CoapResponse) args[0];
-                mRes = resp;
-                mLatch.countDown();
-                return null;
-            }
-        }).when(mSourceDevice).sendResponse(Mockito.anyObject());
-        Mockito.doAnswer(new Answer<Object>() {
-            @Override
-            public CoapRequest answer(InvocationOnMock invocation)
-                    throws Throwable {
-                Object[] args = invocation.getArguments();
-                CoapRequest request = (CoapRequest) args[0];
-                System.out.println(
-                        "\t----------payload : " + request.getPayloadString());
-                System.out.println(
-                        "\t----------uripath : " + request.getUriPath());
-                System.out.println(
-                        "\t---------uriquery : " + request.getUriQuery());
-                mReq = request;
-                mLatch.countDown();
-                return null;
-            }
-        }).when(mTargetChannel).sendRequest(Mockito.any(IRequest.class),
-                Mockito.any(CoapDevice.class));
-        Mockito.doAnswer(new Answer<Object>() {
-            @Override
-            public CoapRequest answer(InvocationOnMock invocation)
-                    throws Throwable {
-                Object[] args = invocation.getArguments();
-                CoapRequest request = (CoapRequest) args[0];
-                System.out.println(
-                        "\t----------payload : " + request.getPayloadString());
-                System.out.println(
-                        "\t----------uripath : " + request.getUriPath());
-                System.out.println(
-                        "\t---------uriquery : " + request.getUriQuery());
-                mReq = request;
-                mLatch.countDown();
-                return null;
-            }
-        }).when(mRequestChannelASServer).sendRequest(
-                Mockito.any(IRequest.class), Mockito.any(CoapDevice.class));
-    }
-
-    @Test
-    public void testOnDefaultRequestReceived() throws InterruptedException {
-        IRequest request = makePutRequest();
-        diHandler.onDefaultRequestReceived(mSourceDevice, request);
-        assertTrue(mReq.getMethod().equals(RequestMethod.GET));
-        assertTrue(mReq.getUriPath().equals(VERIFY_URI));
-        assertTrue(mLatch.await(1L, SECONDS));
-    }
-
-    @Test
-    public void testOnDefaultResponseHandleronResponseReceived()
-            throws InterruptedException {
-        IResponse response = makeContentResponse();
-        defaultResponseHandler.onResponseReceived(response);
-        assertEquals(mRes, response);
-        assertTrue(mLatch.await(1L, SECONDS));
-    }
-
-    @Test
-    public void testOnAccountReceiveHandlerDeniedonResponseReceived()
-            throws InterruptedException {
-        IResponse response = makeVerifyDeniedContentResponse();
-        accountDefaultReceiveHandler.onResponseReceived(response);
-    }
-
-    @Test
-    public void testOnAccountReceiveHandlerDefaultonResponseReceived()
-            throws InterruptedException {
-        IResponse response = makeVerifyAllowedContentResponse();
-        accountDefaultReceiveHandler.onResponseReceived(response);
-        assertEquals(mReq, requestDefault);
-        assertTrue(mLatch.await(1L, SECONDS));
-    }
-
-    @Test
-    public void testOnLinkInterfaceResponseHandleronResponseReceived()
-            throws InterruptedException {
-        IResponse response = makeVerifyAllowedContentResponse();
-        accountLinkInterfaceReceiveHandler.onResponseReceived(response);
-        assertEquals(mReq, requestLinkInterface);
-        assertTrue(mLatch.await(1L, SECONDS));
-    }
-
-    @Test
-    public void testOnAccountReceiveHandlerLinkInterfaceonResponseReceived()
-            throws InterruptedException {
-        IResponse response = makeContentLinkResponse();
-        linkInterfaceHandler.onResponseReceived(response);
-        assertEquals(mRes, response);
-        assertTrue(mLatch.await(1L, SECONDS));
-    }
-
-    private IRequest makePutRequest() {
-        HashMap<String, Object> payloadData = new HashMap<>();
-        payloadData.put("state", true);
-        payloadData.put("power", 6);
-        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
-                RELAY_URI + "/" + mDiServer + RESOURCE_URI, null,
-                ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(payloadData));
-        return request;
-    }
-
-    private IRequest makePutLinkInterfaceRequest() {
-        HashMap<String, Object> payloadData = new HashMap<>();
-        payloadData.put("state", true);
-        payloadData.put("power", 6);
-        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
-                RELAY_URI + "/" + mDiServer + RESOURCE_URI,
-                Constants.RS_INTERFACE + "=" + Constants.LINK_INTERFACE,
-                ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(payloadData));
-        return request;
-    }
-
-    private IResponse makeContentResponse() {
-
-        HashMap<String, Object> payloadData = new HashMap<>();
-        payloadData.put("state", true);
-        payloadData.put("power", 6);
-        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
-                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(payloadData));
-        return response;
-    }
-
-    private IResponse makeVerifyAllowedContentResponse() {
-
-        HashMap<String, Object> payloadData = new HashMap<>();
-        payloadData.put("gp", "Allowed");
-        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
-                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(payloadData));
-        return response;
-    }
-
-    private IResponse makeVerifyDeniedContentResponse() {
-
-        HashMap<String, Object> payloadData = new HashMap<>();
-        payloadData.put("gp", "Denied");
-        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
-                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(payloadData));
-        return response;
-    }
-
-    private IResponse makeContentLinkResponse() {
-        HashMap<String, Object> payloadData = new HashMap<>();
-        ArrayList<HashMap<String, Object>> linkPayload = new ArrayList<>();
-
-        payloadData.put("href", "hrefsample1");
-        linkPayload.add(payloadData);
-        linkPayload.add(payloadData);
-        linkPayload.add(payloadData);
-
-        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
-                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
-                mCbor.encodingPayloadToCbor(linkPayload));
-        return response;
-    }
-
-    private IRequest makeGetRequest() {
-        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
-                RELAY_URI + "/" + mDiServer + RESOURCE_URI, null);
-        return request;
-    }
-
-}
diff --git a/cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/RouteResourceTest.java b/cloud/interface/src/test/java/org/iotivity/cloud/ciserver/resources/RouteResourceTest.java
new file mode 100644 (file)
index 0000000..63c715c
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2016 Samsung Electronics All Rights Reserved.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+
+package org.iotivity.cloud.ciserver.resources;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.junit.Assert.assertEquals;
+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.device.IRequestChannel;
+import org.iotivity.cloud.base.protocols.IRequest;
+import org.iotivity.cloud.base.protocols.IResponse;
+import org.iotivity.cloud.base.protocols.MessageBuilder;
+import org.iotivity.cloud.base.protocols.coap.CoapRequest;
+import org.iotivity.cloud.base.protocols.coap.CoapResponse;
+import org.iotivity.cloud.base.protocols.enums.ContentFormat;
+import org.iotivity.cloud.base.protocols.enums.RequestMethod;
+import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
+import org.iotivity.cloud.ciserver.Constants;
+import org.iotivity.cloud.ciserver.DeviceServerSystem;
+import org.iotivity.cloud.ciserver.DeviceServerSystem.CoapDevicePool;
+import org.iotivity.cloud.ciserver.resources.RouteResource.AccountReceiveHandler;
+import org.iotivity.cloud.ciserver.resources.RouteResource.DefaultResponseHandler;
+import org.iotivity.cloud.ciserver.resources.RouteResource.LinkInterfaceHandler;
+import org.iotivity.cloud.util.Cbor;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class RouteResourceTest {
+    private static final String           RELAY_URI                          = "/di";
+    private static final String           RESOURCE_URI                       = "/a/light/0";
+    private static final String           VERIFY_URI                         = "/oic/acl/verify";
+    private String                        mDiServer                          = "resourceServerId";
+    private CoapDevice                    mSourceDevice                      = mock(
+            CoapDevice.class);
+    private CoapDevice                    mTargetDevice                      = mock(
+            CoapDevice.class);
+    private IResponse                     mRes                               = null;
+    private IRequest                      mReq                               = null;
+    private DeviceServerSystem            mDeviceServerSystem                = new DeviceServerSystem();
+    private final CountDownLatch          mLatch                             = new CountDownLatch(
+            1);
+    private Cbor<HashMap<String, Object>> mCbor                              = new Cbor<>();
+    private IRequestChannel               mTargetChannel                     = mock(
+            IRequestChannel.class);
+
+    @Mock(name = "mASServer")
+    IRequestChannel                       mRequestChannelASServer;
+
+    @Mock
+    CoapDevicePool                        coapDevicePool;
+
+    @Mock
+    IRequestChannel                       requestChannel;
+
+    @InjectMocks
+    RouteResource                            diHandler                          = new RouteResource(
+            coapDevicePool);
+
+    IRequest                              requestDefault                     = makePutRequest();
+    IRequest                              requestLinkInterface               = makePutLinkInterfaceRequest();
+
+    @InjectMocks
+    LinkInterfaceHandler                  linkInterfaceHandler               = diHandler.new LinkInterfaceHandler(
+            "targetDeviceId", mSourceDevice, requestLinkInterface);
+
+    @InjectMocks
+    DefaultResponseHandler                defaultResponseHandler             = diHandler.new DefaultResponseHandler(
+            "targetDeviceId", mSourceDevice);
+
+    @InjectMocks
+    AccountReceiveHandler                 accountDefaultReceiveHandler       = diHandler.new AccountReceiveHandler(
+            mSourceDevice, requestDefault);
+
+    @InjectMocks
+    AccountReceiveHandler                 accountLinkInterfaceReceiveHandler = diHandler.new AccountReceiveHandler(
+            mSourceDevice, requestLinkInterface);
+
+    @Before
+    public void setUp() throws Exception {
+        mRes = null;
+        mReq = null;
+        Mockito.doReturn("sourceDeviceId").when(mSourceDevice).getDeviceId();
+        Mockito.doReturn("targetDeviceId").when(mTargetDevice).getDeviceId();
+        MockitoAnnotations.initMocks(this);
+        mDeviceServerSystem.addResource(diHandler);
+        Mockito.doReturn(mTargetDevice).when(coapDevicePool)
+                .queryDevice(Mockito.anyString());
+        Mockito.doReturn(mTargetChannel).when(mTargetDevice)
+                .getRequestChannel();
+
+        // callback mock
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                mRes = resp;
+                mLatch.countDown();
+                return null;
+            }
+        }).when(mSourceDevice).sendResponse(Mockito.anyObject());
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapRequest answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapRequest request = (CoapRequest) args[0];
+                System.out.println(
+                        "\t----------payload : " + request.getPayloadString());
+                System.out.println(
+                        "\t----------uripath : " + request.getUriPath());
+                System.out.println(
+                        "\t---------uriquery : " + request.getUriQuery());
+                mReq = request;
+                mLatch.countDown();
+                return null;
+            }
+        }).when(mTargetChannel).sendRequest(Mockito.any(IRequest.class),
+                Mockito.any(CoapDevice.class));
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapRequest answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapRequest request = (CoapRequest) args[0];
+                System.out.println(
+                        "\t----------payload : " + request.getPayloadString());
+                System.out.println(
+                        "\t----------uripath : " + request.getUriPath());
+                System.out.println(
+                        "\t---------uriquery : " + request.getUriQuery());
+                mReq = request;
+                mLatch.countDown();
+                return null;
+            }
+        }).when(mRequestChannelASServer).sendRequest(
+                Mockito.any(IRequest.class), Mockito.any(CoapDevice.class));
+    }
+
+    @Test
+    public void testOnDefaultRequestReceived() throws InterruptedException {
+        IRequest request = makePutRequest();
+        diHandler.onDefaultRequestReceived(mSourceDevice, request);
+        assertTrue(mReq.getMethod().equals(RequestMethod.GET));
+        assertTrue(mReq.getUriPath().equals(VERIFY_URI));
+        assertTrue(mLatch.await(1L, SECONDS));
+    }
+
+    @Test
+    public void testOnDefaultResponseHandleronResponseReceived()
+            throws InterruptedException {
+        IResponse response = makeContentResponse();
+        defaultResponseHandler.onResponseReceived(response);
+        assertEquals(mRes, response);
+        assertTrue(mLatch.await(1L, SECONDS));
+    }
+
+    @Test
+    public void testOnAccountReceiveHandlerDeniedonResponseReceived()
+            throws InterruptedException {
+        IResponse response = makeVerifyDeniedContentResponse();
+        accountDefaultReceiveHandler.onResponseReceived(response);
+    }
+
+    @Test
+    public void testOnAccountReceiveHandlerDefaultonResponseReceived()
+            throws InterruptedException {
+        IResponse response = makeVerifyAllowedContentResponse();
+        accountDefaultReceiveHandler.onResponseReceived(response);
+        assertEquals(mReq, requestDefault);
+        assertTrue(mLatch.await(1L, SECONDS));
+    }
+
+    @Test
+    public void testOnLinkInterfaceResponseHandleronResponseReceived()
+            throws InterruptedException {
+        IResponse response = makeVerifyAllowedContentResponse();
+        accountLinkInterfaceReceiveHandler.onResponseReceived(response);
+        assertEquals(mReq, requestLinkInterface);
+        assertTrue(mLatch.await(1L, SECONDS));
+    }
+
+    @Test
+    public void testOnAccountReceiveHandlerLinkInterfaceonResponseReceived()
+            throws InterruptedException {
+        IResponse response = makeContentLinkResponse();
+        linkInterfaceHandler.onResponseReceived(response);
+        assertEquals(mRes, response);
+        assertTrue(mLatch.await(1L, SECONDS));
+    }
+
+    private IRequest makePutRequest() {
+        HashMap<String, Object> payloadData = new HashMap<>();
+        payloadData.put("state", true);
+        payloadData.put("power", 6);
+        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
+                RELAY_URI + "/" + mDiServer + RESOURCE_URI, null,
+                ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    private IRequest makePutLinkInterfaceRequest() {
+        HashMap<String, Object> payloadData = new HashMap<>();
+        payloadData.put("state", true);
+        payloadData.put("power", 6);
+        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
+                RELAY_URI + "/" + mDiServer + RESOURCE_URI,
+                Constants.RS_INTERFACE + "=" + Constants.LINK_INTERFACE,
+                ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    private IResponse makeContentResponse() {
+
+        HashMap<String, Object> payloadData = new HashMap<>();
+        payloadData.put("state", true);
+        payloadData.put("power", 6);
+        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
+                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(payloadData));
+        return response;
+    }
+
+    private IResponse makeVerifyAllowedContentResponse() {
+
+        HashMap<String, Object> payloadData = new HashMap<>();
+        payloadData.put("gp", "Allowed");
+        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
+                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(payloadData));
+        return response;
+    }
+
+    private IResponse makeVerifyDeniedContentResponse() {
+
+        HashMap<String, Object> payloadData = new HashMap<>();
+        payloadData.put("gp", "Denied");
+        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
+                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(payloadData));
+        return response;
+    }
+
+    private IResponse makeContentLinkResponse() {
+        HashMap<String, Object> payloadData = new HashMap<>();
+        ArrayList<HashMap<String, Object>> linkPayload = new ArrayList<>();
+
+        payloadData.put("href", "hrefsample1");
+        linkPayload.add(payloadData);
+        linkPayload.add(payloadData);
+        linkPayload.add(payloadData);
+
+        IResponse response = MessageBuilder.createResponse(makeGetRequest(),
+                ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
+                mCbor.encodingPayloadToCbor(linkPayload));
+        return response;
+    }
+
+    private IRequest makeGetRequest() {
+        IRequest request = MessageBuilder.createRequest(RequestMethod.PUT,
+                RELAY_URI + "/" + mDiServer + RESOURCE_URI, null);
+        return request;
+    }
+
+}
index 6d46ff04bd19ca2b6e10f05ce35c4499101d93cd..763891fc66b7204b78d006762e26b441cee01b70 100644 (file)
@@ -55,9 +55,7 @@ import org.mockito.stubbing.Answer;
 
 public class ResourceDirectoryTest {
     private static final String TEST_RD_URI         = Constants.RD_FULL_URI;
-    public static final String  DEVICE_PRS_REQ_URI  = Constants.DEVICE_PRESENCE_FULL_URI;
     public static final String  DEVICE_LIST_KEY     = "devices";
-    public static final String  RES_PRS_URI         = Constants.RESOURCE_PRESENCE_FULL_URI;
 
     private String              mDi                 = "B371C481-38E6-4D47-8320-7688D8A5B58C";
     String                      mUserId             = "testuser";
@@ -153,8 +151,8 @@ public class ResourceDirectoryTest {
                 rdPublishRequest, mMockDevice);
 
         IRequest request = makeResourcePublishRequest();
-        accountReceiveHandler.onResponseReceived(MessageBuilder.createResponse(
-                request, ResponseStatus.CHANGED));
+        accountReceiveHandler.onResponseReceived(
+                MessageBuilder.createResponse(request, ResponseStatus.CHANGED));
 
         assertEquals(mReqRDServer, rdPublishRequest);
         assertTrue(mLatch.await(1L, SECONDS));
@@ -167,11 +165,11 @@ public class ResourceDirectoryTest {
                 rdPublishRequest, mMockDevice);
 
         IRequest request = makeResourcePublishRequest();
-        accountReceiveHandler.onResponseReceived(MessageBuilder.createResponse(
-                request, ResponseStatus.CHANGED));
+        accountReceiveHandler.onResponseReceived(
+                MessageBuilder.createResponse(request, ResponseStatus.CHANGED));
 
         assertEquals(getHrefInTestPublishPayload(mReqRDServer.getPayload()),
-                "/di/" + mDi + "/a/light");
+                "/oic/route/" + mDi + "/a/light");
     }
 
     @Test
@@ -233,7 +231,7 @@ public class ResourceDirectoryTest {
         payload.put(Constants.DEVICE_ID, mDi);
         ArrayList<HashMap<Object, Object>> publishLinks = new ArrayList<>();
         HashMap<Object, Object> link = new HashMap<>();
-        link.put("href", "/di/" + mDi + "/a/light");
+        link.put("href", "/oic/route/" + mDi + "/a/light");
         ArrayList<String> rt = new ArrayList<String>();
         rt.add("core.light");
         ArrayList<String> itf = new ArrayList<String>();
@@ -262,8 +260,8 @@ public class ResourceDirectoryTest {
     private String getHrefInTestPublishPayload(byte[] payload) {
 
         Cbor<HashMap<String, Object>> cbor = new Cbor<>();
-        HashMap<String, Object> parsedPayload = cbor.parsePayloadFromCbor(
-                payload, HashMap.class);
+        HashMap<String, Object> parsedPayload = cbor
+                .parsePayloadFromCbor(payload, HashMap.class);
 
         @SuppressWarnings("unchecked")
         ArrayList<HashMap<String, Object>> links = (ArrayList<HashMap<String, Object>>) parsedPayload
index 9173cdc94ee6b66559992941123ffb633e74ce87..26a5efb536d2347f5d2acc993e339c9e7ccf6bff 100644 (file)
@@ -24,7 +24,6 @@ package org.iotivity.cloud.ciserver.resources.proxy.rd;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
@@ -150,8 +149,6 @@ public class ResourceFindTest {
         assertTrue(mReq.getMethod() == RequestMethod.GET);
         assertTrue(queryMap.get("rt").contains("core.light"));
         assertTrue(queryMap.get("di").contains("device1"));
-        assertFalse(queryMap.get("di").contains("device2"));
-        assertFalse(queryMap.get("di").contains("device3"));
     }
 
     // @InjectMocks for testEntireDeviceonResponseReceived
index e20177d0cd7541f52cfa9def3947afd68dfb421b..24df58a70efbd6562a900361c79bc4b2022c4cbd 100755 (executable)
@@ -56,6 +56,8 @@ public class OICConstants {
 
     public static final String ID_URI                        = "id";
 
+    public static final String ROUTE_URI                     = "route";
+
     public static final String INVITE_URI                    = "invite";
 
     public static final String SEARCH_URI                    = "search";
@@ -122,6 +124,9 @@ public class OICConstants {
     public static final String KEEP_ALIVE_FULL_URI           = "/" + PREFIX_OIC
             + "/" + OICConstants.KEEP_ALIVE_URI;
 
+    public static final String ROUTE_FULL_URI                = "/" + PREFIX_OIC
+            + "/" + OICConstants.ROUTE_URI;
+
     public static final String MQ_BROKER_FULL_URI            = "/"
             + OICConstants.PREFIX_OIC + "/" + OICConstants.MQ_BROKER_URI;
 
index d98b53165a112edac6da416fe64ba8413a17ef90..818914db8ee6fddec518904613c31e9755379660 100644 (file)
@@ -42,12 +42,14 @@ public class CoapClient implements IRequestChannel, IResponseEventHandler {
 
     private class RequestInfo {
         private byte[]                originToken     = null;
+        private IRequest              originRequest   = null;
         private IResponseEventHandler responseHandler = null;
         private Observe               observe         = Observe.NOTHING;
 
-        public RequestInfo(byte[] originToken,
+        public RequestInfo(byte[] originToken, IRequest originRequest,
                 IResponseEventHandler responseHandler, Observe observe) {
             this.originToken = originToken;
+            this.originRequest = originRequest;
             this.responseHandler = responseHandler;
             this.observe = observe;
         }
@@ -104,7 +106,7 @@ public class CoapClient implements IRequestChannel, IResponseEventHandler {
 
             coapRequest.setToken(Bytes.longTo8Bytes(newToken));
             mTokenExchanger.put(newToken,
-                    new RequestInfo(token, responseEvent, observe));
+                    new RequestInfo(token, request, responseEvent, observe));
 
             mChannel.writeAndFlush(request);
 
@@ -130,9 +132,10 @@ public class CoapClient implements IRequestChannel, IResponseEventHandler {
                     + Bytes.bytesToLong(coapResponse.getToken()));
         }
 
+        ((CoapRequest) reqInfo.originRequest).setToken(reqInfo.originToken);
+
         // Subscription response should stored
-        if (reqInfo.observe != Observe.SUBSCRIBE
-                || coapResponse.getSequenceNumber() == -1) {
+        if (reqInfo.observe != Observe.SUBSCRIBE) {
             mTokenExchanger.remove(Bytes.bytesToLong(coapResponse.getToken()));
             if (mSubscription
                     .containsKey(Bytes.bytesToLong(reqInfo.originToken))) {
@@ -140,16 +143,18 @@ public class CoapClient implements IRequestChannel, IResponseEventHandler {
             }
         }
 
-        coapResponse.setToken(reqInfo.originToken);
-        reqInfo.responseHandler.onResponseReceived(coapResponse);
+        if (reqInfo.responseHandler != null) {
+            coapResponse.setToken(reqInfo.originToken);
+            reqInfo.responseHandler.onResponseReceived(coapResponse);
+        }
     }
 
-    private void addObserve(long token, long newtoken) {
+    public void addObserve(long token, long newtoken) {
 
         mSubscription.put(token, newtoken);
     }
 
-    private Long removeObserve(long token) {
+    public Long removeObserve(long token) {
 
         Long getToken = mSubscription.remove(token);
         return getToken;
index 7ab584e5841b96e203430c0554241a61406421fe..05535d5ae2e936d61f79ec1768b87ba0c63a16da 100644 (file)
@@ -100,28 +100,25 @@ public class CoapDevice extends Device {
     }
 
     public void addObserveChannel(IRequestChannel channel) {
-
-        if (channel != null) {
-            mObserveChannelList.add(channel);
-        }
+        mObserveChannelList.add(channel);
     }
 
     public void removeObserveChannel(IRequestChannel channel)
             throws ClientException {
-        if (channel != null && mObserveChannelList.contains(channel)) {
+        if (mObserveChannelList.contains(channel)) {
 
             Iterator<Long> iterator = mObserveRequestList.keySet().iterator();
             while (iterator.hasNext()) {
                 Long token = iterator.next();
                 CoapClient coapClient = (CoapClient) channel;
                 if (coapClient.isObserveRequest(token) != null) {
-                    IRequest getRequest = mObserveRequestList.get(token);
-
-                    CoapRequest coapRequest = (CoapRequest) getRequest;
+                    coapClient.removeObserve(token);
+                    CoapRequest coapRequest = (CoapRequest) mObserveRequestList
+                            .get(token);
                     coapRequest.setObserve(Observe.UNSUBSCRIBE);
-
-                    coapClient.onResponseReceived(MessageBuilder.createResponse(
-                            coapRequest, ResponseStatus.CONTENT, null, null));
+                    IResponse response = MessageBuilder.createResponse(
+                            coapRequest, ResponseStatus.CONTENT, null, null);
+                    sendResponse(response);
                 }
             }
             mObserveChannelList.remove(channel);
@@ -149,7 +146,7 @@ public class CoapDevice extends Device {
             Long token = iterator.next();
             Long respToken = Bytes.bytesToLong(coapResponse.getToken());
             if (respToken.equals(token)
-                    && coapResponse.getSequenceNumber() == -1) {
+                    && coapResponse.getObserve() == Observe.NOTHING) {
                 iterator.remove();
             }
         }
@@ -190,13 +187,13 @@ public class CoapDevice extends Device {
 
     @Override
     public void onDisconnected() {
-        for (IRequestChannel serverChannel : mObserveChannelList) {
-            Iterator<Long> iterator = mObserveRequestList.keySet().iterator();
-            while (iterator.hasNext()) {
-                Long token = iterator.next();
+        Iterator<Long> iterator = mObserveRequestList.keySet().iterator();
+        while (iterator.hasNext()) {
+            Long token = iterator.next();
+            for (IRequestChannel serverChannel : mObserveChannelList) {
                 CoapClient coapClient = (CoapClient) serverChannel;
-
-                if (coapClient.isObserveRequest(token) != null) {
+                if (coapClient != null
+                        && coapClient.isObserveRequest(token) != null) {
                     CoapRequest coapRequest = (CoapRequest) mObserveRequestList
                             .get(token);
                     coapRequest.setObserve(Observe.UNSUBSCRIBE);