Modify subscriber list in Invite resource
authorMinji Park <minjii.park@samsung.com>
Wed, 21 Sep 2016 01:23:26 +0000 (10:23 +0900)
committerJee Hyeok Kim <jihyeok13.kim@samsung.com>
Thu, 22 Sep 2016 06:26:33 +0000 (06:26 +0000)
- modify Invite resource to make multiple devices(for each user)
  can get observe notification about invitation info.

Change-Id: I4afa8cf0e4da5c68c3478cb7903afd3bf14dc97b
Signed-off-by: Minji Park <minjii.park@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/12001
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: jung seungho <shonest.jung@samsung.com>
Reviewed-by: Jee Hyeok Kim <jihyeok13.kim@samsung.com>
(cherry picked from commit 558d3f1b6287f139ec75361b3e0cdfdebec38b08)
Reviewed-on: https://gerrit.iotivity.org/gerrit/12113

cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteManager.java
cloud/account/src/main/java/org/iotivity/cloud/accountserver/resources/acl/invite/InviteResource.java

index ca64b12..d942c68 100644 (file)
@@ -57,7 +57,8 @@ public class InviteManager {
         public IRequest mRequest;
     }
 
-    private HashMap<String, InviteSubscriber> mSubscribers = new HashMap<>();
+    // <uid, subscriber list>
+    private HashMap<String, ArrayList<InviteSubscriber>> mSubscribers = new HashMap<>();
 
     public void addInvitation(String uid, String gid, String mid) {
 
@@ -162,15 +163,30 @@ public class InviteManager {
 
         InviteSubscriber newSubscriber = new InviteSubscriber(subscriber,
                 request);
-        mSubscribers.put(uid, newSubscriber);
+
+        synchronized (mSubscribers) {
+            ArrayList<InviteSubscriber> subscriberList = mSubscribers.get(uid);
+
+            if (subscriberList == null) {
+                subscriberList = new ArrayList<>();
+            }
+
+            subscriberList.add(newSubscriber);
+            mSubscribers.put(uid, subscriberList);
+        }
 
         return getInvitationInfo(uid);
     }
 
-    public HashMap<String, Object> removeSubscriber(String uid) {
+    public HashMap<String, Object> removeSubscriber(String uid, IRequest request) {
 
-        if (mSubscribers.containsKey(uid)) {
-            mSubscribers.remove(uid);
+        synchronized (mSubscribers) {
+            if (mSubscribers.containsKey(uid)) {
+
+                mSubscribers.get(uid).removeIf(
+                        subscriber -> subscriber.mRequest.getRequestId()
+                                .equals(request.getRequestId()));
+            }
         }
 
         return getInvitationInfo(uid);
@@ -182,12 +198,17 @@ public class InviteManager {
             if (!mSubscribers.containsKey(id)) {
                 return;
             }
+
             Cbor<HashMap<String, Object>> cbor = new Cbor<>();
-            mSubscribers.get(id).mSubscriber.sendResponse(
-                    MessageBuilder.createResponse(mSubscribers.get(id).mRequest,
-                            ResponseStatus.CONTENT,
-                            ContentFormat.APPLICATION_CBOR,
-                            cbor.encodingPayloadToCbor(getInvitationInfo(id))));
+            byte[] payload = cbor.encodingPayloadToCbor(getInvitationInfo(id));
+
+            for (InviteSubscriber subscriber : mSubscribers.get(id)) {
+
+                subscriber.mSubscriber.sendResponse(MessageBuilder
+                        .createResponse(subscriber.mRequest,
+                                ResponseStatus.CONTENT,
+                                ContentFormat.APPLICATION_CBOR, payload));
+            }
         }
     }
 
index 080e685..1df010d 100644 (file)
@@ -92,7 +92,7 @@ public class InviteResource extends Resource {
                         request);
                 break;
             case UNSUBSCRIBE:
-                responsePayload = mInviteManager.removeSubscriber(uid);
+                responsePayload = mInviteManager.removeSubscriber(uid, request);
                 break;
             default:
                 break;