Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0a513b8

Browse filesBrowse files
committed
add #unsubscribe() method and callbacks
1 parent 8f3a07f commit 0a513b8
Copy full SHA for 0a513b8

File tree

Expand file treeCollapse file tree

4 files changed

+172
-4
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

4 files changed

+172
-4
lines changed
Open diff view settings
Collapse file

‎java/srcPubnubApi/com/pubnub/api/DataSyncCallback.java‎

Copy file name to clipboardExpand all lines: java/srcPubnubApi/com/pubnub/api/DataSyncCallback.java
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ public void removeCallback(List updates, String path) {
2222
public void errorCallback(PubnubError error) {
2323
}
2424

25-
public void connectCallback(String channel, Object message) {
25+
public void connectCallback(String location) {
2626
}
2727

28-
public void reconnectCallback(String channel, Object message) {
28+
public void reconnectCallback() {
2929
}
3030

31-
public void disconnectCallback(String channel, Object message) {
31+
public void disconnectCallback() {
3232
}
3333

3434
public void invokeReadyCallback(SyncedObject syncedObject) {
Collapse file

‎java/srcPubnubApi/com/pubnub/api/SyncedObject.java‎

Copy file name to clipboardExpand all lines: java/srcPubnubApi/com/pubnub/api/SyncedObject.java
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,10 @@ public void remove(String path, Callback callback) {
430430
pubnub.remove(args, callback);
431431
}
432432

433+
public void unsubscribe() {
434+
this.syncedObjectManager.unsubscribe(location);
435+
}
436+
433437
public static String getURLizedObjectPath(String location) {
434438
String[] path = PubnubUtil.splitString(location, ".");
435439

Collapse file

‎java/srcPubnubApi/com/pubnub/api/SyncedObjectManager.java‎

Copy file name to clipboardExpand all lines: java/srcPubnubApi/com/pubnub/api/SyncedObjectManager.java
+40-1Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public SyncedObject add(String objectID, String path, DataSyncCallback callback)
5454
subscribe(callback);
5555
} else if (callback != null) {
5656
object.setIsReady(true);
57+
callback.connectCallback(location);
5758
callback.invokeReadyCallback(object);
5859
}
5960

@@ -168,22 +169,36 @@ public String[] getChannelsForSubscribe() {
168169
return result;
169170
}
170171

172+
public String[] getChannelsForUnsubscribe(String objectId) {
173+
return new String[]{
174+
"pn_ds_" + objectId,
175+
"pn_ds_" + objectId + ".*",
176+
"pn_dstr_" + PubnubUtil.splitString(objectId, ".")[0]
177+
};
178+
}
179+
171180
private void subscribe(final DataSyncCallback callback) {
172181
try {
173182
pubnub.subscribe(
174183
getChannelsForSubscribe(),
175184
new Callback() {
185+
@Override
176186
public void connectCallback(String channel, Object message) {
177-
if (channel.indexOf("dstr") < 0 && channel.indexOf('*') < 0) {
187+
if (!channel.contains("dstr") && channel.indexOf('*') < 0) {
178188
channel = channel.substring(6);
179189
ArrayList locationElements = new ArrayList(Arrays.asList(PubnubUtil.splitString(channel, ".")));
180190
String objectId = (String) locationElements.remove(0);
181191
String path = PubnubUtil.joinString(locationElements, ".");
182192

193+
if (callback != null) {
194+
callback.connectCallback(channel);
195+
}
196+
183197
fetchObject(objectId, path, callback);
184198
}
185199
}
186200

201+
@Override
187202
public void successCallback(String channel, Object data) {
188203
JSONObject message = (JSONObject) data;
189204

@@ -253,9 +268,24 @@ public void successCallback(String channel, Object data) {
253268
}
254269
}
255270

271+
@Override
256272
public void errorCallback(String channel, PubnubError error) {
257273
callback.errorCallback(error);
258274
}
275+
276+
@Override
277+
public void reconnectCallback(String channel, Object message) {
278+
if (callback != null && channel != null && channel.indexOf("pn_dstr_") == 0) {
279+
callback.reconnectCallback();
280+
}
281+
}
282+
283+
@Override
284+
public void disconnectCallback(String channel, Object message) {
285+
if (callback != null && channel != null && channel.indexOf("pn_dstr_") == 0) {
286+
callback.disconnectCallback();
287+
}
288+
}
259289
}
260290
);
261291

@@ -385,6 +415,15 @@ public void errorCallback(PubnubError error) {
385415
});
386416
}
387417

418+
protected synchronized void unsubscribe(String location) {
419+
this.callbacks.remove(location);
420+
this.channels.remove(location);
421+
this.objectsSyncPending.remove(location);
422+
this.data.remove(location);
423+
424+
this.pubnub.unsubscribe(getChannelsForUnsubscribe(location));
425+
}
426+
388427
/**
389428
* Merge JSON objects.
390429
*
Collapse file
+125Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package com.pubnub.api.datasync;
2+
3+
import com.pubnub.api.DataSyncCallback;
4+
import com.pubnub.api.Pubnub;
5+
import com.pubnub.api.SyncedObject;
6+
import com.pubnub.api.SyncedObjectManager;
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
10+
import java.lang.reflect.Field;
11+
import java.util.Arrays;
12+
import java.util.List;
13+
import java.util.concurrent.CountDownLatch;
14+
import java.util.concurrent.TimeUnit;
15+
16+
import static org.junit.Assert.assertEquals;
17+
import static org.junit.Assert.assertFalse;
18+
19+
public class SyncedObjectMultipleObjectsBehaviourTest {
20+
Pubnub pubnub;
21+
SyncedObjectManager syncedObjectManager;
22+
23+
@Before
24+
public void setUp() throws InterruptedException {
25+
pubnub = new Pubnub("demo-36", "demo-36");
26+
syncedObjectManager = new SyncedObjectManager(pubnub);
27+
28+
pubnub.setCacheBusting(false);
29+
}
30+
31+
@Test
32+
public void testSubscribeRootAfterChildren() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
33+
final CountDownLatch settingsLatch = new CountDownLatch(1);
34+
final CountDownLatch playerLatch = new CountDownLatch(1);
35+
final CountDownLatch playersLatch = new CountDownLatch(1);
36+
37+
DataSyncCallback settingsCallback = new DataSyncCallback() {
38+
@Override
39+
public void mergeCallback(List updates, String path) {
40+
settingsLatch.countDown();
41+
}
42+
};
43+
44+
DataSyncCallback playerCallback = new DataSyncCallback() {
45+
@Override
46+
public void mergeCallback(List updates, String path) {
47+
playerLatch.countDown();
48+
}
49+
};
50+
51+
DataSyncCallback playersCallback = new DataSyncCallback() {
52+
@Override
53+
public void mergeCallback(List updates, String path) {
54+
playersLatch.countDown();
55+
}
56+
};
57+
58+
SyncedObject player = pubnub.sync("player", playerCallback);
59+
pubnub.sync("player.settings", settingsCallback);
60+
pubnub.sync("players", playersCallback);
61+
62+
player.merge("settings.color", "red");
63+
settingsLatch.await(5, TimeUnit.SECONDS);
64+
playerLatch.await(5, TimeUnit.SECONDS);
65+
66+
assertEquals(0, settingsLatch.getCount());
67+
assertEquals(0, playerLatch.getCount());
68+
assertEquals(1, playersLatch.getCount());
69+
}
70+
71+
@Test
72+
public void testUnsubscribe() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
73+
final CountDownLatch settingsLatch = new CountDownLatch(1);
74+
final CountDownLatch playerLatch = new CountDownLatch(1);
75+
final CountDownLatch playersLatch = new CountDownLatch(1);
76+
77+
DataSyncCallback settingsCallback = new DataSyncCallback() {
78+
@Override
79+
public void readyCallback() {
80+
settingsLatch.countDown();
81+
}
82+
};
83+
84+
DataSyncCallback playerCallback = new DataSyncCallback() {
85+
@Override
86+
public void readyCallback() {
87+
playerLatch.countDown();
88+
}
89+
};
90+
91+
DataSyncCallback playersCallback = new DataSyncCallback() {
92+
@Override
93+
public void readyCallback() {
94+
playersLatch.countDown();
95+
}
96+
};
97+
98+
SyncedObject player = pubnub.sync("player", playerCallback);
99+
pubnub.sync("player.settings", settingsCallback);
100+
pubnub.sync("players", playersCallback);
101+
102+
settingsLatch.await(5, TimeUnit.SECONDS);
103+
playerLatch.await(5, TimeUnit.SECONDS);
104+
playersLatch.await(5, TimeUnit.SECONDS);
105+
106+
player.unsubscribe();
107+
108+
Field f = pubnub.getClass().getSuperclass().getSuperclass().getDeclaredField("syncedObjectManager");
109+
f.setAccessible(true);
110+
SyncedObjectManager manager = (SyncedObjectManager) f.get(pubnub);
111+
String[] channels = manager.getChannelsForSubscribe();
112+
assertEquals(6, channels.length);
113+
assertFalse(Arrays.asList(channels).contains("pn_ds_player.*"));
114+
assertFalse(Arrays.asList(channels).contains("pn_ds_player"));
115+
}
116+
117+
@Test
118+
public void testInnerLevelSyncedObjectInstantiation() {
119+
SyncedObject artists = new SyncedObject(syncedObjectManager, "player", "music.artists");
120+
121+
assertEquals("player", artists.getObjectID());
122+
assertEquals("music.artists", artists.getPath());
123+
assertEquals("player.music.artists", artists.getLocation());
124+
}
125+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.