Add DI based resource search through /oic/res
authorJee Hyeok Kim <jihyeok13.kim@samsung.com>
Wed, 27 Jul 2016 01:46:46 +0000 (10:46 +0900)
committerJee Hyeok Kim <jihyeok13.kim@samsung.com>
Thu, 28 Jul 2016 04:30:06 +0000 (04:30 +0000)
Implement di based resource search.
Previously, RT or IF required

Change-Id: Id6b0c21e7abcc597f5ce532d876fbe0e3ca7872a
Signed-off-by: Jee Hyeok Kim <jihyeok13.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/9743
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Eunok Shin <eunok.shin@samsung.com>
cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/account/device/DeviceResource.java
cloud/interface/src/main/java/org/iotivity/cloud/ciserver/resources/proxy/ResourceFind.java
cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/db/DBManager.java
cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/db/MongoDB.java
cloud/resourcedirectory/src/main/java/org/iotivity/cloud/rdserver/resources/directory/res/DiscoveryResource.java

index 8d5a600..2f96301 100644 (file)
@@ -96,9 +96,8 @@ public class DeviceResource extends Resource {
 
         ArrayList<String> deviceList = mAsManager.requestAccountDevices(userId);
 
-        if (request.getUriQueryMap().get("di") != null) {
-            String di = request.getUriQueryMap().get("di").get(0);
-            if (deviceList.contains(di)) {
+        if (request.getUriQueryMap().get("di") != null) {            
+            if (deviceList.containsAll(request.getUriQueryMap().get("di"))) {
                 return MessageBuilder.createResponse(request,
                         ResponseStatus.VALID);
             } else {
index dcee4ba..7ec2ad0 100644 (file)
@@ -119,8 +119,7 @@ public class ResourceFind extends Resource {
         uriQuery.append(coapDevice.getAccessToken());
 
         if (request.getUriQueryMap().get("di") != null) {
-            String di = request.getUriQueryMap().get("di").get(0);
-            if (di != null) {
+            for(String di : request.getUriQueryMap().get("di")){
                 uriQuery.append("&");
                 uriQuery.append("di" + "=");
                 uriQuery.append(di);
index 655fec2..aefb1bb 100644 (file)
@@ -52,9 +52,13 @@ public class DBManager {
         return mMongoDB.createRDResource(pubResourceList, Constants.RD_TABLE);
     }
 
-    public ArrayList<HashMap<Object, Object>> findResourceAboutDi(String di,
+    public ArrayList<HashMap<Object, Object>> findResourceAboutDi(String di) {
+        return mMongoDB.readResourceAboutDid(di, Constants.RD_TABLE);
+    }
+    
+    public ArrayList<HashMap<Object, Object>> findResourceAboutDiAndFilter(String di,
             String key, String value) {
-        return mMongoDB.readResourceAboutDid(di, key, value,
+        return mMongoDB.readResourceAboutDidAndFilter(di, key, value,
                 Constants.RD_TABLE);
     }
 
index eb820d9..cd0dacd 100644 (file)
@@ -247,6 +247,28 @@ public class MongoDB {
         return deviceState;
     }
 
+    public ArrayList<HashMap<Object, Object>> readResourceAboutDid(String di, String tableName) {
+        MongoCollection<Document> collection = db.getCollection(tableName);
+        ArrayList<HashMap<Object, Object>> resList = null;
+        MongoCursor<Document> cursor = collection
+                .find(Filters.eq(Constants.DEVICE_ID, di))
+                .iterator();
+
+        if (cursor.hasNext()) {
+            resList = new ArrayList<>();
+            try {
+                while (cursor.hasNext()) {
+                    Document doc = cursor.next();
+                    resList.add(convertDocumentToHashMap(doc));
+                }
+            } finally {
+                cursor.close();
+            }
+        }
+
+        return resList;
+    }
+
     /**
      * API for finding resources matched filterValue of filterKey and a
      * particular device ID in collection
@@ -262,7 +284,7 @@ public class MongoDB {
      * @return ArrayList<PublishPayloadFormat> - array list of resource
      *         information
      */
-    public ArrayList<HashMap<Object, Object>> readResourceAboutDid(String di,
+    public ArrayList<HashMap<Object, Object>> readResourceAboutDidAndFilter(String di,
             String filterKey, String filterValue, String tableName) {
         MongoCollection<Document> collection = db.getCollection(tableName);
         ArrayList<HashMap<Object, Object>> resList = null;
@@ -273,14 +295,14 @@ public class MongoDB {
 
         if (cursor.hasNext()) {
             resList = new ArrayList<>();
-        }
-        try {
-            while (cursor.hasNext()) {
-                Document doc = cursor.next();
-                resList.add(convertDocumentToHashMap(doc));
+            try {
+                while (cursor.hasNext()) {
+                    Document doc = cursor.next();
+                    resList.add(convertDocumentToHashMap(doc));
+                }
+            } finally {
+                cursor.close();
             }
-        } finally {
-            cursor.close();
         }
 
         return resList;
index 1236c43..ef91fb5 100644 (file)
@@ -90,7 +90,7 @@ public class DiscoveryResource extends Resource {
 
         List<String> listRT = queryMap.get(Constants.RESOURCE_TYPE);
         List<String> listITF = queryMap.get(Constants.INTERFACE);
-        String key, value = null;
+        String key = null, value = null;
         ArrayList<HashMap<Object, Object>> foundResList = null;
 
         // TODO: Multiple RT or ITF support required
@@ -100,14 +100,16 @@ public class DiscoveryResource extends Resource {
         } else if (listITF != null) {
             key = Constants.INTERFACE;
             value = listITF.get(0);
-        } else {
-            throw new PreconditionFailedException(
-                    "rt or if property is not included");
         }
 
-        for (String deviceId : deviceList) {
-            foundResList = DBManager.getInstance().findResourceAboutDi(deviceId,
-                    key, value);
+        for (String deviceId : deviceList) {            
+            if(key != null && value != null){
+                foundResList = DBManager.getInstance().findResourceAboutDiAndFilter(deviceId,
+                        key, value);
+            } else {            
+                foundResList = DBManager.getInstance().findResourceAboutDi(deviceId);
+            }
+            
             if (foundResList != null) {
                 resourceList.add(makeDiscoveryPayloadSegment(foundResList));
             }