Skip to content

Commit cf6563b

Browse files
PubNub SDK v4.32.0 release.
1 parent 30444f8 commit cf6563b

File tree

68 files changed

+3235
-94
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+3235
-94
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* @kleewho @bartk @budgetpreneur

.pubnub.yml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
name: java
2-
version: 4.31.3
2+
version: 4.32.0
33
schema: 1
44
scm: github.com/pubnub/java
55
files:
6-
- build/libs/pubnub-gson-4.31.3-all.jar
6+
- build/libs/pubnub-gson-4.32.0-all.jar
77
changelog:
8+
- version: v4.32.0
9+
date: 2020-08-14
10+
changes:
11+
- type: feature
12+
text: "Allows to upload files to channels, download them with optional encryption support."
813
- version: v4.31.3
914
date: 2020-06-17
1015
changes:
@@ -537,6 +542,12 @@ features:
537542
- OBJECTS-REMOVE-MEMBERS
538543
- OBJECTS-UPDATE-MEMBERS
539544
- OBJECTS-FILTERING
545+
files:
546+
- FILES-DELETE-FILE
547+
- FILES-DOWNLOAD-FILE
548+
- FILES-GET-FILE-URL
549+
- FILES-LIST-FILES
550+
- FILES-SEND-FILE
540551
unsubscribe:
541552
- UNSUBSCRIBE-ALL
542553
- UNSUBSCRIBE-SUPPRESS-LEAVE-EVENTS

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## [v4.32.0](https://github.com/pubnub/java/releases/tag/v4.32.0)
2+
August-14-2020
3+
4+
[Full Changelog](https://github.com/pubnub/java/compare/v4.31.3...v4.32.0)
5+
6+
- 🌟️ Allows to upload files to channels, download them with optional encryption support.
7+
18
## [v4.31.3](https://github.com/pubnub/java/releases/tag/v4.31.3)
29
June-17-2020
310

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ plugins {
1111
}
1212
group = 'com.pubnub'
1313

14-
version = '4.31.3'
14+
version = '4.32.0'
1515

1616
description = """"""
1717

@@ -57,6 +57,7 @@ dependencies {
5757
testImplementation group: 'junit', name: 'junit', version: '4.12'
5858
testImplementation group: 'com.github.tomakehurst', name: 'wiremock', version: '2.25.0'
5959
testImplementation group: 'org.awaitility', name: 'awaitility', version: '4.0.1'
60+
testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.4.0'
6061
implementation group: 'org.json', name: 'json', version: '20190722'
6162
}
6263

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
#Fri Apr 19 09:14:42 CEST 2019
21
distributionBase=GRADLE_USER_HOME
32
distributionPath=wrapper/dists
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

src/main/java/com/pubnub/api/PubNub.java

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
import com.pubnub.api.endpoints.channel_groups.DeleteChannelGroup;
1818
import com.pubnub.api.endpoints.channel_groups.ListAllChannelGroup;
1919
import com.pubnub.api.endpoints.channel_groups.RemoveChannelChannelGroup;
20+
import com.pubnub.api.endpoints.files.DeleteFile;
21+
import com.pubnub.api.endpoints.files.DownloadFile;
22+
import com.pubnub.api.endpoints.files.GetFileUrl;
23+
import com.pubnub.api.endpoints.files.ListFiles;
24+
import com.pubnub.api.endpoints.files.PublishFileMessage;
25+
import com.pubnub.api.endpoints.files.SendFile;
2026
import com.pubnub.api.endpoints.message_actions.AddMessageAction;
2127
import com.pubnub.api.endpoints.message_actions.GetMessageActions;
2228
import com.pubnub.api.endpoints.message_actions.RemoveMessageAction;
@@ -54,17 +60,17 @@
5460
import com.pubnub.api.managers.token_manager.TokenManager;
5561
import com.pubnub.api.managers.token_manager.TokenManagerProperties;
5662
import com.pubnub.api.vendor.Crypto;
57-
63+
import com.pubnub.api.vendor.FileEncryptionUtil;
64+
import lombok.Getter;
5865
import org.jetbrains.annotations.NotNull;
5966
import org.jetbrains.annotations.Nullable;
6067

68+
import java.io.InputStream;
6169
import java.util.Date;
6270
import java.util.HashMap;
6371
import java.util.List;
6472
import java.util.UUID;
6573

66-
import lombok.Getter;
67-
6874

6975
public class PubNub {
7076

@@ -91,7 +97,7 @@ public class PubNub {
9197
private static final int TIMESTAMP_DIVIDER = 1000;
9298
private static final int MAX_SEQUENCE = 65535;
9399

94-
private static final String SDK_VERSION = "4.31.3";
100+
private static final String SDK_VERSION = "4.32.0";
95101

96102
public PubNub(@NotNull PNConfiguration initialConfig) {
97103
this.configuration = initialConfig;
@@ -341,6 +347,43 @@ public RemoveMessageAction removeMessageAction() {
341347

342348
// End Message Actions API
343349

350+
@NotNull
351+
public SendFile.Builder sendFile() {
352+
return SendFile.builder(this, telemetryManager, retrofitManager);
353+
}
354+
355+
public ListFiles.Builder listFiles() {
356+
return new ListFiles.Builder(this, telemetryManager, retrofitManager);
357+
}
358+
359+
public GetFileUrl.Builder getFileUrl() {
360+
return GetFileUrl.builder(
361+
this,
362+
telemetryManager,
363+
retrofitManager);
364+
}
365+
366+
public DownloadFile.Builder downloadFile() {
367+
return DownloadFile.builder(
368+
this,
369+
telemetryManager,
370+
retrofitManager);
371+
}
372+
373+
public DeleteFile.Builder deleteFile() {
374+
return DeleteFile.builder(
375+
this,
376+
telemetryManager,
377+
retrofitManager);
378+
}
379+
380+
public PublishFileMessage.Builder publishFileMessage() {
381+
return PublishFileMessage.builder(
382+
this,
383+
telemetryManager,
384+
retrofitManager);
385+
}
386+
344387
// public methods
345388

346389
/**
@@ -375,6 +418,14 @@ public String decrypt(String inputString, String cipherKey) throws PubNubExcepti
375418
return new Crypto(cipherKey).decrypt(inputString);
376419
}
377420

421+
public InputStream decryptInputStream(InputStream inputStream) throws PubNubException {
422+
return decryptInputStream(inputStream, this.getConfiguration().getCipherKey());
423+
}
424+
425+
public InputStream decryptInputStream(InputStream inputStream, String cipherKey) throws PubNubException {
426+
return FileEncryptionUtil.decrypt(cipherKey, inputStream);
427+
}
428+
378429
/**
379430
* Perform Cryptographic encryption of an input string and the cipher key provided by PNConfiguration
380431
*
@@ -407,6 +458,14 @@ public String encrypt(String inputString, String cipherKey) throws PubNubExcepti
407458
return new Crypto(cipherKey).encrypt(inputString);
408459
}
409460

461+
public InputStream encryptInputSteram(InputStream inputStream) throws PubNubException {
462+
return encryptInputSteram(inputStream, this.getConfiguration().getCipherKey());
463+
}
464+
465+
public InputStream encryptInputSteram(InputStream inputStream, String cipherKey) throws PubNubException {
466+
return FileEncryptionUtil.encrypt(cipherKey, inputStream);
467+
}
468+
410469
public int getTimestamp() {
411470
return (int) ((new Date().getTime()) / TIMESTAMP_DIVIDER);
412471
}

src/main/java/com/pubnub/api/PubNubUtil.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.pubnub.api;
22

3-
43
import com.pubnub.api.builder.PubNubErrorBuilder;
54
import com.pubnub.api.vendor.Base64;
65
import lombok.extern.java.Log;
@@ -16,11 +15,7 @@
1615
import java.net.URLEncoder;
1716
import java.security.InvalidKeyException;
1817
import java.security.NoSuchAlgorithmException;
19-
import java.util.HashMap;
20-
import java.util.List;
21-
import java.util.Map;
22-
import java.util.Set;
23-
import java.util.TreeSet;
18+
import java.util.*;
2419

2520
@Log
2621
public class PubNubUtil {
@@ -244,5 +239,4 @@ private static String requestBodyToString(final Request request) {
244239
}
245240
return "";
246241
}
247-
248242
}

src/main/java/com/pubnub/api/callbacks/SubscribeCallback.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.pubnub.api.models.consumer.pubsub.PNMessageResult;
66
import com.pubnub.api.models.consumer.pubsub.PNPresenceEventResult;
77
import com.pubnub.api.models.consumer.pubsub.PNSignalResult;
8+
import com.pubnub.api.models.consumer.pubsub.files.PNFileEventResult;
89
import com.pubnub.api.models.consumer.pubsub.message_actions.PNMessageActionResult;
910
import com.pubnub.api.models.consumer.pubsub.objects.PNMembershipResult;
1011
import com.pubnub.api.models.consumer.pubsub.objects.PNSpaceResult;
@@ -28,4 +29,7 @@ public abstract class SubscribeCallback {
2829
public abstract void membership(@NotNull PubNub pubnub, @NotNull PNMembershipResult pnMembershipResult);
2930

3031
public abstract void messageAction(@NotNull PubNub pubnub, @NotNull PNMessageActionResult pnMessageActionResult);
32+
33+
public abstract void file(@NotNull PubNub pubnub, @NotNull PNFileEventResult pnFileEventResult);
34+
3135
}

src/main/java/com/pubnub/api/endpoints/Endpoint.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.pubnub.api.PubNubUtil;
88
import com.pubnub.api.builder.PubNubErrorBuilder;
99
import com.pubnub.api.callbacks.PNCallback;
10+
import com.pubnub.api.endpoints.remoteaction.RemoteAction;
1011
import com.pubnub.api.enums.PNOperationType;
1112
import com.pubnub.api.enums.PNStatusCategory;
1213
import com.pubnub.api.managers.MapperManager;
@@ -21,6 +22,7 @@
2122
import org.jetbrains.annotations.Nullable;
2223

2324
import java.io.IOException;
25+
import java.net.HttpURLConnection;
2426
import java.net.SocketException;
2527
import java.net.SocketTimeoutException;
2628
import java.net.UnknownHostException;
@@ -41,7 +43,7 @@
4143
import retrofit2.Response;
4244

4345
@Log
44-
public abstract class Endpoint<Input, Output> {
46+
public abstract class Endpoint<Input, Output> implements RemoteAction<Output> {
4547

4648
@Getter(AccessLevel.PROTECTED)
4749
private PubNub pubnub;
@@ -68,10 +70,6 @@ public abstract class Endpoint<Input, Output> {
6870
@Getter(AccessLevel.NONE)
6971
private boolean silenceFailures;
7072

71-
private static final int SERVER_RESPONSE_SUCCESS = 200;
72-
private static final int SERVER_RESPONSE_FORBIDDEN = 403;
73-
private static final int SERVER_RESPONSE_BAD_REQUEST = 400;
74-
7573
private MapperManager mapper;
7674

7775
public Endpoint(PubNub pubnubInstance, TelemetryManager telemetry, RetrofitManager retrofitInstance) {
@@ -81,6 +79,7 @@ public Endpoint(PubNub pubnubInstance, TelemetryManager telemetry, RetrofitManag
8179
this.telemetryManager = telemetry;
8280
}
8381

82+
@Override
8483
@Nullable
8584
public Output sync() throws PubNubException {
8685
this.validateParams();
@@ -99,7 +98,7 @@ public Output sync() throws PubNubException {
9998
.build();
10099
}
101100

102-
if (!serverResponse.isSuccessful() || serverResponse.code() != SERVER_RESPONSE_SUCCESS) {
101+
if (isError(serverResponse)) {
103102
String responseBodyText;
104103
JsonElement responseBody;
105104

@@ -130,6 +129,7 @@ public Output sync() throws PubNubException {
130129
return response;
131130
}
132131

132+
@Override
133133
public void async(@NotNull final PNCallback<Output> callback) {
134134
cachedCallback = callback;
135135

@@ -149,7 +149,7 @@ public void async(@NotNull final PNCallback<Output> callback) {
149149
public void onResponse(Call<Input> performedCall, Response<Input> response) {
150150
Output callbackResponse;
151151

152-
if (!response.isSuccessful() || response.code() != SERVER_RESPONSE_SUCCESS) {
152+
if (isError(response)) {
153153

154154
String responseBodyText;
155155
JsonElement responseBody;
@@ -182,7 +182,7 @@ public void onResponse(Call<Input> performedCall, Response<Input> response) {
182182
.statusCode(response.code())
183183
.build();
184184

185-
if (response.code() == SERVER_RESPONSE_FORBIDDEN) {
185+
if (response.code() == HttpURLConnection.HTTP_FORBIDDEN) {
186186
pnStatusCategory = PNStatusCategory.PNAccessDeniedCategory;
187187

188188
if (responseBodyPayload != null && mapper.hasField(responseBodyPayload, "channels")) {
@@ -207,7 +207,7 @@ public void onResponse(Call<Input> performedCall, Response<Input> response) {
207207

208208
}
209209

210-
if (response.code() == SERVER_RESPONSE_BAD_REQUEST) {
210+
if (response.code() == HttpURLConnection.HTTP_BAD_REQUEST) {
211211
pnStatusCategory = PNStatusCategory.PNBadRequestCategory;
212212
}
213213

@@ -271,6 +271,7 @@ public void onFailure(Call<Input> performedCall, Throwable throwable) {
271271
});
272272
}
273273

274+
@Override
274275
public void retry() {
275276
silenceFailures = false;
276277
async(cachedCallback);
@@ -279,13 +280,18 @@ public void retry() {
279280
/**
280281
* cancel the operation but do not alert anybody, useful for restarting the heartbeats and subscribe loops.
281282
*/
283+
@Override
282284
public void silentCancel() {
283285
if (call != null && !call.isCanceled()) {
284286
this.silenceFailures = true;
285287
call.cancel();
286288
}
287289
}
288290

291+
protected boolean isError(Response<Input> response) {
292+
return response.code() != HttpURLConnection.HTTP_OK;
293+
}
294+
289295
private PNStatus createStatusResponse(PNStatusCategory category, Response<Input> response, Exception throwable,
290296
ArrayList<String> errorChannels, ArrayList<String> errorChannelGroups) {
291297
PNStatus.PNStatusBuilder pnStatus = PNStatus.builder();

src/main/java/com/pubnub/api/endpoints/FetchMessages.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ public class FetchMessages extends Endpoint<FetchMessagesEnvelope, PNFetchMessag
4747
private Boolean includeMeta;
4848
@Setter
4949
private Boolean includeMessageActions;
50+
@Setter
51+
private boolean includeMessageType = true;
52+
@Setter
53+
private boolean includeUUID = true;
5054

5155
public FetchMessages(PubNub pubnub, TelemetryManager telemetryManager, RetrofitManager retrofit) {
5256
super(pubnub, telemetryManager, retrofit);
@@ -113,6 +117,8 @@ protected Call<FetchMessagesEnvelope> doWork(Map<String, String> params) throws
113117
if (includeMeta) {
114118
params.put("include_meta", String.valueOf(includeMeta));
115119
}
120+
params.put("include_uuid", Boolean.toString(includeUUID));
121+
params.put("include_message_type", Boolean.toString(includeMessageType));
116122

117123
if (!includeMessageActions) {
118124
return this.getRetrofit().getHistoryService().fetchMessages(
@@ -141,19 +147,17 @@ protected PNFetchMessagesResult createResponse(Response<FetchMessagesEnvelope> i
141147
List<PNFetchMessageItem> items = new ArrayList<>();
142148

143149
for (PNFetchMessageItem item : entry.getValue()) {
144-
PNFetchMessageItem.PNFetchMessageItemBuilder messageItemBuilder = PNFetchMessageItem.builder();
145-
messageItemBuilder.message(processMessage(item.getMessage()));
146-
messageItemBuilder.timetoken(item.getTimetoken());
147-
messageItemBuilder.meta(item.getMeta());
150+
PNFetchMessageItem.PNFetchMessageItemBuilder messageItemBuilder = item.toBuilder();
148151

149152
if (includeMessageActions) {
150153
if (item.getActions() != null) {
151154
messageItemBuilder.actions(item.getActions());
152155
} else {
153156
messageItemBuilder.actions(new HashMap<>());
154157
}
158+
} else {
159+
messageItemBuilder.actions(null);
155160
}
156-
157161
items.add(messageItemBuilder.build());
158162
}
159163

0 commit comments

Comments
 (0)