From 6325935fe385e1b0fc63ccfa0d6277bcfbbd5e47 Mon Sep 17 00:00:00 2001 From: Marcelo Marques Inacio Date: Mon, 13 Jun 2016 11:55:58 -0500 Subject: [PATCH 1/6] Unset region and timetoken on unsubscribe --- .../com/pubnub/api/managers/StateManager.java | 5 ++ .../api/managers/SubscriptionManager.java | 5 ++ .../api/managers/SubscriptionManagerTest.java | 55 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/src/main/java/com/pubnub/api/managers/StateManager.java b/src/main/java/com/pubnub/api/managers/StateManager.java index bee5b0200..4b89dabf9 100644 --- a/src/main/java/com/pubnub/api/managers/StateManager.java +++ b/src/main/java/com/pubnub/api/managers/StateManager.java @@ -141,4 +141,9 @@ private List prepareMembershipList(final Map d return response; } + + public boolean isEmpty() + { + return (channels.isEmpty() && presenceChannels.isEmpty() && groups.isEmpty()); + } } diff --git a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java index 5bda193da..c89037387 100644 --- a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java +++ b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java @@ -145,6 +145,11 @@ public void onResponse(final Boolean result, final PNStatus status) { } }); + if(this.subscriptionState.isEmpty()) + { + region = null; + timetoken=0L; + } reconnect(); } diff --git a/src/test/java/com/pubnub/api/managers/SubscriptionManagerTest.java b/src/test/java/com/pubnub/api/managers/SubscriptionManagerTest.java index ab26700ed..1adc47660 100644 --- a/src/test/java/com/pubnub/api/managers/SubscriptionManagerTest.java +++ b/src/test/java/com/pubnub/api/managers/SubscriptionManagerTest.java @@ -762,6 +762,61 @@ public void presence(PubNub pubnub, PNPresenceEventResult presence) { Awaitility.await().atMost(2, TimeUnit.SECONDS).untilAtomic(statusRecieved, org.hamcrest.core.IsEqual.equalTo(false)); } + @Test + public void testUnsubscribeAll() { + + final AtomicBoolean statusRecieved = new AtomicBoolean(); + final AtomicBoolean messageRecieved = new AtomicBoolean(); + + stubFor(get(urlPathEqualTo("/v2/subscribe/mySubscribeKey/ch2,ch1,ch2-pnpres,ch1-pnpres/0")) + .willReturn(aResponse().withBody("{\"t\":{\"t\":\"14607577960932487\",\"r\":1},\"m\":[{\"a\":\"4\",\"f\":0,\"i\":\"Client-g5d4g\",\"p\":{\"t\":\"14607577960925503\",\"r\":1},\"k\":\"sub-c-4cec9f8e-01fa-11e6-8180-0619f8945a4f\",\"c\":\"coolChannel\",\"d\":{\"text\":\"Enter Message Here\"},\"b\":\"coolChan-bnel\"}]}"))); + + stubFor(get(urlPathEqualTo("/v2/subscribe/mySubscribeKey/ch2,ch2-pnpres/0")) + .willReturn(aResponse().withBody("{\"t\":{\"t\":\"14607577960932487\",\"r\":1},\"m\":[{\"a\":\"4\",\"f\":0,\"i\":\"Client-g5d4g\",\"p\":{\"t\":\"14607577960925503\",\"r\":1},\"k\":\"sub-c-4cec9f8e-01fa-11e6-8180-0619f8945a4f\",\"c\":\"coolChannel\",\"d\":{\"text\":\"Enter Message Here\"},\"b\":\"coolChan-bnel\"}]}"))); + + stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/ch1/leave")) + .willReturn(aResponse().withBody("{\"status\": 200, \"message\": \"OK\", \"service\": \"Presence\", \"action\": \"leave\"}"))); + + stubFor(get(urlPathEqualTo("/v2/presence/sub-key/mySubscribeKey/channel/ch2/leave")) + .willReturn(aResponse().withBody("{\"status\": 200, \"message\": \"OK\", \"service\": \"Presence\", \"action\": \"leave\"}"))); + + SubscribeCallback sub1 = new SubscribeCallback() { + @Override + public void status(PubNub pubnub, PNStatus status) { + + if (status.getCategory() == PNStatusCategory.PNConnectedCategory) { + pubnub.unsubscribe().channels(Arrays.asList("ch1")).execute(); + } + + if (status.getAffectedChannels()!=null && status.getAffectedChannels().size() == 1 && status.getOperation() == PNOperationType.PNUnsubscribeOperation){ + if (status.getAffectedChannels().get(0).equals("ch1")) { + pubnub.unsubscribe().channels(Arrays.asList("ch2")).execute(); + } + } + + if (status.getAffectedChannels()!=null && status.getAffectedChannels().size() == 1 && status.getOperation() == PNOperationType.PNUnsubscribeOperation){ + if (status.getAffectedChannels().get(0).equals("ch2")) { + statusRecieved.set(true); + } + } + } + + @Override + public void message(PubNub pubnub, PNMessageResult message) { + } + + @Override + public void presence(PubNub pubnub, PNPresenceEventResult presence) { + } + }; + + pubnub.addListener(sub1); + + pubnub.subscribe().channels(Arrays.asList("ch1", "ch2")).withPresence().execute(); + + Awaitility.await().atMost(4, TimeUnit.SECONDS).untilAtomic(statusRecieved, org.hamcrest.core.IsEqual.equalTo(true)); + } + private String joinArray(String[] arr) { StringBuilder builder = new StringBuilder(); From 57a2409c90e4f0f162be55d6eab3fa88cc3c97f4 Mon Sep 17 00:00:00 2001 From: Marcelo Marques Inacio Date: Mon, 13 Jun 2016 12:58:03 -0500 Subject: [PATCH 2/6] checkstyle validate --- src/main/java/com/pubnub/api/managers/StateManager.java | 3 +-- .../java/com/pubnub/api/managers/SubscriptionManager.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/pubnub/api/managers/StateManager.java b/src/main/java/com/pubnub/api/managers/StateManager.java index 4b89dabf9..9b4c1a8e6 100644 --- a/src/main/java/com/pubnub/api/managers/StateManager.java +++ b/src/main/java/com/pubnub/api/managers/StateManager.java @@ -142,8 +142,7 @@ private List prepareMembershipList(final Map d return response; } - public boolean isEmpty() - { + public boolean isEmpty() { return (channels.isEmpty() && presenceChannels.isEmpty() && groups.isEmpty()); } } diff --git a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java index c89037387..2156f01fd 100644 --- a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java +++ b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java @@ -145,10 +145,9 @@ public void onResponse(final Boolean result, final PNStatus status) { } }); - if(this.subscriptionState.isEmpty()) - { + if (this.subscriptionState.isEmpty()) { region = null; - timetoken=0L; + timetoken = 0L; } reconnect(); } From 2c541a05215ce2bd780b9e8a15fa24c874f68f5a Mon Sep 17 00:00:00 2001 From: Max Presman Date: Mon, 13 Jun 2016 22:02:17 -0700 Subject: [PATCH 3/6] moving public interface up --- src/main/java/com/pubnub/api/managers/StateManager.java | 7 ++++--- .../java/com/pubnub/api/managers/SubscriptionManager.java | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/pubnub/api/managers/StateManager.java b/src/main/java/com/pubnub/api/managers/StateManager.java index 9b4c1a8e6..d2025aeaa 100644 --- a/src/main/java/com/pubnub/api/managers/StateManager.java +++ b/src/main/java/com/pubnub/api/managers/StateManager.java @@ -123,6 +123,10 @@ public List prepareChannelGroupList(final boolean includePresence) { return prepareMembershipList(groups, presenceGroups, includePresence); } + public boolean isEmpty() { + return (channels.isEmpty() && presenceChannels.isEmpty() && groups.isEmpty() && presenceGroups.isEmpty()); + } + private List prepareMembershipList(final Map dataStorage, final Map presenceStorage, final boolean includePresence) { @@ -142,7 +146,4 @@ private List prepareMembershipList(final Map d return response; } - public boolean isEmpty() { - return (channels.isEmpty() && presenceChannels.isEmpty() && groups.isEmpty()); - } } diff --git a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java index 2156f01fd..3fda52470 100644 --- a/src/main/java/com/pubnub/api/managers/SubscriptionManager.java +++ b/src/main/java/com/pubnub/api/managers/SubscriptionManager.java @@ -145,10 +145,12 @@ public void onResponse(final Boolean result, final PNStatus status) { } }); + // if we unsubscribed from all the channels, reset the timetoken back to zero and remove the region. if (this.subscriptionState.isEmpty()) { region = null; timetoken = 0L; } + reconnect(); } From a126735a339b4c46399327b978143d02960a068e Mon Sep 17 00:00:00 2001 From: Marcelo Marques Inacio Date: Wed, 15 Jun 2016 10:51:34 -0500 Subject: [PATCH 4/6] no-replicate no-store --- src/main/java/com/pubnub/api/PubNub.java | 4 ++ .../pubnub/api/endpoints/pubsub/Publish.java | 6 +++ .../api/endpoints/pubsub/PublishTest.java | 40 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/main/java/com/pubnub/api/PubNub.java b/src/main/java/com/pubnub/api/PubNub.java index 60d1c5e4f..e0e07dfd4 100644 --- a/src/main/java/com/pubnub/api/PubNub.java +++ b/src/main/java/com/pubnub/api/PubNub.java @@ -245,4 +245,8 @@ public final void reconnect() { subscriptionManager.reconnect(); } + public final Publish fire() { + return publish().shouldStore(false).replicate(false); + } + } diff --git a/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java b/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java index 44aadc052..837d66d20 100644 --- a/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java +++ b/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java @@ -32,6 +32,8 @@ public class Publish extends Endpoint, PNPublishResult> { private Boolean usePOST; @Setter private Object meta; + @Setter + private Boolean replicate; private PublishSequenceManager publishSequenceManager; @@ -39,6 +41,7 @@ public Publish(PubNub pubnub, PublishSequenceManager providedPublishSequenceMana super(pubnub); this.publishSequenceManager = providedPublishSequenceManager; + this.replicate = true; } @Override @@ -89,6 +92,9 @@ protected final Call> doWork(Map params) throws Pub params.put("seqn", String.valueOf(publishSequenceManager.getNextSequence())); + if (!replicate) { + params.put("norep", String.valueOf(true)); + } if (this.getPubnub().getConfiguration().getCipherKey() != null) { Crypto crypto = new Crypto(this.getPubnub().getConfiguration().getCipherKey()); diff --git a/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java b/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java index fa3034a02..2267bf96d 100644 --- a/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java +++ b/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java @@ -34,6 +34,46 @@ public void beforeEach() throws IOException { pubnub = this.createPubNubInstance(8080); instance = pubnub.publish(); } + @Test + + public void testFireSuccessSync() throws PubNubException, InterruptedException { + + stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hi%22")) + .willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]"))); + + pubnub.fire().channel("coolChannel").message("hi").sync(); + + List requests = findAll(getRequestedFor(urlMatching("/.*"))); + assertEquals(1, requests.size()); + assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + } + + @Test + public void testNoRepSuccessSync() throws PubNubException, InterruptedException { + + stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hi%22")) + .willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]"))); + + instance.channel("coolChannel").message("hi").replicate(false).sync(); + + List requests = findAll(getRequestedFor(urlMatching("/.*"))); + assertEquals(1, requests.size()); + assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + } + + @Test + public void testRepDefaultSuccessSync() throws PubNubException, InterruptedException { + + stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hi%22")) + .willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]"))); + + instance.channel("coolChannel").message("hi").sync(); + + List requests = findAll(getRequestedFor(urlMatching("/.*"))); + assertEquals(1, requests.size()); + assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + } + @Test public void testSuccessSync() throws PubNubException, InterruptedException { From 145dde60e2042d8151dbe020cc44cf5d7a611dd4 Mon Sep 17 00:00:00 2001 From: Max Presman Date: Wed, 15 Jun 2016 10:29:09 -0700 Subject: [PATCH 5/6] adjust tests --- .../java/com/pubnub/api/endpoints/pubsub/Publish.java | 2 +- .../com/pubnub/api/endpoints/pubsub/PublishTest.java | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java b/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java index 837d66d20..3cd9b9a46 100644 --- a/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java +++ b/src/main/java/com/pubnub/api/endpoints/pubsub/Publish.java @@ -93,7 +93,7 @@ protected final Call> doWork(Map params) throws Pub params.put("seqn", String.valueOf(publishSequenceManager.getNextSequence())); if (!replicate) { - params.put("norep", String.valueOf(true)); + params.put("norep", "true"); } if (this.getPubnub().getConfiguration().getCipherKey() != null) { diff --git a/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java b/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java index 2267bf96d..ce15d75fc 100644 --- a/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java +++ b/src/test/java/com/pubnub/api/endpoints/pubsub/PublishTest.java @@ -19,6 +19,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; public class PublishTest extends TestHarness { @@ -46,6 +47,8 @@ public void testFireSuccessSync() throws PubNubException, InterruptedException { List requests = findAll(getRequestedFor(urlMatching("/.*"))); assertEquals(1, requests.size()); assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + assertEquals("true", requests.get(0).queryParameter("norep").firstValue()); + assertEquals("0", requests.get(0).queryParameter("store").firstValue()); } @Test @@ -59,19 +62,21 @@ public void testNoRepSuccessSync() throws PubNubException, InterruptedException List requests = findAll(getRequestedFor(urlMatching("/.*"))); assertEquals(1, requests.size()); assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + assertEquals("true", requests.get(0).queryParameter("norep").firstValue()); } @Test public void testRepDefaultSuccessSync() throws PubNubException, InterruptedException { - stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hi%22")) + stubFor(get(urlPathEqualTo("/publish/myPublishKey/mySubscribeKey/0/coolChannel/0/%22hirep%22")) .willReturn(aResponse().withBody("[1,\"Sent\",\"14598111595318003\"]"))); - instance.channel("coolChannel").message("hi").sync(); + instance.channel("coolChannel").message("hirep").sync(); List requests = findAll(getRequestedFor(urlMatching("/.*"))); assertEquals(1, requests.size()); assertEquals("myUUID", requests.get(0).queryParameter("uuid").firstValue()); + assertNull(requests.get(0).queryParameter("norep")); } From 768b539a728abfb4e273c29c3fcb31260aa8f859 Mon Sep 17 00:00:00 2001 From: Max Presman Date: Wed, 15 Jun 2016 10:47:59 -0700 Subject: [PATCH 6/6] bump version --- CHANGELOG.md | 9 +++++++++ VERSION | 2 +- build.gradle | 2 +- src/main/java/com/pubnub/api/PubNub.java | 2 +- src/main/java/com/pubnub/api/endpoints/Endpoint.java | 2 +- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a1286be..7eb560a24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,13 @@ +4.0.3 +- fire() method and no-replicaton options. + +4.0.2 +- fix to the version fetching. + +4.0.1 +- adjustment of the subscribe loop to alleviate duplicate dispatches. + 06-03-16 - 4.0.0 - first GA. diff --git a/VERSION b/VERSION index 4d54daddb..c4e41f945 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.0.2 +4.0.3 diff --git a/build.gradle b/build.gradle index b4c5cf295..e742ef1b2 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id 'findbugs' } group = 'com.pubnub' -version = '4.0.2' +version = '4.0.3' description = """""" diff --git a/src/main/java/com/pubnub/api/PubNub.java b/src/main/java/com/pubnub/api/PubNub.java index e0e07dfd4..70f018453 100644 --- a/src/main/java/com/pubnub/api/PubNub.java +++ b/src/main/java/com/pubnub/api/PubNub.java @@ -50,7 +50,7 @@ public class PubNub { private static final int TIMESTAMP_DIVIDER = 1000; private static final int MAX_SEQUENCE = 65535; - private static final String SDK_VERSION = "4.0.2"; + private static final String SDK_VERSION = "4.0.3"; public PubNub(final PNConfiguration initialConfig) { this.configuration = initialConfig; diff --git a/src/main/java/com/pubnub/api/endpoints/Endpoint.java b/src/main/java/com/pubnub/api/endpoints/Endpoint.java index dabaab3d5..d05eb8591 100644 --- a/src/main/java/com/pubnub/api/endpoints/Endpoint.java +++ b/src/main/java/com/pubnub/api/endpoints/Endpoint.java @@ -260,7 +260,7 @@ protected final Retrofit createRetrofit() { protected final Map createBaseParams() { Map params = new HashMap<>(); - params.put("pnsdk", "Java/" + this.pubnub.getVersion()); + params.put("pnsdk", "PubNub-Java-Unified/" + this.pubnub.getVersion()); params.put("uuid", this.pubnub.getConfiguration().getUuid()); // add the auth key for publish and subscribe.