From f8ec7216eb191347a961ee14847d05adf9728ab0 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Tue, 1 Aug 2017 12:02:22 -0700 Subject: [PATCH 1/8] t --- src/main/java/com/box/sdk/utilities/BatchRequest.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/box/sdk/utilities/BatchRequest.java diff --git a/src/main/java/com/box/sdk/utilities/BatchRequest.java b/src/main/java/com/box/sdk/utilities/BatchRequest.java new file mode 100644 index 000000000..9516755ba --- /dev/null +++ b/src/main/java/com/box/sdk/utilities/BatchRequest.java @@ -0,0 +1,7 @@ +package com.box.sdk.utilities; + +/** + * + */ +public class BatchRequest { +} From 91c475ccd19d943efffeba11d0d872243d78a27e Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Mon, 14 Aug 2017 15:54:04 -0700 Subject: [PATCH 2/8] batch api initial support for list of BoxAPIRequests --- .../box/sdk/example/BatchRequestExample.java | 86 +++++++++++++++++++ .../java/com/box/sdk/BatchAPIRequest.java | 83 ++++++++++++++++++ src/main/java/com/box/sdk/BoxAPIRequest.java | 32 +++++-- src/main/java/com/box/sdk/BoxAPIResponse.java | 10 +++ .../java/com/box/sdk/BoxAPIResponseEvent.java | 16 ++++ .../java/com/box/sdk/BoxCollaboration.java | 8 +- src/main/java/com/box/sdk/BoxCollection.java | 4 +- src/main/java/com/box/sdk/BoxComment.java | 4 +- src/main/java/com/box/sdk/BoxDevicePin.java | 4 +- src/main/java/com/box/sdk/BoxFile.java | 32 +++---- src/main/java/com/box/sdk/BoxFileVersion.java | 4 +- .../com/box/sdk/BoxFileVersionLegalHold.java | 2 +- .../com/box/sdk/BoxFileVersionRetention.java | 4 +- src/main/java/com/box/sdk/BoxFolder.java | 24 +++--- src/main/java/com/box/sdk/BoxGroup.java | 10 +-- .../java/com/box/sdk/BoxGroupMembership.java | 2 +- src/main/java/com/box/sdk/BoxItem.java | 4 +- src/main/java/com/box/sdk/BoxJSONObject.java | 12 +++ src/main/java/com/box/sdk/BoxJSONRequest.java | 32 ++++++- .../com/box/sdk/BoxLegalHoldAssignment.java | 4 +- .../java/com/box/sdk/BoxLegalHoldPolicy.java | 8 +- src/main/java/com/box/sdk/BoxRecents.java | 2 +- .../java/com/box/sdk/BoxRetentionPolicy.java | 6 +- .../box/sdk/BoxRetentionPolicyAssignment.java | 4 +- src/main/java/com/box/sdk/BoxSearch.java | 2 +- src/main/java/com/box/sdk/BoxTask.java | 6 +- .../java/com/box/sdk/BoxTaskAssignment.java | 2 +- src/main/java/com/box/sdk/BoxTrash.java | 10 +-- src/main/java/com/box/sdk/BoxUser.java | 14 +-- src/main/java/com/box/sdk/BoxWebHook.java | 4 +- src/main/java/com/box/sdk/BoxWebLink.java | 4 +- src/main/java/com/box/sdk/EventLog.java | 2 +- src/main/java/com/box/sdk/EventStream.java | 2 +- src/main/java/com/box/sdk/Metadata.java | 2 +- .../java/com/box/sdk/MetadataTemplate.java | 6 +- .../com/box/sdk/RealtimeServerConnection.java | 4 +- src/main/java/com/box/sdk/URLTemplate.java | 6 +- .../java/com/box/sdk/http/HttpHeaders.java | 5 ++ .../com/box/sdk/utilities/BatchRequest.java | 7 -- src/test/java/com/box/sdk/BoxGroupTest.java | 2 +- 40 files changed, 364 insertions(+), 111 deletions(-) create mode 100644 src/example/java/com/box/sdk/example/BatchRequestExample.java create mode 100644 src/main/java/com/box/sdk/BatchAPIRequest.java create mode 100644 src/main/java/com/box/sdk/BoxAPIResponseEvent.java delete mode 100644 src/main/java/com/box/sdk/utilities/BatchRequest.java diff --git a/src/example/java/com/box/sdk/example/BatchRequestExample.java b/src/example/java/com/box/sdk/example/BatchRequestExample.java new file mode 100644 index 000000000..4f02b0864 --- /dev/null +++ b/src/example/java/com/box/sdk/example/BatchRequestExample.java @@ -0,0 +1,86 @@ +package com.box.sdk.utilities; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.box.sdk.BatchAPIRequest; +import com.box.sdk.BoxAPIRequest; +import com.box.sdk.BoxAPIResponse; +import com.box.sdk.BoxConfig; +import com.box.sdk.BoxDeveloperEditionAPIConnection; +import com.box.sdk.BoxFolder; +import com.box.sdk.BoxJSONRequest; +import com.box.sdk.BoxUser; +import com.box.sdk.IAccessTokenCache; +import com.box.sdk.InMemoryLRUAccessTokenCache; +import com.box.sdk.http.HttpMethod; +import com.eclipsesource.json.JsonObject; + +/** + * + */ +public class BatchRequestExample { + + private static final int MAX_CACHE_ENTRIES = 100; + private static final String APP_USER_NAME = "BATCH-TEST-APP-USER-NAME"; + + + public static void main(String[] args) throws IOException { + // Turn off logging to prevent polluting the output. + Logger.getLogger("com.box.sdk").setLevel(Level.OFF); + + + //It is a best practice to use an access token cache to prevent unneeded requests to Box for access tokens. + //For production applications it is recommended to use a distributed cache like Memcached or Redis, and to + //implement IAccessTokenCache to store and retrieve access tokens appropriately for your environment. + IAccessTokenCache accessTokenCache = new InMemoryLRUAccessTokenCache(MAX_CACHE_ENTRIES); + + Reader reader = new FileReader("src/example/config/config2.json"); + BoxConfig boxConfig = BoxConfig.readFrom(reader); + + BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection( + boxConfig, accessTokenCache); + + List requests = new ArrayList(); + + //Get current user request + URL getMeURL = BoxUser.GET_ME_URL.build(api.getBaseURL()); + BoxAPIRequest getMeRequest = new BoxAPIRequest(getMeURL, HttpMethod.GET); + requests.add(getMeRequest); + + //Create App User Request + URL createUserURL = BoxUser.USERS_URL_TEMPLATE.build(api.getBaseURL()); + BoxJSONRequest createAppUserRequest = new BoxJSONRequest(createUserURL, HttpMethod.POST); + JsonObject requestJSON = new JsonObject(); + requestJSON.add("name", APP_USER_NAME); + requestJSON.add("is_platform_access_only", true); + createAppUserRequest.setBody(requestJSON.toString()); + requests.add(createAppUserRequest); + + //Get Root Folder Request + URL getRootFolderURL = BoxFolder.FOLDER_INFO_URL_TEMPLATE.build(api.getBaseURL(), 0); + BoxAPIRequest getRootFolderRequest = new BoxAPIRequest(getRootFolderURL, HttpMethod.GET); + requests.add(getRootFolderRequest); + + BatchAPIRequest batchRequest = new BatchAPIRequest(api); + List responses = batchRequest.execute(requests); + + System.out.println("GET ME RESPONSE:"); + System.out.println("Response Code: " + responses.get(0).getResponseCode()); + System.out.println("Response: " + responses.get(0).getBodyAsString()); + + System.out.println("CREATE APP USER RESPONSE:"); + System.out.println("Response Code: " + responses.get(1).getResponseCode()); + System.out.println("Response: " + responses.get(1).getBodyAsString()); + + System.out.println("GET ROOT FOLDER RESPONSE:"); + System.out.println("Response Code: " + responses.get(2).getResponseCode()); + System.out.println("Response: " + responses.get(2).getBodyAsString()); + } +} diff --git a/src/main/java/com/box/sdk/BatchAPIRequest.java b/src/main/java/com/box/sdk/BatchAPIRequest.java new file mode 100644 index 000000000..b3121bf3a --- /dev/null +++ b/src/main/java/com/box/sdk/BatchAPIRequest.java @@ -0,0 +1,83 @@ +package com.box.sdk; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; + +import com.box.sdk.http.HttpHeaders; +import com.box.sdk.http.HttpMethod; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; +import org.jose4j.json.internal.json_simple.JSONArray; +import org.jose4j.json.internal.json_simple.JSONObject; + +/** + * + */ +public class BatchAPIRequest extends BoxJSONRequest{ + private static final Logger LOGGER = Logger.getLogger(BoxAPIRequest.class.getName()); + public static final URLTemplate RECENTS_URL_TEMPLATE = new URLTemplate("batch"); + private final BoxAPIConnection api; + + /** + * Constructs an authenticated BatchRequest using a provided BoxAPIConnection. + * @param api an API connection for authenticating the request. + */ + public BatchAPIRequest(BoxAPIConnection api) { + super(api, RECENTS_URL_TEMPLATE.build(api.getBaseURL()), HttpMethod.GET); + this.api = api; + } + + /** + * Execute a set of API calls as batch request + * @return + */ + public List execute(List requests) { + JsonObject body = new JsonObject(); + JsonArray requestsJSONArray = new JsonArray(); + for(BoxAPIRequest request: requests) { + JsonObject batchRequest = new JsonObject(); + batchRequest.add("method", request.getMethod()); + batchRequest.add("relative_url", request.getUrl().toString().substring(this.api.getBaseURL().length()-1)); + //If the actual request has a JSON body then add it to vatch request + if (request instanceof BoxJSONRequest) { + BoxJSONRequest jsonRequest = (BoxJSONRequest) request; + batchRequest.add("body", jsonRequest.getBodyAsJsonObject()); + } + //Add any headers that are in the request, except Authorization + if (request.getHeaders() != null) { + JsonObject batchRequestHeaders = new JsonObject(); + for(RequestHeader header: request.getHeaders()) { + if (header.getKey() != null && !header.getKey().isEmpty() + && HttpHeaders.AUTHORIZATION.equals(header.getKey())) { + batchRequestHeaders.add(header.getKey(), header.getValue()); + } + } + batchRequest.add("headers", batchRequestHeaders); + } + + //Add the request to array + requestsJSONArray.add(batchRequest); + } + //Add the requests array to body + body.add("requests", requestsJSONArray); + super.setBody(body); + + BoxJSONResponse batchResponse = (BoxJSONResponse) super.send(); + JsonObject responseJSON = JsonObject.readFrom(batchResponse.getJSON()); + List responses = new ArrayList(); + Iterator iterator = responseJSON.get("responses").asArray().iterator(); + while(iterator.hasNext()) { + JsonObject jsonResponse = iterator.next().asObject(); + BoxAPIResponse response = + new BoxAPIResponse(jsonResponse.get("status").asInt(), jsonResponse.get("response").toString()); + responses.add(response); + } + return responses; + } +} diff --git a/src/main/java/com/box/sdk/BoxAPIRequest.java b/src/main/java/com/box/sdk/BoxAPIRequest.java index e921bb50f..3b7acd679 100644 --- a/src/main/java/com/box/sdk/BoxAPIRequest.java +++ b/src/main/java/com/box/sdk/BoxAPIRequest.java @@ -14,6 +14,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import com.box.sdk.http.HttpHeaders; import com.box.sdk.http.HttpMethod; /** @@ -81,11 +82,20 @@ public BoxAPIRequest(BoxAPIConnection api, URL url, String method) { /** * Constructs an authenticated BoxAPIRequest using a provided BoxAPIConnection. * @param api an API connection for authenticating the request. - * @param uploadPartEndpoint the URL of the request. + * @param url the URL of the request. * @param method the HTTP method of the request. */ - public BoxAPIRequest(BoxAPIConnection api, URL uploadPartEndpoint, HttpMethod method) { - this(api, uploadPartEndpoint, method.name()); + public BoxAPIRequest(BoxAPIConnection api, URL url, HttpMethod method) { + this(api, url, method.name()); + } + + /** + * Constructs an authenticated BoxAPIRequest + * @param url the URL of the request. + * @param method the HTTP method of the request. + */ + public BoxAPIRequest(URL url, HttpMethod method) { + this(url, method.name()); } /** @@ -182,6 +192,18 @@ public URL getUrl() { return this.url; } + /** + * Gets the http method of the request. + * + * @return + */ + public String getMethod() { + return method; + } + + public List getHeaders() { + return this.headers; + } /** * Sends this request and returns a BoxAPIResponse containing the server's response. * @@ -377,7 +399,7 @@ private BoxAPIResponse trySend(ProgressListener listener) { if (this.api != null) { if (this.shouldAuthenticate) { - connection.addRequestProperty("Authorization", "Bearer " + this.api.lockAccessToken()); + connection.addRequestProperty(HttpHeaders.AUTHORIZATION, "Bearer " + this.api.lockAccessToken()); } connection.setRequestProperty("User-Agent", this.api.getUserAgent()); if (this.api.getProxy() != null) { @@ -533,7 +555,7 @@ private static boolean isResponseRedirect(int responseCode) { return (responseCode == 301 || responseCode == 302); } - private final class RequestHeader { + public final class RequestHeader { private final String key; private final String value; diff --git a/src/main/java/com/box/sdk/BoxAPIResponse.java b/src/main/java/com/box/sdk/BoxAPIResponse.java index 424ae94b5..8f9abce6e 100644 --- a/src/main/java/com/box/sdk/BoxAPIResponse.java +++ b/src/main/java/com/box/sdk/BoxAPIResponse.java @@ -50,6 +50,12 @@ public BoxAPIResponse() { this.connection = null; } + public BoxAPIResponse(int responseCode, String body) { + this.connection = null; + this.responseCode = responseCode; + this.bodyString = body; + } + /** * Constructs a BoxAPIResponse using an HttpURLConnection. * @param connection a connection that has already sent a request to the API. @@ -106,6 +112,10 @@ public InputStream getBody() { return this.getBody(null); } + public String getBodyAsString() { + return this.bodyString; + } + /** * Gets an InputStream for reading this response's body which will report its read progress to a ProgressListener. * @param listener a listener for monitoring the read progress of the body. diff --git a/src/main/java/com/box/sdk/BoxAPIResponseEvent.java b/src/main/java/com/box/sdk/BoxAPIResponseEvent.java new file mode 100644 index 000000000..6648b9a02 --- /dev/null +++ b/src/main/java/com/box/sdk/BoxAPIResponseEvent.java @@ -0,0 +1,16 @@ +package com.box.sdk; + +/** + * + */ +public interface BoxAPIResponseEvent { + /** + * Called on success + */ + void onSuccess(); + + /** + * Called on failure + */ + void onFailure(); +} diff --git a/src/main/java/com/box/sdk/BoxCollaboration.java b/src/main/java/com/box/sdk/BoxCollaboration.java index 0fa86e36c..aadf43e7f 100644 --- a/src/main/java/com/box/sdk/BoxCollaboration.java +++ b/src/main/java/com/box/sdk/BoxCollaboration.java @@ -20,10 +20,10 @@ */ @BoxResourceType("collaboration") public class BoxCollaboration extends BoxResource { - private static final URLTemplate COLLABORATIONS_URL_TEMPLATE = new URLTemplate("collaborations"); - private static final URLTemplate PENDING_COLLABORATIONS_URL = new URLTemplate("collaborations?status=pending"); - private static final URLTemplate COLLABORATION_URL_TEMPLATE = new URLTemplate("collaborations/%s"); - private static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations/"); + public static final URLTemplate COLLABORATIONS_URL_TEMPLATE = new URLTemplate("collaborations"); + public static final URLTemplate PENDING_COLLABORATIONS_URL = new URLTemplate("collaborations?status=pending"); + public static final URLTemplate COLLABORATION_URL_TEMPLATE = new URLTemplate("collaborations/%s"); + public static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations/"); /** * Constructs a BoxCollaboration for a collaboration with a given ID. diff --git a/src/main/java/com/box/sdk/BoxCollection.java b/src/main/java/com/box/sdk/BoxCollection.java index 08cd23294..ab4ffad07 100644 --- a/src/main/java/com/box/sdk/BoxCollection.java +++ b/src/main/java/com/box/sdk/BoxCollection.java @@ -18,8 +18,8 @@ @BoxResourceType("collection") public class BoxCollection extends BoxResource implements Iterable { - private static final URLTemplate GET_COLLECTIONS_URL_TEMPLATE = new URLTemplate("collections/"); - private static final URLTemplate GET_COLLECTION_ITEMS_URL = new URLTemplate("collections/%s/items/"); + public static final URLTemplate GET_COLLECTIONS_URL_TEMPLATE = new URLTemplate("collections/"); + public static final URLTemplate GET_COLLECTION_ITEMS_URL = new URLTemplate("collections/%s/items/"); /** * Constructs a BoxCollection for a collection with a given ID. diff --git a/src/main/java/com/box/sdk/BoxComment.java b/src/main/java/com/box/sdk/BoxComment.java index c72475ec3..5a7ddae23 100644 --- a/src/main/java/com/box/sdk/BoxComment.java +++ b/src/main/java/com/box/sdk/BoxComment.java @@ -19,8 +19,8 @@ @BoxResourceType("comment") public class BoxComment extends BoxResource { private static final Pattern MENTION_REGEX = Pattern.compile("@\\[.+:.+\\]"); - private static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); - private static final URLTemplate COMMENT_URL_TEMPLATE = new URLTemplate("comments/%s"); + public static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); + public static final URLTemplate COMMENT_URL_TEMPLATE = new URLTemplate("comments/%s"); /** * Constructs a BoxComment for a comment with a given ID. diff --git a/src/main/java/com/box/sdk/BoxDevicePin.java b/src/main/java/com/box/sdk/BoxDevicePin.java index 27184be06..4eaf94eef 100644 --- a/src/main/java/com/box/sdk/BoxDevicePin.java +++ b/src/main/java/com/box/sdk/BoxDevicePin.java @@ -20,12 +20,12 @@ public class BoxDevicePin extends BoxResource { /** * The URL template used for operation with the device pin. */ - private static final URLTemplate DEVICE_PIN_URL_TEMPLATE = new URLTemplate("device_pinners/%s"); + public static final URLTemplate DEVICE_PIN_URL_TEMPLATE = new URLTemplate("device_pinners/%s"); /** * The URL template used to get all the device pins within a given enterprise. */ - private static final URLTemplate ENTERPRISE_DEVICE_PINS_TEMPLATE = new URLTemplate("enterprises/%s/device_pinners"); + public static final URLTemplate ENTERPRISE_DEVICE_PINS_TEMPLATE = new URLTemplate("enterprises/%s/device_pinners"); /** * Default limit of the device info entries per one response page. diff --git a/src/main/java/com/box/sdk/BoxFile.java b/src/main/java/com/box/sdk/BoxFile.java index 14c5797c0..525d67e90 100644 --- a/src/main/java/com/box/sdk/BoxFile.java +++ b/src/main/java/com/box/sdk/BoxFile.java @@ -55,24 +55,24 @@ public enum ThumbnailFileType { JPG } - private static final URLTemplate FILE_URL_TEMPLATE = new URLTemplate("files/%s"); - private static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content"); - private static final URLTemplate VERSIONS_URL_TEMPLATE = new URLTemplate("files/%s/versions"); - private static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("files/%s/copy"); - private static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); - private static final URLTemplate GET_COMMENTS_URL_TEMPLATE = new URLTemplate("files/%s/comments"); - private static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("files/%s/metadata/%s/%s"); - private static final URLTemplate ADD_TASK_URL_TEMPLATE = new URLTemplate("tasks"); - private static final URLTemplate GET_TASKS_URL_TEMPLATE = new URLTemplate("files/%s/tasks"); - private static final URLTemplate GET_THUMBNAIL_PNG_TEMPLATE = new URLTemplate("files/%s/thumbnail.png"); - private static final URLTemplate GET_THUMBNAIL_JPG_TEMPLATE = new URLTemplate("files/%s/thumbnail.jpg"); - private static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/%s/upload_sessions"); - private static final URLTemplate UPLOAD_SESSION_STATUS_URL_TEMPLATE = new URLTemplate( + public static final URLTemplate FILE_URL_TEMPLATE = new URLTemplate("files/%s"); + public static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content"); + public static final URLTemplate VERSIONS_URL_TEMPLATE = new URLTemplate("files/%s/versions"); + public static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("files/%s/copy"); + public static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); + public static final URLTemplate GET_COMMENTS_URL_TEMPLATE = new URLTemplate("files/%s/comments"); + public static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("files/%s/metadata/%s/%s"); + public static final URLTemplate ADD_TASK_URL_TEMPLATE = new URLTemplate("tasks"); + public static final URLTemplate GET_TASKS_URL_TEMPLATE = new URLTemplate("files/%s/tasks"); + public static final URLTemplate GET_THUMBNAIL_PNG_TEMPLATE = new URLTemplate("files/%s/thumbnail.png"); + public static final URLTemplate GET_THUMBNAIL_JPG_TEMPLATE = new URLTemplate("files/%s/thumbnail.jpg"); + public static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/%s/upload_sessions"); + public static final URLTemplate UPLOAD_SESSION_STATUS_URL_TEMPLATE = new URLTemplate( "files/upload_sessions/%s/status"); - private static final URLTemplate ABORT_UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions/%s"); + public static final URLTemplate ABORT_UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions/%s"); - private static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); - private static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations"); + public static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); + public static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations"); private static final int BUFFER_SIZE = 8192; private static final int GET_COLLABORATORS_PAGE_SIZE = 1000; diff --git a/src/main/java/com/box/sdk/BoxFileVersion.java b/src/main/java/com/box/sdk/BoxFileVersion.java index e5792ea00..059efe848 100644 --- a/src/main/java/com/box/sdk/BoxFileVersion.java +++ b/src/main/java/com/box/sdk/BoxFileVersion.java @@ -15,8 +15,8 @@ */ @BoxResourceType("file_version") public class BoxFileVersion extends BoxResource { - private static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content?version=%s"); - private static final URLTemplate VERSION_URL_TEMPLATE = new URLTemplate("files/%s/versions/%s"); + public static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content?version=%s"); + public static final URLTemplate VERSION_URL_TEMPLATE = new URLTemplate("files/%s/versions/%s"); private static final int BUFFER_SIZE = 8192; private String fileID; diff --git a/src/main/java/com/box/sdk/BoxFileVersionLegalHold.java b/src/main/java/com/box/sdk/BoxFileVersionLegalHold.java index 4afd48cd3..6766fa05f 100644 --- a/src/main/java/com/box/sdk/BoxFileVersionLegalHold.java +++ b/src/main/java/com/box/sdk/BoxFileVersionLegalHold.java @@ -21,7 +21,7 @@ public class BoxFileVersionLegalHold extends BoxResource { * The URL template used for operation with file version legal hold with given ID. * @see #getInfo(String...) */ - private static final URLTemplate FILE_VERSION_HOLD_URL_TEMPLATE = new URLTemplate("file_version_legal_holds/%s"); + public static final URLTemplate FILE_VERSION_HOLD_URL_TEMPLATE = new URLTemplate("file_version_legal_holds/%s"); /** * Constructs a file version legal hold with a given ID. diff --git a/src/main/java/com/box/sdk/BoxFileVersionRetention.java b/src/main/java/com/box/sdk/BoxFileVersionRetention.java index a2615473c..b477991a9 100644 --- a/src/main/java/com/box/sdk/BoxFileVersionRetention.java +++ b/src/main/java/com/box/sdk/BoxFileVersionRetention.java @@ -25,12 +25,12 @@ public class BoxFileVersionRetention extends BoxResource { /** * @see #getInfo(String...) */ - private static final URLTemplate RETENTION_URL_TEMPLATE = new URLTemplate("file_version_retentions/%s"); + public static final URLTemplate RETENTION_URL_TEMPLATE = new URLTemplate("file_version_retentions/%s"); /** * The URL template used for operation with file version retentions. */ - private static final URLTemplate ALL_RETENTIONS_URL_TEMPLATE = new URLTemplate("file_version_retentions"); + public static final URLTemplate ALL_RETENTIONS_URL_TEMPLATE = new URLTemplate("file_version_retentions"); /** * The default limit of entries per response. diff --git a/src/main/java/com/box/sdk/BoxFolder.java b/src/main/java/com/box/sdk/BoxFolder.java index 3b9c9a4a4..57c8e3036 100644 --- a/src/main/java/com/box/sdk/BoxFolder.java +++ b/src/main/java/com/box/sdk/BoxFolder.java @@ -33,18 +33,18 @@ public class BoxFolder extends BoxItem implements Iterable { "item_status", "item_collection", "sync_state", "has_collaborations", "permissions", "tags", "can_non_owners_invite", "collections", "watermark_info"}; - private static final URLTemplate CREATE_FOLDER_URL = new URLTemplate("folders"); - private static final URLTemplate CREATE_WEB_LINK_URL = new URLTemplate("web_links"); - private static final URLTemplate COPY_FOLDER_URL = new URLTemplate("folders/%s/copy"); - private static final URLTemplate DELETE_FOLDER_URL = new URLTemplate("folders/%s?recursive=%b"); - private static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s"); - private static final URLTemplate UPLOAD_FILE_URL = new URLTemplate("files/content"); - private static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); - private static final URLTemplate GET_COLLABORATIONS_URL = new URLTemplate("folders/%s/collaborations"); - private static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/%s/items/"); - private static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); - private static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("folders/%s/metadata/%s/%s"); - private static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions"); + public static final URLTemplate CREATE_FOLDER_URL = new URLTemplate("folders"); + public static final URLTemplate CREATE_WEB_LINK_URL = new URLTemplate("web_links"); + public static final URLTemplate COPY_FOLDER_URL = new URLTemplate("folders/%s/copy"); + public static final URLTemplate DELETE_FOLDER_URL = new URLTemplate("folders/%s?recursive=%b"); + public static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s"); + public static final URLTemplate UPLOAD_FILE_URL = new URLTemplate("files/content"); + public static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); + public static final URLTemplate GET_COLLABORATIONS_URL = new URLTemplate("folders/%s/collaborations"); + public static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/%s/items/"); + public static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); + public static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("folders/%s/metadata/%s/%s"); + public static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions"); /** * Constructs a BoxFolder for a folder with a given ID. diff --git a/src/main/java/com/box/sdk/BoxGroup.java b/src/main/java/com/box/sdk/BoxGroup.java index b8f110973..62e78ab25 100644 --- a/src/main/java/com/box/sdk/BoxGroup.java +++ b/src/main/java/com/box/sdk/BoxGroup.java @@ -23,27 +23,27 @@ public class BoxGroup extends BoxCollaborator { /** * @see #getAllGroups(BoxAPIConnection, String...) */ - private static final URLTemplate GROUPS_URL_TEMPLATE = new URLTemplate("groups"); + public static final URLTemplate GROUPS_URL_TEMPLATE = new URLTemplate("groups"); /** * @see #getInfo() */ - private static final URLTemplate GROUP_URL_TEMPLATE = new URLTemplate("groups/%s"); + public static final URLTemplate GROUP_URL_TEMPLATE = new URLTemplate("groups/%s"); /** * @see #getMemberships() */ - private static final URLTemplate MEMBERSHIPS_URL_TEMPLATE = new URLTemplate("groups/%s/memberships"); + public static final URLTemplate MEMBERSHIPS_URL_TEMPLATE = new URLTemplate("groups/%s/memberships"); /** * @see #addMembership(BoxUser) */ - private static final URLTemplate ADD_MEMBERSHIP_URL_TEMPLATE = new URLTemplate("group_memberships"); + public static final URLTemplate ADD_MEMBERSHIP_URL_TEMPLATE = new URLTemplate("group_memberships"); /** * @see #getCollaborations() */ - private static final URLTemplate COLLABORATIONS_URL_TEMPLATE = new URLTemplate("groups/%s/collaborations"); + public static final URLTemplate COLLABORATIONS_URL_TEMPLATE = new URLTemplate("groups/%s/collaborations"); /** * Constructs a BoxGroup for a group with a given ID. diff --git a/src/main/java/com/box/sdk/BoxGroupMembership.java b/src/main/java/com/box/sdk/BoxGroupMembership.java index 8d4781867..2ef92b251 100644 --- a/src/main/java/com/box/sdk/BoxGroupMembership.java +++ b/src/main/java/com/box/sdk/BoxGroupMembership.java @@ -21,7 +21,7 @@ public class BoxGroupMembership extends BoxResource { * The URL template for all group membership requests. * @see #getInfo() */ - private static final URLTemplate MEMBERSHIP_URL_TEMPLATE = new URLTemplate("group_memberships/%s"); + public static final URLTemplate MEMBERSHIP_URL_TEMPLATE = new URLTemplate("group_memberships/%s"); /** * Constructs a BoxGroupMembership for a group membership with a given ID. diff --git a/src/main/java/com/box/sdk/BoxItem.java b/src/main/java/com/box/sdk/BoxItem.java index dd1174b76..a5692ccbc 100644 --- a/src/main/java/com/box/sdk/BoxItem.java +++ b/src/main/java/com/box/sdk/BoxItem.java @@ -26,12 +26,12 @@ public abstract class BoxItem extends BoxResource { "folder_upload_email", "item_collection", "sync_state", "has_collaborations", "can_non_owners_invite", "file_version", "collections"}; - private static final URLTemplate SHARED_ITEM_URL_TEMPLATE = new URLTemplate("shared_items"); + public static final URLTemplate SHARED_ITEM_URL_TEMPLATE = new URLTemplate("shared_items"); /** * Url template for operations with watermarks. */ - private static final URLTemplate WATERMARK_URL_TEMPLATE = new URLTemplate("/watermark"); + public static final URLTemplate WATERMARK_URL_TEMPLATE = new URLTemplate("/watermark"); /** * Constructs a BoxItem for an item with a given ID. diff --git a/src/main/java/com/box/sdk/BoxJSONObject.java b/src/main/java/com/box/sdk/BoxJSONObject.java index 09bd9294e..f380eb504 100644 --- a/src/main/java/com/box/sdk/BoxJSONObject.java +++ b/src/main/java/com/box/sdk/BoxJSONObject.java @@ -72,6 +72,18 @@ public String getPendingChanges() { return jsonObject.toString(); } + /** + * Gets a JSON string containing any pending changes to this object that can be sent back to the Box API. + * @return a JSON string containing the pending changes. + */ + public JsonObject getPendingChangesAsJsonObject() { + JsonObject jsonObject = this.getPendingJSONObject(); + if (jsonObject == null) { + return null; + } + return jsonObject; + } + /** * Invoked with a JSON member whenever this object is updated or created from a JSON object. * diff --git a/src/main/java/com/box/sdk/BoxJSONRequest.java b/src/main/java/com/box/sdk/BoxJSONRequest.java index 1c86b1241..9c3c2e991 100644 --- a/src/main/java/com/box/sdk/BoxJSONRequest.java +++ b/src/main/java/com/box/sdk/BoxJSONRequest.java @@ -3,6 +3,7 @@ import java.net.URL; import com.box.sdk.http.HttpMethod; +import com.eclipsesource.json.JsonObject; /** * Used to make HTTP requests containing JSON to the Box API. @@ -11,7 +12,7 @@ * automatically sets the appropriate "Content-Type" HTTP headers and allows the JSON in the request to be logged.

*/ public class BoxJSONRequest extends BoxAPIRequest { - private String json; + private JsonObject json; /** * Constructs an authenticated BoxJSONRequest using a provided BoxAPIConnection. @@ -21,7 +22,6 @@ public class BoxJSONRequest extends BoxAPIRequest { */ public BoxJSONRequest(BoxAPIConnection api, URL url, String method) { super(api, url, method); - this.addHeader("Content-Type", "application/json"); } @@ -33,7 +33,16 @@ public BoxJSONRequest(BoxAPIConnection api, URL url, String method) { */ public BoxJSONRequest(BoxAPIConnection api, URL url, HttpMethod method) { super(api, url, method); + this.addHeader("Content-Type", "application/json"); + } + /** + * Constructs an authenticated BoxJSONRequest + * @param url the URL of the request. + * @param method the HTTP method of the request. + */ + public BoxJSONRequest(URL url, HttpMethod method) { + super(url, method); this.addHeader("Content-Type", "application/json"); } @@ -44,11 +53,28 @@ public BoxJSONRequest(BoxAPIConnection api, URL url, HttpMethod method) { @Override public void setBody(String body) { super.setBody(body); + this.json = JsonObject.readFrom(body); + } + + /** + * Sets the body of this request to a given JsonObject. + * @param body the JsonObject to use as the body. + */ + public void setBody(JsonObject body) { + super.setBody(body.toString()); this.json = body; } + /** + * + * @return + */ + public JsonObject getBodyAsJsonObject() { + return this.json; + } + @Override protected String bodyToString() { - return this.json; + return this.json.asString(); } } diff --git a/src/main/java/com/box/sdk/BoxLegalHoldAssignment.java b/src/main/java/com/box/sdk/BoxLegalHoldAssignment.java index 1c24c6305..b312c1a6c 100644 --- a/src/main/java/com/box/sdk/BoxLegalHoldAssignment.java +++ b/src/main/java/com/box/sdk/BoxLegalHoldAssignment.java @@ -43,12 +43,12 @@ public class BoxLegalHoldAssignment extends BoxResource { /** * The URL template used for operation with legal hold policy assignments. */ - private static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("legal_hold_policy_assignments"); + public static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("legal_hold_policy_assignments"); /** * The URL template used for operation with legal hold policy assignment with given ID. */ - private static final URLTemplate LEGAL_HOLD_ASSIGNMENT_URL_TEMPLATE + public static final URLTemplate LEGAL_HOLD_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("legal_hold_policy_assignments/%s"); /** diff --git a/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java b/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java index 1a8bb1957..85ed9c62a 100644 --- a/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java +++ b/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java @@ -20,11 +20,11 @@ @BoxResourceType("legal_hold") public class BoxLegalHoldPolicy extends BoxResource { - private static final URLTemplate LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies/%s"); - private static final URLTemplate ALL_LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies"); - private static final URLTemplate LEGAL_HOLD_ASSIGNMENTS_URL_TEMPLATE + public static final URLTemplate LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies/%s"); + public static final URLTemplate ALL_LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies"); + public static final URLTemplate LEGAL_HOLD_ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("legal_hold_policies/%s/assignments"); - private static final URLTemplate LIST_OF_FILE_VERSION_HOLDS_URL_TEMPLATE + public static final URLTemplate LIST_OF_FILE_VERSION_HOLDS_URL_TEMPLATE = new URLTemplate("file_version_legal_holds"); private static final int DEFAULT_LIMIT = 100; diff --git a/src/main/java/com/box/sdk/BoxRecents.java b/src/main/java/com/box/sdk/BoxRecents.java index ee7d64ef2..74d075f6a 100644 --- a/src/main/java/com/box/sdk/BoxRecents.java +++ b/src/main/java/com/box/sdk/BoxRecents.java @@ -8,7 +8,7 @@ */ public final class BoxRecents { - private static final URLTemplate RECENTS_URL_TEMPLATE = new URLTemplate("recent_items"); + public static final URLTemplate RECENTS_URL_TEMPLATE = new URLTemplate("recent_items"); //Constructor is not allowed private BoxRecents() { diff --git a/src/main/java/com/box/sdk/BoxRetentionPolicy.java b/src/main/java/com/box/sdk/BoxRetentionPolicy.java index e0481014e..b54183507 100644 --- a/src/main/java/com/box/sdk/BoxRetentionPolicy.java +++ b/src/main/java/com/box/sdk/BoxRetentionPolicy.java @@ -60,17 +60,17 @@ public class BoxRetentionPolicy extends BoxResource { /** * The URL template used for operation with retention policies. */ - private static final URLTemplate RETENTION_POLICIES_URL_TEMPLATE = new URLTemplate("retention_policies"); + public static final URLTemplate RETENTION_POLICIES_URL_TEMPLATE = new URLTemplate("retention_policies"); /** * The URL template used for operation with retention policy with given ID. */ - private static final URLTemplate POLICY_URL_TEMPLATE = new URLTemplate("retention_policies/%s"); + public static final URLTemplate POLICY_URL_TEMPLATE = new URLTemplate("retention_policies/%s"); /** * The URL template used for operation with retention policy assignments. */ - private static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policies/%s/assignments"); + public static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policies/%s/assignments"); /** * Constructs a retention policy for a resource with a given ID. diff --git a/src/main/java/com/box/sdk/BoxRetentionPolicyAssignment.java b/src/main/java/com/box/sdk/BoxRetentionPolicyAssignment.java index 945125f7b..883b32198 100644 --- a/src/main/java/com/box/sdk/BoxRetentionPolicyAssignment.java +++ b/src/main/java/com/box/sdk/BoxRetentionPolicyAssignment.java @@ -30,12 +30,12 @@ public class BoxRetentionPolicyAssignment extends BoxResource { /** * The URL template used for operation with retention policy assignments. */ - private static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policy_assignments"); + public static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policy_assignments"); /** * The URL template used for operation with retention policy assignment with given ID. */ - private static final URLTemplate RETENTION_POLICY_ASSIGNMENT_URL_TEMPLATE + public static final URLTemplate RETENTION_POLICY_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("retention_policy_assignments/%s"); /** diff --git a/src/main/java/com/box/sdk/BoxSearch.java b/src/main/java/com/box/sdk/BoxSearch.java index dffa6fc32..522c2a424 100644 --- a/src/main/java/com/box/sdk/BoxSearch.java +++ b/src/main/java/com/box/sdk/BoxSearch.java @@ -14,7 +14,7 @@ */ public class BoxSearch { - private static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); + public static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); private final BoxAPIConnection api; /** diff --git a/src/main/java/com/box/sdk/BoxTask.java b/src/main/java/com/box/sdk/BoxTask.java index 115a50ce2..74ec69ee8 100644 --- a/src/main/java/com/box/sdk/BoxTask.java +++ b/src/main/java/com/box/sdk/BoxTask.java @@ -17,9 +17,9 @@ @BoxResourceType("task") public class BoxTask extends BoxResource { - private static final URLTemplate TASK_URL_TEMPLATE = new URLTemplate("tasks/%s"); - private static final URLTemplate GET_ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("tasks/%s/assignments"); - private static final URLTemplate ADD_TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments"); + public static final URLTemplate TASK_URL_TEMPLATE = new URLTemplate("tasks/%s"); + public static final URLTemplate GET_ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("tasks/%s/assignments"); + public static final URLTemplate ADD_TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments"); /** * Constructs a BoxTask for a task with a given ID. diff --git a/src/main/java/com/box/sdk/BoxTaskAssignment.java b/src/main/java/com/box/sdk/BoxTaskAssignment.java index 46f354e86..728cfa9df 100644 --- a/src/main/java/com/box/sdk/BoxTaskAssignment.java +++ b/src/main/java/com/box/sdk/BoxTaskAssignment.java @@ -14,7 +14,7 @@ @BoxResourceType("task_assignment") public class BoxTaskAssignment extends BoxResource { - private static final URLTemplate TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments/%s"); + public static final URLTemplate TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments/%s"); /** * Constructs a BoxTaskAssignment for a task assignment with a given ID. diff --git a/src/main/java/com/box/sdk/BoxTrash.java b/src/main/java/com/box/sdk/BoxTrash.java index a7814c898..ff4bd9e27 100644 --- a/src/main/java/com/box/sdk/BoxTrash.java +++ b/src/main/java/com/box/sdk/BoxTrash.java @@ -14,11 +14,11 @@ */ public class BoxTrash implements Iterable { private static final long LIMIT = 1000; - private static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/trash/items/"); - private static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s/trash"); - private static final URLTemplate FILE_INFO_URL_TEMPLATE = new URLTemplate("files/%s/trash"); - private static final URLTemplate RESTORE_FILE_URL_TEMPLATE = new URLTemplate("files/%s"); - private static final URLTemplate RESTORE_FOLDER_URL_TEMPLATE = new URLTemplate("folders/%s"); + public static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/trash/items/"); + public static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s/trash"); + public static final URLTemplate FILE_INFO_URL_TEMPLATE = new URLTemplate("files/%s/trash"); + public static final URLTemplate RESTORE_FILE_URL_TEMPLATE = new URLTemplate("files/%s"); + public static final URLTemplate RESTORE_FOLDER_URL_TEMPLATE = new URLTemplate("folders/%s"); private final BoxAPIConnection api; diff --git a/src/main/java/com/box/sdk/BoxUser.java b/src/main/java/com/box/sdk/BoxUser.java index 8de344c2d..3575f2f0f 100644 --- a/src/main/java/com/box/sdk/BoxUser.java +++ b/src/main/java/com/box/sdk/BoxUser.java @@ -29,13 +29,13 @@ public class BoxUser extends BoxCollaborator { "address", "avatar_url", "is_exempt_from_device_limits", "is_exempt_from_login_verification", "enterprise", "my_tags", "hostname", "is_platform_access_only", "external_app_user_id"}; - private static final URLTemplate USER_URL_TEMPLATE = new URLTemplate("users/%s"); - private static final URLTemplate GET_ME_URL = new URLTemplate("users/me"); - private static final URLTemplate USERS_URL_TEMPLATE = new URLTemplate("users"); - private static final URLTemplate USER_MEMBERSHIPS_URL_TEMPLATE = new URLTemplate("users/%s/memberships"); - private static final URLTemplate EMAIL_ALIAS_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases/%s"); - private static final URLTemplate EMAIL_ALIASES_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases"); - private static final URLTemplate MOVE_FOLDER_TO_USER_TEMPLATE = new URLTemplate("users/%s/folders/%s"); + public static final URLTemplate USER_URL_TEMPLATE = new URLTemplate("users/%s"); + public static final URLTemplate GET_ME_URL = new URLTemplate("users/me"); + public static final URLTemplate USERS_URL_TEMPLATE = new URLTemplate("users"); + public static final URLTemplate USER_MEMBERSHIPS_URL_TEMPLATE = new URLTemplate("users/%s/memberships"); + public static final URLTemplate EMAIL_ALIAS_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases/%s"); + public static final URLTemplate EMAIL_ALIASES_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases"); + public static final URLTemplate MOVE_FOLDER_TO_USER_TEMPLATE = new URLTemplate("users/%s/folders/%s"); /** * Constructs a BoxUser for a user with a given ID. diff --git a/src/main/java/com/box/sdk/BoxWebHook.java b/src/main/java/com/box/sdk/BoxWebHook.java index 266548bfe..f866a204f 100644 --- a/src/main/java/com/box/sdk/BoxWebHook.java +++ b/src/main/java/com/box/sdk/BoxWebHook.java @@ -68,11 +68,11 @@ public class BoxWebHook extends BoxResource { /** * {@link URLTemplate} for {@link BoxWebHook}s resource. */ - private static final URLTemplate WEBHOOKS_URL_TEMPLATE = new URLTemplate("webhooks"); + public static final URLTemplate WEBHOOKS_URL_TEMPLATE = new URLTemplate("webhooks"); /** * {@link URLTemplate} for single {@link BoxWebHook} resource. */ - private static final URLTemplate WEBHOOK_URL_TEMPLATE = new URLTemplate("webhooks/%s"); + public static final URLTemplate WEBHOOK_URL_TEMPLATE = new URLTemplate("webhooks/%s"); /** * Maps a {@link Trigger} to its {@link Trigger#getValue()}. diff --git a/src/main/java/com/box/sdk/BoxWebLink.java b/src/main/java/com/box/sdk/BoxWebLink.java index bb18d77ac..3da2fbe67 100644 --- a/src/main/java/com/box/sdk/BoxWebLink.java +++ b/src/main/java/com/box/sdk/BoxWebLink.java @@ -26,8 +26,8 @@ public class BoxWebLink extends BoxItem { "path_collection", "created_at", "modified_at", "trashed_at", "purged_at", "created_by", "modified_by", "owned_by", "shared_link", "parent", "item_status", "collections"}; - private static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("web_links/%s/copy"); - private static final URLTemplate WEB_LINK_URL_TEMPLATE = new URLTemplate("web_links/%s"); + public static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("web_links/%s/copy"); + public static final URLTemplate WEB_LINK_URL_TEMPLATE = new URLTemplate("web_links/%s"); /** * Constructs a BoxWebLink for a weblink with a given ID. diff --git a/src/main/java/com/box/sdk/EventLog.java b/src/main/java/com/box/sdk/EventLog.java index 618867f4c..77dc47fa9 100644 --- a/src/main/java/com/box/sdk/EventLog.java +++ b/src/main/java/com/box/sdk/EventLog.java @@ -20,7 +20,7 @@ */ public class EventLog implements Iterable { private static final int ENTERPRISE_LIMIT = 500; - private static final URLTemplate ENTERPRISE_EVENT_URL_TEMPLATE = new URLTemplate("events?stream_type=admin_logs&" + public static final URLTemplate ENTERPRISE_EVENT_URL_TEMPLATE = new URLTemplate("events?stream_type=admin_logs&" + "limit=" + ENTERPRISE_LIMIT); private final int chunkSize; diff --git a/src/main/java/com/box/sdk/EventStream.java b/src/main/java/com/box/sdk/EventStream.java index 471c2412d..3bbc110a3 100644 --- a/src/main/java/com/box/sdk/EventStream.java +++ b/src/main/java/com/box/sdk/EventStream.java @@ -20,7 +20,7 @@ */ public class EventStream { private static final int LIMIT = 800; - private static final URLTemplate EVENT_URL = new URLTemplate("events?limit=" + LIMIT + "&stream_position=%s"); + public static final URLTemplate EVENT_URL = new URLTemplate("events?limit=" + LIMIT + "&stream_position=%s"); private static final int STREAM_POSITION_NOW = -1; private final BoxAPIConnection api; diff --git a/src/main/java/com/box/sdk/Metadata.java b/src/main/java/com/box/sdk/Metadata.java index 02f446450..7f8e499e2 100644 --- a/src/main/java/com/box/sdk/Metadata.java +++ b/src/main/java/com/box/sdk/Metadata.java @@ -38,7 +38,7 @@ public class Metadata { /** * URL template for all metadata associated with item. */ - private static final URLTemplate GET_ALL_METADATA_URL_TEMPLATE = new URLTemplate("/metadata"); + public static final URLTemplate GET_ALL_METADATA_URL_TEMPLATE = new URLTemplate("/metadata"); /** * Values contained by the metadata object. diff --git a/src/main/java/com/box/sdk/MetadataTemplate.java b/src/main/java/com/box/sdk/MetadataTemplate.java index e38c26c14..86ac90435 100644 --- a/src/main/java/com/box/sdk/MetadataTemplate.java +++ b/src/main/java/com/box/sdk/MetadataTemplate.java @@ -21,19 +21,19 @@ public class MetadataTemplate extends BoxJSONObject { /** * @see #getMetadataTemplate(BoxAPIConnection) */ - private static final URLTemplate METADATA_TEMPLATE_URL_TEMPLATE + public static final URLTemplate METADATA_TEMPLATE_URL_TEMPLATE = new URLTemplate("metadata_templates/%s/%s/schema"); /** * @see #createMetadataTemplate(BoxAPIConnection, String, String, String, boolean, List) */ - private static final URLTemplate METADATA_TEMPLATE_SCHEMA_URL_TEMPLATE + public static final URLTemplate METADATA_TEMPLATE_SCHEMA_URL_TEMPLATE = new URLTemplate("metadata_templates/schema"); /** * @see #getEnterpriseMetadataTemplates(String, int, BoxAPIConnection, String...) */ - private static final URLTemplate ENTERPRISE_METADATA_URL_TEMPLATE = new URLTemplate("metadata_templates/%s"); + public static final URLTemplate ENTERPRISE_METADATA_URL_TEMPLATE = new URLTemplate("metadata_templates/%s"); /** * Default metadata type to be used in query. diff --git a/src/main/java/com/box/sdk/RealtimeServerConnection.java b/src/main/java/com/box/sdk/RealtimeServerConnection.java index 82e461ef0..47faaa682 100644 --- a/src/main/java/com/box/sdk/RealtimeServerConnection.java +++ b/src/main/java/com/box/sdk/RealtimeServerConnection.java @@ -7,8 +7,8 @@ import com.eclipsesource.json.JsonObject; class RealtimeServerConnection { - private static final URLTemplate EVENT_URL = new URLTemplate("events"); - private static final URLTemplate EVENT_POSITION_URL = new URLTemplate("events?stream_position=%s"); + public static final URLTemplate EVENT_URL = new URLTemplate("events"); + public static final URLTemplate EVENT_POSITION_URL = new URLTemplate("events?stream_position=%s"); private final BoxAPIConnection api; private final int timeout; diff --git a/src/main/java/com/box/sdk/URLTemplate.java b/src/main/java/com/box/sdk/URLTemplate.java index 15208de52..fb5b4b5e9 100644 --- a/src/main/java/com/box/sdk/URLTemplate.java +++ b/src/main/java/com/box/sdk/URLTemplate.java @@ -3,14 +3,14 @@ import java.net.MalformedURLException; import java.net.URL; -class URLTemplate { +public class URLTemplate { private String template; URLTemplate(String template) { this.template = template; } - URL build(String base, Object... values) { + public URL build(String base, Object... values) { String urlString = String.format(base + this.template, values); URL url = null; @@ -23,7 +23,7 @@ URL build(String base, Object... values) { return url; } - URL buildWithQuery(String base, String queryString, Object... values) { + public URL buildWithQuery(String base, String queryString, Object... values) { String urlString = String.format(base + this.template, values) + queryString; URL url = null; try { diff --git a/src/main/java/com/box/sdk/http/HttpHeaders.java b/src/main/java/com/box/sdk/http/HttpHeaders.java index aac67afeb..ae8e20084 100644 --- a/src/main/java/com/box/sdk/http/HttpHeaders.java +++ b/src/main/java/com/box/sdk/http/HttpHeaders.java @@ -40,6 +40,11 @@ public final class HttpHeaders { */ public static final String X_BOX_PART_ID = "X-Box-Part-Id"; + /** + * HTTP header key X-Box-Part-Id. + */ + public static final String AUTHORIZATION = "Authorization"; + //Prevents instantiation private HttpHeaders() { } diff --git a/src/main/java/com/box/sdk/utilities/BatchRequest.java b/src/main/java/com/box/sdk/utilities/BatchRequest.java deleted file mode 100644 index 9516755ba..000000000 --- a/src/main/java/com/box/sdk/utilities/BatchRequest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.box.sdk.utilities; - -/** - * - */ -public class BatchRequest { -} diff --git a/src/test/java/com/box/sdk/BoxGroupTest.java b/src/test/java/com/box/sdk/BoxGroupTest.java index 9dc9cc89b..4a3e071e2 100644 --- a/src/test/java/com/box/sdk/BoxGroupTest.java +++ b/src/test/java/com/box/sdk/BoxGroupTest.java @@ -39,7 +39,7 @@ */ public class BoxGroupTest { - private static final URLTemplate GROUPS_URL_TEMPLATE = new URLTemplate("groups"); + public static final URLTemplate GROUPS_URL_TEMPLATE = new URLTemplate("groups"); /** * Wiremock From 2cf6632008cfcd13f4566ddd6871d4fdc400a170 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Wed, 23 Aug 2017 13:58:29 -0700 Subject: [PATCH 3/8] making it more user friendly and better exception handling --- .../box/sdk/example/BatchRequestExample.java | 12 +++- .../java/com/box/sdk/BatchAPIRequest.java | 39 ++++++++---- src/main/java/com/box/sdk/BoxAPIRequest.java | 6 +- src/main/java/com/box/sdk/BoxAPIResponse.java | 26 +++++--- .../java/com/box/sdk/BoxAPIResponseEvent.java | 16 ----- src/main/java/com/box/sdk/BoxFolder.java | 2 +- src/main/java/com/box/sdk/BoxJSONRequest.java | 4 +- .../java/com/box/sdk/BoxJSONResponse.java | 59 +++++++++++++------ .../java/com/box/sdk/http/HttpHeaders.java | 2 +- 9 files changed, 106 insertions(+), 60 deletions(-) delete mode 100644 src/main/java/com/box/sdk/BoxAPIResponseEvent.java diff --git a/src/example/java/com/box/sdk/example/BatchRequestExample.java b/src/example/java/com/box/sdk/example/BatchRequestExample.java index 4f02b0864..901a3afa2 100644 --- a/src/example/java/com/box/sdk/example/BatchRequestExample.java +++ b/src/example/java/com/box/sdk/example/BatchRequestExample.java @@ -14,8 +14,11 @@ import com.box.sdk.BoxAPIResponse; import com.box.sdk.BoxConfig; import com.box.sdk.BoxDeveloperEditionAPIConnection; +import com.box.sdk.BoxFile; import com.box.sdk.BoxFolder; import com.box.sdk.BoxJSONRequest; +import com.box.sdk.BoxJSONResponse; +import com.box.sdk.BoxResource; import com.box.sdk.BoxUser; import com.box.sdk.IAccessTokenCache; import com.box.sdk.InMemoryLRUAccessTokenCache; @@ -73,14 +76,17 @@ public static void main(String[] args) throws IOException { System.out.println("GET ME RESPONSE:"); System.out.println("Response Code: " + responses.get(0).getResponseCode()); - System.out.println("Response: " + responses.get(0).getBodyAsString()); + System.out.println("Response: " + ((BoxJSONResponse) responses.get(1)).getJSON()); System.out.println("CREATE APP USER RESPONSE:"); System.out.println("Response Code: " + responses.get(1).getResponseCode()); - System.out.println("Response: " + responses.get(1).getBodyAsString()); + System.out.println("Response: " + ((BoxJSONResponse) responses.get(1)).getJSON()); System.out.println("GET ROOT FOLDER RESPONSE:"); System.out.println("Response Code: " + responses.get(2).getResponseCode()); - System.out.println("Response: " + responses.get(2).getBodyAsString()); + BoxJSONResponse rootFolderResponse = (BoxJSONResponse) responses.get(1); + BoxFolder.Info rootFolderInfo = new BoxFolder(api, rootFolderResponse.getJsonObject().get("id").asString()) + .new Info(rootFolderResponse.getJsonObject()); + System.out.println("Root Folder Created At: " + rootFolderInfo.getCreatedAt()); } } diff --git a/src/main/java/com/box/sdk/BatchAPIRequest.java b/src/main/java/com/box/sdk/BatchAPIRequest.java index b3121bf3a..266c4e564 100644 --- a/src/main/java/com/box/sdk/BatchAPIRequest.java +++ b/src/main/java/com/box/sdk/BatchAPIRequest.java @@ -5,7 +5,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.logging.Logger; import com.box.sdk.http.HttpHeaders; @@ -13,8 +12,6 @@ import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; -import org.jose4j.json.internal.json_simple.JSONArray; -import org.jose4j.json.internal.json_simple.JSONObject; /** * @@ -34,8 +31,8 @@ public BatchAPIRequest(BoxAPIConnection api) { } /** - * Execute a set of API calls as batch request - * @return + * Execute a set of API calls as batch request. + * @return list of BoxAPIResponse's */ public List execute(List requests) { JsonObject body = new JsonObject(); @@ -71,11 +68,33 @@ public List execute(List requests) { BoxJSONResponse batchResponse = (BoxJSONResponse) super.send(); JsonObject responseJSON = JsonObject.readFrom(batchResponse.getJSON()); List responses = new ArrayList(); - Iterator iterator = responseJSON.get("responses").asArray().iterator(); - while(iterator.hasNext()) { - JsonObject jsonResponse = iterator.next().asObject(); - BoxAPIResponse response = - new BoxAPIResponse(jsonResponse.get("status").asInt(), jsonResponse.get("response").toString()); + Iterator responseIterator = responseJSON.get("responses").asArray().iterator(); + while(responseIterator.hasNext()) { + JsonObject jsonResponse = responseIterator.next().asObject(); + BoxAPIResponse response = null; + + //Gather headers + Map responseHeaders = new HashMap(); + + if(jsonResponse.get("headers") != null) { + JsonObject batchResponseHeadersObject = jsonResponse.get("headers").asObject(); + for (JsonObject.Member member : batchResponseHeadersObject) { + String headerName = member.getName(); + String headerValue = member.getValue().asString(); + responseHeaders.put(headerName, headerValue); + } + } + + //Construct a BoxAPIResponse when response is null, or a BoxJSONResponse when there's a response + // (not anticipating any other response as per current APIs. Ideally we should do it based on response header) + if(jsonResponse.get("response") == null) { + response = + new BoxAPIResponse(jsonResponse.get("status").asInt(), responseHeaders); + } else { + response = + new BoxJSONResponse(jsonResponse.get("status").asInt(), responseHeaders, + jsonResponse.get("response").asObject()); + } responses.add(response); } return responses; diff --git a/src/main/java/com/box/sdk/BoxAPIRequest.java b/src/main/java/com/box/sdk/BoxAPIRequest.java index 3b7acd679..267a8c752 100644 --- a/src/main/java/com/box/sdk/BoxAPIRequest.java +++ b/src/main/java/com/box/sdk/BoxAPIRequest.java @@ -90,7 +90,7 @@ public BoxAPIRequest(BoxAPIConnection api, URL url, HttpMethod method) { } /** - * Constructs an authenticated BoxAPIRequest + * Constructs an request, using URL and HttpMethod. * @param url the URL of the request. * @param method the HTTP method of the request. */ @@ -193,9 +193,9 @@ public URL getUrl() { } /** - * Gets the http method of the request. + * Gets the http method from the request. * - * @return + * @return http method */ public String getMethod() { return method; diff --git a/src/main/java/com/box/sdk/BoxAPIResponse.java b/src/main/java/com/box/sdk/BoxAPIResponse.java index 8f9abce6e..16b65acf5 100644 --- a/src/main/java/com/box/sdk/BoxAPIResponse.java +++ b/src/main/java/com/box/sdk/BoxAPIResponse.java @@ -27,6 +27,7 @@ public class BoxAPIResponse { private static final int BUFFER_SIZE = 8192; private final HttpURLConnection connection; + private final Map headers; private int responseCode; private String bodyString; @@ -48,12 +49,17 @@ public class BoxAPIResponse { */ public BoxAPIResponse() { this.connection = null; + this.headers = null; } - public BoxAPIResponse(int responseCode, String body) { + /** + * Constructs a BoxAPIResponse with a http response code and response headers. + * @param responseCode + */ + public BoxAPIResponse(int responseCode, Map headers) { this.connection = null; this.responseCode = responseCode; - this.bodyString = body; + this.headers = headers; } /** @@ -62,6 +68,7 @@ public BoxAPIResponse(int responseCode, String body) { */ public BoxAPIResponse(HttpURLConnection connection) { this.connection = connection; + this.headers = null; this.inputStream = null; try { @@ -101,7 +108,16 @@ public long getContentLength() { * @return value of the header. */ public String getHeaderField(String fieldName) { - return this.connection.getHeaderField(fieldName); + //Whenever headers map is null, try to get the headers from the connection + if(headers == null) { + if (this.connection != null) { + return this.connection.getHeaderField(fieldName); + } else { + return null; + } + } else { + return headers.get(fieldName); + } } /** @@ -112,10 +128,6 @@ public InputStream getBody() { return this.getBody(null); } - public String getBodyAsString() { - return this.bodyString; - } - /** * Gets an InputStream for reading this response's body which will report its read progress to a ProgressListener. * @param listener a listener for monitoring the read progress of the body. diff --git a/src/main/java/com/box/sdk/BoxAPIResponseEvent.java b/src/main/java/com/box/sdk/BoxAPIResponseEvent.java deleted file mode 100644 index 6648b9a02..000000000 --- a/src/main/java/com/box/sdk/BoxAPIResponseEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.box.sdk; - -/** - * - */ -public interface BoxAPIResponseEvent { - /** - * Called on success - */ - void onSuccess(); - - /** - * Called on failure - */ - void onFailure(); -} diff --git a/src/main/java/com/box/sdk/BoxFolder.java b/src/main/java/com/box/sdk/BoxFolder.java index 57c8e3036..7fd9f171f 100644 --- a/src/main/java/com/box/sdk/BoxFolder.java +++ b/src/main/java/com/box/sdk/BoxFolder.java @@ -902,7 +902,7 @@ public Info(String json) { * Constructs an Info object using an already parsed JSON object. * @param jsonObject the parsed JSON object. */ - Info(JsonObject jsonObject) { + public Info(JsonObject jsonObject) { super(jsonObject); } diff --git a/src/main/java/com/box/sdk/BoxJSONRequest.java b/src/main/java/com/box/sdk/BoxJSONRequest.java index 9c3c2e991..9cfb7d1f1 100644 --- a/src/main/java/com/box/sdk/BoxJSONRequest.java +++ b/src/main/java/com/box/sdk/BoxJSONRequest.java @@ -66,8 +66,8 @@ public void setBody(JsonObject body) { } /** - * - * @return + * Gets the body of this request as a JsonObject. + * @return body represented as JsonObject. */ public JsonObject getBodyAsJsonObject() { return this.json; diff --git a/src/main/java/com/box/sdk/BoxJSONResponse.java b/src/main/java/com/box/sdk/BoxJSONResponse.java index de61a1743..f50c59727 100644 --- a/src/main/java/com/box/sdk/BoxJSONResponse.java +++ b/src/main/java/com/box/sdk/BoxJSONResponse.java @@ -3,6 +3,9 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; +import java.util.Map; + +import com.eclipsesource.json.JsonObject; /** * Used to read HTTP responses containing JSON from the Box API. @@ -12,7 +15,7 @@ */ public class BoxJSONResponse extends BoxAPIResponse { private static final int BUFFER_SIZE = 8192; - + private JsonObject jsonObject; private String json; /** @@ -30,6 +33,25 @@ public BoxJSONResponse(HttpURLConnection connection) { super(connection); } + /** + * Constructs a BoxAPIResponse with an http response code and response body + * @param responseCode + * @param body + */ + public BoxJSONResponse(int responseCode, Map httpHeaders, JsonObject body) { + super(responseCode, httpHeaders); + this.jsonObject = body; + this.json = body.toString(); + } + + public JsonObject getJsonObject() { + if (this.jsonObject != null) { + return this.jsonObject; + } else { + return JsonObject.readFrom(this.getJSON()); + } + } + /** * Gets the body of the response as a JSON string. When this method is called, the response's body will be read and * the response will be disconnected, meaning that the stream returned by {@link #getBody} can no longer be used. @@ -38,26 +60,29 @@ public BoxJSONResponse(HttpURLConnection connection) { public String getJSON() { if (this.json != null) { return this.json; - } + } else if (this.jsonObject != null) { + return this.jsonObject.toString(); + } else { - InputStreamReader reader = new InputStreamReader(this.getBody(), StandardCharsets.UTF_8); - StringBuilder builder = new StringBuilder(); - char[] buffer = new char[BUFFER_SIZE]; + InputStreamReader reader = new InputStreamReader(this.getBody(), StandardCharsets.UTF_8); + StringBuilder builder = new StringBuilder(); + char[] buffer = new char[BUFFER_SIZE]; - try { - int read = reader.read(buffer, 0, BUFFER_SIZE); - while (read != -1) { - builder.append(buffer, 0, read); - read = reader.read(buffer, 0, BUFFER_SIZE); - } + try { + int read = reader.read(buffer, 0, BUFFER_SIZE); + while (read != -1) { + builder.append(buffer, 0, read); + read = reader.read(buffer, 0, BUFFER_SIZE); + } - this.disconnect(); - reader.close(); - } catch (IOException e) { - throw new BoxAPIException("Couldn't connect to the Box API due to a network error.", e); + this.disconnect(); + reader.close(); + } catch (IOException e) { + throw new BoxAPIException("Couldn't connect to the Box API due to a network error.", e); + } + this.json = builder.toString(); + return this.json; } - this.json = builder.toString(); - return this.json; } @Override diff --git a/src/main/java/com/box/sdk/http/HttpHeaders.java b/src/main/java/com/box/sdk/http/HttpHeaders.java index ae8e20084..6def10f46 100644 --- a/src/main/java/com/box/sdk/http/HttpHeaders.java +++ b/src/main/java/com/box/sdk/http/HttpHeaders.java @@ -41,7 +41,7 @@ public final class HttpHeaders { public static final String X_BOX_PART_ID = "X-Box-Part-Id"; /** - * HTTP header key X-Box-Part-Id. + * HTTP header key Authorization. */ public static final String AUTHORIZATION = "Authorization"; From 8867f0b0d8177671c097450e626306c01f3340b6 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Thu, 24 Aug 2017 14:33:43 -0700 Subject: [PATCH 4/8] checkstyle --- config/checkstyle/suppressions.xml | 4 ++ .../java/com/box/sdk/BatchAPIRequest.java | 38 +++++++++----- src/main/java/com/box/sdk/BoxAPIRequest.java | 25 +++++++++- src/main/java/com/box/sdk/BoxAPIResponse.java | 7 +-- .../java/com/box/sdk/BoxCollaboration.java | 12 +++++ src/main/java/com/box/sdk/BoxCollection.java | 6 +++ src/main/java/com/box/sdk/BoxComment.java | 10 +++- src/main/java/com/box/sdk/BoxFile.java | 50 ++++++++++++++++++- src/main/java/com/box/sdk/BoxFileVersion.java | 6 +++ src/main/java/com/box/sdk/BoxFolder.java | 36 +++++++++++++ src/main/java/com/box/sdk/BoxItem.java | 4 +- src/main/java/com/box/sdk/BoxJSONRequest.java | 2 +- .../java/com/box/sdk/BoxJSONResponse.java | 11 ++-- .../java/com/box/sdk/BoxLegalHoldPolicy.java | 13 ++++- src/main/java/com/box/sdk/BoxRecents.java | 3 ++ .../java/com/box/sdk/BoxRetentionPolicy.java | 29 ++++++----- src/main/java/com/box/sdk/BoxSearch.java | 3 ++ src/main/java/com/box/sdk/BoxTask.java | 9 ++++ .../java/com/box/sdk/BoxTaskAssignment.java | 3 ++ src/main/java/com/box/sdk/BoxTrash.java | 18 ++++++- src/main/java/com/box/sdk/BoxUser.java | 21 ++++++++ src/main/java/com/box/sdk/BoxWebHook.java | 18 +++---- src/main/java/com/box/sdk/BoxWebLink.java | 6 +++ src/main/java/com/box/sdk/EventLog.java | 5 +- src/main/java/com/box/sdk/EventStream.java | 7 ++- src/main/java/com/box/sdk/URLTemplate.java | 22 +++++++- 26 files changed, 313 insertions(+), 55 deletions(-) diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml index 92ee3f784..7dab151a0 100644 --- a/config/checkstyle/suppressions.xml +++ b/config/checkstyle/suppressions.xml @@ -11,4 +11,8 @@ files="example.*\.java"/> + + diff --git a/src/main/java/com/box/sdk/BatchAPIRequest.java b/src/main/java/com/box/sdk/BatchAPIRequest.java index 266c4e564..a398baeea 100644 --- a/src/main/java/com/box/sdk/BatchAPIRequest.java +++ b/src/main/java/com/box/sdk/BatchAPIRequest.java @@ -16,9 +16,12 @@ /** * */ -public class BatchAPIRequest extends BoxJSONRequest{ +public class BatchAPIRequest extends BoxJSONRequest { + /** + * Batch URL Template. + */ + public static final URLTemplate BATCH_URL_TEMPLATE = new URLTemplate("batch"); private static final Logger LOGGER = Logger.getLogger(BoxAPIRequest.class.getName()); - public static final URLTemplate RECENTS_URL_TEMPLATE = new URLTemplate("batch"); private final BoxAPIConnection api; /** @@ -26,21 +29,28 @@ public class BatchAPIRequest extends BoxJSONRequest{ * @param api an API connection for authenticating the request. */ public BatchAPIRequest(BoxAPIConnection api) { - super(api, RECENTS_URL_TEMPLATE.build(api.getBaseURL()), HttpMethod.GET); + super(api, BATCH_URL_TEMPLATE.build(api.getBaseURL()), HttpMethod.GET); this.api = api; } /** * Execute a set of API calls as batch request. - * @return list of BoxAPIResponse's + * @param requests list of api requests that has to be executed in batch. + * @return list of BoxAPIResponses */ public List execute(List requests) { + this.prepareRequest(requests); + BoxJSONResponse batchResponse = (BoxJSONResponse) super.send(); + return this.parseResponse(batchResponse); + } + + private void prepareRequest(List requests) { JsonObject body = new JsonObject(); JsonArray requestsJSONArray = new JsonArray(); - for(BoxAPIRequest request: requests) { + for (BoxAPIRequest request: requests) { JsonObject batchRequest = new JsonObject(); batchRequest.add("method", request.getMethod()); - batchRequest.add("relative_url", request.getUrl().toString().substring(this.api.getBaseURL().length()-1)); + batchRequest.add("relative_url", request.getUrl().toString().substring(this.api.getBaseURL().length() - 1)); //If the actual request has a JSON body then add it to vatch request if (request instanceof BoxJSONRequest) { BoxJSONRequest jsonRequest = (BoxJSONRequest) request; @@ -49,7 +59,7 @@ public List execute(List requests) { //Add any headers that are in the request, except Authorization if (request.getHeaders() != null) { JsonObject batchRequestHeaders = new JsonObject(); - for(RequestHeader header: request.getHeaders()) { + for (RequestHeader header: request.getHeaders()) { if (header.getKey() != null && !header.getKey().isEmpty() && HttpHeaders.AUTHORIZATION.equals(header.getKey())) { batchRequestHeaders.add(header.getKey(), header.getValue()); @@ -64,19 +74,20 @@ public List execute(List requests) { //Add the requests array to body body.add("requests", requestsJSONArray); super.setBody(body); + } - BoxJSONResponse batchResponse = (BoxJSONResponse) super.send(); + private List parseResponse(BoxJSONResponse batchResponse) { JsonObject responseJSON = JsonObject.readFrom(batchResponse.getJSON()); List responses = new ArrayList(); Iterator responseIterator = responseJSON.get("responses").asArray().iterator(); - while(responseIterator.hasNext()) { + while (responseIterator.hasNext()) { JsonObject jsonResponse = responseIterator.next().asObject(); BoxAPIResponse response = null; //Gather headers Map responseHeaders = new HashMap(); - if(jsonResponse.get("headers") != null) { + if (jsonResponse.get("headers") != null) { JsonObject batchResponseHeadersObject = jsonResponse.get("headers").asObject(); for (JsonObject.Member member : batchResponseHeadersObject) { String headerName = member.getName(); @@ -85,9 +96,10 @@ public List execute(List requests) { } } - //Construct a BoxAPIResponse when response is null, or a BoxJSONResponse when there's a response - // (not anticipating any other response as per current APIs. Ideally we should do it based on response header) - if(jsonResponse.get("response") == null) { + // Construct a BoxAPIResponse when response is null, or a BoxJSONResponse when there's a response + // (not anticipating any other response as per current APIs. + // Ideally we should do it based on response header) + if (jsonResponse.get("response") == null) { response = new BoxAPIResponse(jsonResponse.get("status").asInt(), responseHeaders); } else { diff --git a/src/main/java/com/box/sdk/BoxAPIRequest.java b/src/main/java/com/box/sdk/BoxAPIRequest.java index 267a8c752..9f2121928 100644 --- a/src/main/java/com/box/sdk/BoxAPIRequest.java +++ b/src/main/java/com/box/sdk/BoxAPIRequest.java @@ -198,12 +198,17 @@ public URL getUrl() { * @return http method */ public String getMethod() { - return method; + return this.method; } - public List getHeaders() { + /** + * Get headers as list of RequestHeader objects. + * @return headers as list of RequestHeader objects + */ + protected List getHeaders() { return this.headers; } + /** * Sends this request and returns a BoxAPIResponse containing the server's response. * @@ -555,19 +560,35 @@ private static boolean isResponseRedirect(int responseCode) { return (responseCode == 301 || responseCode == 302); } + /** + * Class for mapping a request header and value. + */ public final class RequestHeader { private final String key; private final String value; + /** + * Construct a request header from header key and value. + * @param key header name + * @param value header value + */ public RequestHeader(String key, String value) { this.key = key; this.value = value; } + /** + * Get header key. + * @return http header name + */ public String getKey() { return this.key; } + /** + * Get header value. + * @return http header value + */ public String getValue() { return this.value; } diff --git a/src/main/java/com/box/sdk/BoxAPIResponse.java b/src/main/java/com/box/sdk/BoxAPIResponse.java index 16b65acf5..0488b3880 100644 --- a/src/main/java/com/box/sdk/BoxAPIResponse.java +++ b/src/main/java/com/box/sdk/BoxAPIResponse.java @@ -54,7 +54,8 @@ public BoxAPIResponse() { /** * Constructs a BoxAPIResponse with a http response code and response headers. - * @param responseCode + * @param responseCode http response code + * @param headers map of headers */ public BoxAPIResponse(int responseCode, Map headers) { this.connection = null; @@ -109,14 +110,14 @@ public long getContentLength() { */ public String getHeaderField(String fieldName) { //Whenever headers map is null, try to get the headers from the connection - if(headers == null) { + if (this.headers == null) { if (this.connection != null) { return this.connection.getHeaderField(fieldName); } else { return null; } } else { - return headers.get(fieldName); + return this.headers.get(fieldName); } } diff --git a/src/main/java/com/box/sdk/BoxCollaboration.java b/src/main/java/com/box/sdk/BoxCollaboration.java index aadf43e7f..1f008d1fc 100644 --- a/src/main/java/com/box/sdk/BoxCollaboration.java +++ b/src/main/java/com/box/sdk/BoxCollaboration.java @@ -20,9 +20,21 @@ */ @BoxResourceType("collaboration") public class BoxCollaboration extends BoxResource { + /** + * Collaborations URL Template. + */ public static final URLTemplate COLLABORATIONS_URL_TEMPLATE = new URLTemplate("collaborations"); + /** + * Pending Collaborations URL. + */ public static final URLTemplate PENDING_COLLABORATIONS_URL = new URLTemplate("collaborations?status=pending"); + /** + * Collaboration URL Template. + */ public static final URLTemplate COLLABORATION_URL_TEMPLATE = new URLTemplate("collaborations/%s"); + /** + * Get All File Collaboations URL. + */ public static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations/"); /** diff --git a/src/main/java/com/box/sdk/BoxCollection.java b/src/main/java/com/box/sdk/BoxCollection.java index ab4ffad07..482625532 100644 --- a/src/main/java/com/box/sdk/BoxCollection.java +++ b/src/main/java/com/box/sdk/BoxCollection.java @@ -18,7 +18,13 @@ @BoxResourceType("collection") public class BoxCollection extends BoxResource implements Iterable { + /** + * Get Collections URL Template. + */ public static final URLTemplate GET_COLLECTIONS_URL_TEMPLATE = new URLTemplate("collections/"); + /** + * Get Collection Items URL Template. + */ public static final URLTemplate GET_COLLECTION_ITEMS_URL = new URLTemplate("collections/%s/items/"); /** diff --git a/src/main/java/com/box/sdk/BoxComment.java b/src/main/java/com/box/sdk/BoxComment.java index 5a7ddae23..ab7b8ae8b 100644 --- a/src/main/java/com/box/sdk/BoxComment.java +++ b/src/main/java/com/box/sdk/BoxComment.java @@ -18,10 +18,18 @@ */ @BoxResourceType("comment") public class BoxComment extends BoxResource { - private static final Pattern MENTION_REGEX = Pattern.compile("@\\[.+:.+\\]"); + + /** + * Add Comment URL Template. + */ public static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); + /** + * Comment URL Template. + */ public static final URLTemplate COMMENT_URL_TEMPLATE = new URLTemplate("comments/%s"); + private static final Pattern MENTION_REGEX = Pattern.compile("@\\[.+:.+\\]"); + /** * Constructs a BoxComment for a comment with a given ID. * @param api the API connection to be used with the comment. diff --git a/src/main/java/com/box/sdk/BoxFile.java b/src/main/java/com/box/sdk/BoxFile.java index 525d67e90..7d549696c 100644 --- a/src/main/java/com/box/sdk/BoxFile.java +++ b/src/main/java/com/box/sdk/BoxFile.java @@ -55,25 +55,71 @@ public enum ThumbnailFileType { JPG } + /** + * File URL Template. + */ public static final URLTemplate FILE_URL_TEMPLATE = new URLTemplate("files/%s"); + /** + * Content URL Template. + */ public static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content"); + /** + * Versions URL Template. + */ public static final URLTemplate VERSIONS_URL_TEMPLATE = new URLTemplate("files/%s/versions"); + /** + * Copy URL Template. + */ public static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("files/%s/copy"); + /** + * Add Comment URL Template. + */ public static final URLTemplate ADD_COMMENT_URL_TEMPLATE = new URLTemplate("comments"); + /** + * Get Comments URL Template. + */ public static final URLTemplate GET_COMMENTS_URL_TEMPLATE = new URLTemplate("files/%s/comments"); + /** + * Metadata URL Template. + */ public static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("files/%s/metadata/%s/%s"); + /** + * Add Task URL Template. + */ public static final URLTemplate ADD_TASK_URL_TEMPLATE = new URLTemplate("tasks"); + /** + * Get Tasks URL Template. + */ public static final URLTemplate GET_TASKS_URL_TEMPLATE = new URLTemplate("files/%s/tasks"); + /** + * Get Thumbnail PNG Template. + */ public static final URLTemplate GET_THUMBNAIL_PNG_TEMPLATE = new URLTemplate("files/%s/thumbnail.png"); + /** + * Get Thumbnail JPG Template. + */ public static final URLTemplate GET_THUMBNAIL_JPG_TEMPLATE = new URLTemplate("files/%s/thumbnail.jpg"); + /** + * Upload Session URL Template. + */ public static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/%s/upload_sessions"); + /** + * Upload Session Status URL Template. + */ public static final URLTemplate UPLOAD_SESSION_STATUS_URL_TEMPLATE = new URLTemplate( "files/upload_sessions/%s/status"); + /** + * Abort Upload Session URL Template. + */ public static final URLTemplate ABORT_UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions/%s"); - + /** + * Add Collaborations URL Template. + */ public static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); + /** + * Get All File Collaborations URL Template. + */ public static final URLTemplate GET_ALL_FILE_COLLABORATIONS_URL = new URLTemplate("files/%s/collaborations"); - private static final int BUFFER_SIZE = 8192; private static final int GET_COLLABORATORS_PAGE_SIZE = 1000; diff --git a/src/main/java/com/box/sdk/BoxFileVersion.java b/src/main/java/com/box/sdk/BoxFileVersion.java index 059efe848..865490399 100644 --- a/src/main/java/com/box/sdk/BoxFileVersion.java +++ b/src/main/java/com/box/sdk/BoxFileVersion.java @@ -15,7 +15,13 @@ */ @BoxResourceType("file_version") public class BoxFileVersion extends BoxResource { + /** + * Content URL Template. + */ public static final URLTemplate CONTENT_URL_TEMPLATE = new URLTemplate("files/%s/content?version=%s"); + /** + * Version URL Template. + */ public static final URLTemplate VERSION_URL_TEMPLATE = new URLTemplate("files/%s/versions/%s"); private static final int BUFFER_SIZE = 8192; diff --git a/src/main/java/com/box/sdk/BoxFolder.java b/src/main/java/com/box/sdk/BoxFolder.java index 7fd9f171f..2c0d2a0c7 100644 --- a/src/main/java/com/box/sdk/BoxFolder.java +++ b/src/main/java/com/box/sdk/BoxFolder.java @@ -33,17 +33,53 @@ public class BoxFolder extends BoxItem implements Iterable { "item_status", "item_collection", "sync_state", "has_collaborations", "permissions", "tags", "can_non_owners_invite", "collections", "watermark_info"}; + /** + * Create Folder URL Template. + */ public static final URLTemplate CREATE_FOLDER_URL = new URLTemplate("folders"); + /** + * Create Web Link URL Template. + */ public static final URLTemplate CREATE_WEB_LINK_URL = new URLTemplate("web_links"); + /** + * Copy Folder URL Template. + */ public static final URLTemplate COPY_FOLDER_URL = new URLTemplate("folders/%s/copy"); + /** + * Delete Folder URL Template. + */ public static final URLTemplate DELETE_FOLDER_URL = new URLTemplate("folders/%s?recursive=%b"); + /** + * Folder Info URL Template. + */ public static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s"); + /** + * Upload File URL Template. + */ public static final URLTemplate UPLOAD_FILE_URL = new URLTemplate("files/content"); + /** + * Add Collaboration URL Template. + */ public static final URLTemplate ADD_COLLABORATION_URL = new URLTemplate("collaborations"); + /** + * Get Collaborations URL Template. + */ public static final URLTemplate GET_COLLABORATIONS_URL = new URLTemplate("folders/%s/collaborations"); + /** + * Get Items URL Template. + */ public static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/%s/items/"); + /** + * Search URL Template. + */ public static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); + /** + * Metadata URL Template. + */ public static final URLTemplate METADATA_URL_TEMPLATE = new URLTemplate("folders/%s/metadata/%s/%s"); + /** + * Upload Session URL Template. + */ public static final URLTemplate UPLOAD_SESSION_URL_TEMPLATE = new URLTemplate("files/upload_sessions"); /** diff --git a/src/main/java/com/box/sdk/BoxItem.java b/src/main/java/com/box/sdk/BoxItem.java index a5692ccbc..dad8de9b8 100644 --- a/src/main/java/com/box/sdk/BoxItem.java +++ b/src/main/java/com/box/sdk/BoxItem.java @@ -25,7 +25,9 @@ public abstract class BoxItem extends BoxResource { "version_number", "comment_count", "permissions", "tags", "lock", "extension", "is_package", "folder_upload_email", "item_collection", "sync_state", "has_collaborations", "can_non_owners_invite", "file_version", "collections"}; - + /** + * Shared Item URL Template. + */ public static final URLTemplate SHARED_ITEM_URL_TEMPLATE = new URLTemplate("shared_items"); /** diff --git a/src/main/java/com/box/sdk/BoxJSONRequest.java b/src/main/java/com/box/sdk/BoxJSONRequest.java index 9cfb7d1f1..aabfaf823 100644 --- a/src/main/java/com/box/sdk/BoxJSONRequest.java +++ b/src/main/java/com/box/sdk/BoxJSONRequest.java @@ -37,7 +37,7 @@ public BoxJSONRequest(BoxAPIConnection api, URL url, HttpMethod method) { } /** - * Constructs an authenticated BoxJSONRequest + * Constructs an authenticated BoxJSONRequest. * @param url the URL of the request. * @param method the HTTP method of the request. */ diff --git a/src/main/java/com/box/sdk/BoxJSONResponse.java b/src/main/java/com/box/sdk/BoxJSONResponse.java index f50c59727..88b1f98f0 100644 --- a/src/main/java/com/box/sdk/BoxJSONResponse.java +++ b/src/main/java/com/box/sdk/BoxJSONResponse.java @@ -34,9 +34,10 @@ public BoxJSONResponse(HttpURLConnection connection) { } /** - * Constructs a BoxAPIResponse with an http response code and response body - * @param responseCode - * @param body + * Constructs a BoxAPIResponse with an http response code and response body. + * @param responseCode http response code + * @param httpHeaders map of http headers + * @param body response body as Json Object */ public BoxJSONResponse(int responseCode, Map httpHeaders, JsonObject body) { super(responseCode, httpHeaders); @@ -44,6 +45,10 @@ public BoxJSONResponse(int responseCode, Map httpHeaders, JsonOb this.json = body.toString(); } + /** + * Get response as Json Object. + * @return response as JsonObject + */ public JsonObject getJsonObject() { if (this.jsonObject != null) { return this.jsonObject; diff --git a/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java b/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java index 85ed9c62a..df8da1026 100644 --- a/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java +++ b/src/main/java/com/box/sdk/BoxLegalHoldPolicy.java @@ -19,11 +19,22 @@ */ @BoxResourceType("legal_hold") public class BoxLegalHoldPolicy extends BoxResource { - + /** + * Legal Hold URL Template. + */ public static final URLTemplate LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies/%s"); + /** + * All Legal Hold URL Template. + */ public static final URLTemplate ALL_LEGAL_HOLD_URL_TEMPLATE = new URLTemplate("legal_hold_policies"); + /** + * Legal Hold Assignments URL Template. + */ public static final URLTemplate LEGAL_HOLD_ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("legal_hold_policies/%s/assignments"); + /** + * List of File Version Holds URL Template. + */ public static final URLTemplate LIST_OF_FILE_VERSION_HOLDS_URL_TEMPLATE = new URLTemplate("file_version_legal_holds"); private static final int DEFAULT_LIMIT = 100; diff --git a/src/main/java/com/box/sdk/BoxRecents.java b/src/main/java/com/box/sdk/BoxRecents.java index 74d075f6a..decc6cf7e 100644 --- a/src/main/java/com/box/sdk/BoxRecents.java +++ b/src/main/java/com/box/sdk/BoxRecents.java @@ -8,6 +8,9 @@ */ public final class BoxRecents { + /** + * Recents URL Template. + */ public static final URLTemplate RECENTS_URL_TEMPLATE = new URLTemplate("recent_items"); //Constructor is not allowed diff --git a/src/main/java/com/box/sdk/BoxRetentionPolicy.java b/src/main/java/com/box/sdk/BoxRetentionPolicy.java index b54183507..65c50ad43 100644 --- a/src/main/java/com/box/sdk/BoxRetentionPolicy.java +++ b/src/main/java/com/box/sdk/BoxRetentionPolicy.java @@ -20,6 +20,20 @@ */ @BoxResourceType("retention_policy") public class BoxRetentionPolicy extends BoxResource { + /** + * The URL template used for operation with retention policies. + */ + public static final URLTemplate RETENTION_POLICIES_URL_TEMPLATE = new URLTemplate("retention_policies"); + + /** + * The URL template used for operation with retention policy with given ID. + */ + public static final URLTemplate POLICY_URL_TEMPLATE = new URLTemplate("retention_policies/%s"); + + /** + * The URL template used for operation with retention policy assignments. + */ + public static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policies/%s/assignments"); /** * Will cause the content retained by the policy to be permanently deleted. @@ -57,21 +71,6 @@ public class BoxRetentionPolicy extends BoxResource { */ private static final int DEFAULT_LIMIT = 100; - /** - * The URL template used for operation with retention policies. - */ - public static final URLTemplate RETENTION_POLICIES_URL_TEMPLATE = new URLTemplate("retention_policies"); - - /** - * The URL template used for operation with retention policy with given ID. - */ - public static final URLTemplate POLICY_URL_TEMPLATE = new URLTemplate("retention_policies/%s"); - - /** - * The URL template used for operation with retention policy assignments. - */ - public static final URLTemplate ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("retention_policies/%s/assignments"); - /** * Constructs a retention policy for a resource with a given ID. * diff --git a/src/main/java/com/box/sdk/BoxSearch.java b/src/main/java/com/box/sdk/BoxSearch.java index 522c2a424..49351382b 100644 --- a/src/main/java/com/box/sdk/BoxSearch.java +++ b/src/main/java/com/box/sdk/BoxSearch.java @@ -14,6 +14,9 @@ */ public class BoxSearch { + /** + * Search URL Template. + */ public static final URLTemplate SEARCH_URL_TEMPLATE = new URLTemplate("search"); private final BoxAPIConnection api; diff --git a/src/main/java/com/box/sdk/BoxTask.java b/src/main/java/com/box/sdk/BoxTask.java index 74ec69ee8..7be0b3ee6 100644 --- a/src/main/java/com/box/sdk/BoxTask.java +++ b/src/main/java/com/box/sdk/BoxTask.java @@ -17,8 +17,17 @@ @BoxResourceType("task") public class BoxTask extends BoxResource { + /** + * Task URL Template. + */ public static final URLTemplate TASK_URL_TEMPLATE = new URLTemplate("tasks/%s"); + /** + * Get Assignments URL Template. + */ public static final URLTemplate GET_ASSIGNMENTS_URL_TEMPLATE = new URLTemplate("tasks/%s/assignments"); + /** + * Add Task Assignment URL Template. + */ public static final URLTemplate ADD_TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments"); /** diff --git a/src/main/java/com/box/sdk/BoxTaskAssignment.java b/src/main/java/com/box/sdk/BoxTaskAssignment.java index 728cfa9df..82e2ab31b 100644 --- a/src/main/java/com/box/sdk/BoxTaskAssignment.java +++ b/src/main/java/com/box/sdk/BoxTaskAssignment.java @@ -14,6 +14,9 @@ @BoxResourceType("task_assignment") public class BoxTaskAssignment extends BoxResource { + /** + * Task Assignment URL Template. + */ public static final URLTemplate TASK_ASSIGNMENT_URL_TEMPLATE = new URLTemplate("task_assignments/%s"); /** diff --git a/src/main/java/com/box/sdk/BoxTrash.java b/src/main/java/com/box/sdk/BoxTrash.java index ff4bd9e27..6479cd968 100644 --- a/src/main/java/com/box/sdk/BoxTrash.java +++ b/src/main/java/com/box/sdk/BoxTrash.java @@ -13,13 +13,29 @@ * handling for errors related to the Box REST API, you should capture this exception explicitly.

*/ public class BoxTrash implements Iterable { - private static final long LIMIT = 1000; + + /** + * Get Item URL Template. + */ public static final URLTemplate GET_ITEMS_URL = new URLTemplate("folders/trash/items/"); + /** + * Folder Info URL Template. + */ public static final URLTemplate FOLDER_INFO_URL_TEMPLATE = new URLTemplate("folders/%s/trash"); + /** + * File Info URL Template. + */ public static final URLTemplate FILE_INFO_URL_TEMPLATE = new URLTemplate("files/%s/trash"); + /** + * Restore File URL Template. + */ public static final URLTemplate RESTORE_FILE_URL_TEMPLATE = new URLTemplate("files/%s"); + /** + * Restore Folder URL Template. + */ public static final URLTemplate RESTORE_FOLDER_URL_TEMPLATE = new URLTemplate("folders/%s"); + private static final long LIMIT = 1000; private final BoxAPIConnection api; /** diff --git a/src/main/java/com/box/sdk/BoxUser.java b/src/main/java/com/box/sdk/BoxUser.java index 3575f2f0f..78b889fe6 100644 --- a/src/main/java/com/box/sdk/BoxUser.java +++ b/src/main/java/com/box/sdk/BoxUser.java @@ -29,12 +29,33 @@ public class BoxUser extends BoxCollaborator { "address", "avatar_url", "is_exempt_from_device_limits", "is_exempt_from_login_verification", "enterprise", "my_tags", "hostname", "is_platform_access_only", "external_app_user_id"}; + /** + * User URL Template. + */ public static final URLTemplate USER_URL_TEMPLATE = new URLTemplate("users/%s"); + /** + * Get Me URL Template. + */ public static final URLTemplate GET_ME_URL = new URLTemplate("users/me"); + /** + * Users URL Template. + */ public static final URLTemplate USERS_URL_TEMPLATE = new URLTemplate("users"); + /** + * User Memberships URL Template. + */ public static final URLTemplate USER_MEMBERSHIPS_URL_TEMPLATE = new URLTemplate("users/%s/memberships"); + /** + * E-Mail Alias URL Template. + */ public static final URLTemplate EMAIL_ALIAS_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases/%s"); + /** + * E-Mail Aliases URL Template. + */ public static final URLTemplate EMAIL_ALIASES_URL_TEMPLATE = new URLTemplate("users/%s/email_aliases"); + /** + * Move Folder To User Template. + */ public static final URLTemplate MOVE_FOLDER_TO_USER_TEMPLATE = new URLTemplate("users/%s/folders/%s"); /** diff --git a/src/main/java/com/box/sdk/BoxWebHook.java b/src/main/java/com/box/sdk/BoxWebHook.java index f866a204f..df21af4eb 100644 --- a/src/main/java/com/box/sdk/BoxWebHook.java +++ b/src/main/java/com/box/sdk/BoxWebHook.java @@ -25,6 +25,15 @@ @BoxResourceType("webhook") public class BoxWebHook extends BoxResource { + /** + * {@link URLTemplate} for {@link BoxWebHook}s resource. + */ + public static final URLTemplate WEBHOOKS_URL_TEMPLATE = new URLTemplate("webhooks"); + /** + * {@link URLTemplate} for single {@link BoxWebHook} resource. + */ + public static final URLTemplate WEBHOOK_URL_TEMPLATE = new URLTemplate("webhooks/%s"); + /** * JSON Key for {@link BoxWebHook} {@link #getID()}. */ @@ -65,15 +74,6 @@ public class BoxWebHook extends BoxResource { */ private static final String JSON_KEY_CREATED_AT = "created_at"; - /** - * {@link URLTemplate} for {@link BoxWebHook}s resource. - */ - public static final URLTemplate WEBHOOKS_URL_TEMPLATE = new URLTemplate("webhooks"); - /** - * {@link URLTemplate} for single {@link BoxWebHook} resource. - */ - public static final URLTemplate WEBHOOK_URL_TEMPLATE = new URLTemplate("webhooks/%s"); - /** * Maps a {@link Trigger} to its {@link Trigger#getValue()}. */ diff --git a/src/main/java/com/box/sdk/BoxWebLink.java b/src/main/java/com/box/sdk/BoxWebLink.java index 3da2fbe67..e701a8109 100644 --- a/src/main/java/com/box/sdk/BoxWebLink.java +++ b/src/main/java/com/box/sdk/BoxWebLink.java @@ -26,7 +26,13 @@ public class BoxWebLink extends BoxItem { "path_collection", "created_at", "modified_at", "trashed_at", "purged_at", "created_by", "modified_by", "owned_by", "shared_link", "parent", "item_status", "collections"}; + /** + * Copy URL Template. + */ public static final URLTemplate COPY_URL_TEMPLATE = new URLTemplate("web_links/%s/copy"); + /** + * Web Link URL Template. + */ public static final URLTemplate WEB_LINK_URL_TEMPLATE = new URLTemplate("web_links/%s"); /** diff --git a/src/main/java/com/box/sdk/EventLog.java b/src/main/java/com/box/sdk/EventLog.java index 77dc47fa9..af794aed0 100644 --- a/src/main/java/com/box/sdk/EventLog.java +++ b/src/main/java/com/box/sdk/EventLog.java @@ -19,10 +19,13 @@ *

*/ public class EventLog implements Iterable { + private static final int ENTERPRISE_LIMIT = 500; + /** + * Enterprise Event URL Template. + */ public static final URLTemplate ENTERPRISE_EVENT_URL_TEMPLATE = new URLTemplate("events?stream_type=admin_logs&" + "limit=" + ENTERPRISE_LIMIT); - private final int chunkSize; private final int limit; private final String nextStreamPosition; diff --git a/src/main/java/com/box/sdk/EventStream.java b/src/main/java/com/box/sdk/EventStream.java index 3bbc110a3..16ff821d4 100644 --- a/src/main/java/com/box/sdk/EventStream.java +++ b/src/main/java/com/box/sdk/EventStream.java @@ -19,10 +19,15 @@ * */ public class EventStream { + private static final int LIMIT = 800; - public static final URLTemplate EVENT_URL = new URLTemplate("events?limit=" + LIMIT + "&stream_position=%s"); private static final int STREAM_POSITION_NOW = -1; + /** + * Events URL. + */ + public static final URLTemplate EVENT_URL = new URLTemplate("events?limit=" + LIMIT + "&stream_position=%s"); + private final BoxAPIConnection api; private final long startingPosition; private final Collection listeners; diff --git a/src/main/java/com/box/sdk/URLTemplate.java b/src/main/java/com/box/sdk/URLTemplate.java index fb5b4b5e9..d33ffd53a 100644 --- a/src/main/java/com/box/sdk/URLTemplate.java +++ b/src/main/java/com/box/sdk/URLTemplate.java @@ -3,13 +3,26 @@ import java.net.MalformedURLException; import java.net.URL; +/** + * A template class to build URLs from base URL, path, URL parameters and Query String. + */ public class URLTemplate { private String template; - URLTemplate(String template) { + /** + * Construct an URL Template object from path. + * @param template path + */ + public URLTemplate(String template) { this.template = template; } + /** + * Build a URL with URL Parameters. + * @param base base URL + * @param values URL parameters + * @return URL + */ public URL build(String base, Object... values) { String urlString = String.format(base + this.template, values); @@ -23,6 +36,13 @@ public URL build(String base, Object... values) { return url; } + /** + * Build a URL with Query String and URL Parameters. + * @param base base URL + * @param queryString query string + * @param values URL Parameters + * @return URL + */ public URL buildWithQuery(String base, String queryString, Object... values) { String urlString = String.format(base + this.template, values) + queryString; URL url = null; From ff0715683656a7e45954ddbe52fad66b8486dbb7 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Fri, 25 Aug 2017 13:25:50 -0700 Subject: [PATCH 5/8] batch example and unit tests --- build.gradle | 24 ++-- .../box/sdk/example/BatchRequestExample.java | 17 +-- .../java/com/box/sdk/BatchAPIRequest.java | 15 +- .../java/com/box/sdk/BatchAPIRequestTest.java | 130 ++++++++++++++++++ 4 files changed, 163 insertions(+), 23 deletions(-) create mode 100644 src/test/java/com/box/sdk/BatchAPIRequestTest.java diff --git a/build.gradle b/build.gradle index 8c72c1335..ce89b85ca 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,15 @@ repositories { mavenCentral() } +sourceSets { + example { + java { + compileClasspath += main.output + runtimeClasspath += main.runtimeClasspath + } + } +} + dependencies { compile 'com.eclipsesource.minimal-json:minimal-json:0.9.1' compile 'org.bitbucket.b_c:jose4j:0.4.4' @@ -26,6 +35,7 @@ dependencies { testCompile 'org.mockito:mockito-core:1.9.5' testCompile 'org.slf4j:slf4j-api:1.7.7' testCompile 'org.slf4j:slf4j-nop:1.7.7' + exampleCompile 'com.eclipsesource.minimal-json:minimal-json:0.9.1' } compileJava { @@ -52,15 +62,6 @@ javadoc { checkstyleMain { classpath += configurations.compile } checkstyleTest { classpath += configurations.compile } -sourceSets { - example { - java { - compileClasspath += main.output - runtimeClasspath += main.runtimeClasspath - } - } -} - task runExample(type: JavaExec, dependsOn: 'exampleClasses') { classpath = sourceSets.example.runtimeClasspath main = 'com.box.sdk.example.Main' @@ -76,6 +77,11 @@ task runAccessAsAppUser(type: JavaExec, dependsOn: 'exampleClasses') { main = 'com.box.sdk.example.AccessAsAppUser' } +task runBatchExample(type: JavaExec, dependsOn: 'exampleClasses') { + classpath = sourceSets.example.runtimeClasspath + main = 'com.box.sdk.example.BatchRequestExample' +} + task javadocJar(type: Jar) { classifier = 'javadoc' from javadoc diff --git a/src/example/java/com/box/sdk/example/BatchRequestExample.java b/src/example/java/com/box/sdk/example/BatchRequestExample.java index 901a3afa2..e375c39ab 100644 --- a/src/example/java/com/box/sdk/example/BatchRequestExample.java +++ b/src/example/java/com/box/sdk/example/BatchRequestExample.java @@ -1,4 +1,4 @@ -package com.box.sdk.utilities; +package com.box.sdk.example; import java.io.FileReader; import java.io.IOException; @@ -14,25 +14,23 @@ import com.box.sdk.BoxAPIResponse; import com.box.sdk.BoxConfig; import com.box.sdk.BoxDeveloperEditionAPIConnection; -import com.box.sdk.BoxFile; import com.box.sdk.BoxFolder; import com.box.sdk.BoxJSONRequest; import com.box.sdk.BoxJSONResponse; -import com.box.sdk.BoxResource; import com.box.sdk.BoxUser; import com.box.sdk.IAccessTokenCache; import com.box.sdk.InMemoryLRUAccessTokenCache; import com.box.sdk.http.HttpMethod; -import com.eclipsesource.json.JsonObject; /** * */ -public class BatchRequestExample { +public final class BatchRequestExample { private static final int MAX_CACHE_ENTRIES = 100; - private static final String APP_USER_NAME = "BATCH-TEST-APP-USER-NAME"; + private static final String APP_USER_NAME = "BATCH-TEST-APP-USER-NAME"; + private BatchRequestExample() { } public static void main(String[] args) throws IOException { // Turn off logging to prevent polluting the output. @@ -44,7 +42,7 @@ public static void main(String[] args) throws IOException { //implement IAccessTokenCache to store and retrieve access tokens appropriately for your environment. IAccessTokenCache accessTokenCache = new InMemoryLRUAccessTokenCache(MAX_CACHE_ENTRIES); - Reader reader = new FileReader("src/example/config/config2.json"); + Reader reader = new FileReader("src/example/config/config.json"); BoxConfig boxConfig = BoxConfig.readFrom(reader); BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection( @@ -60,10 +58,7 @@ public static void main(String[] args) throws IOException { //Create App User Request URL createUserURL = BoxUser.USERS_URL_TEMPLATE.build(api.getBaseURL()); BoxJSONRequest createAppUserRequest = new BoxJSONRequest(createUserURL, HttpMethod.POST); - JsonObject requestJSON = new JsonObject(); - requestJSON.add("name", APP_USER_NAME); - requestJSON.add("is_platform_access_only", true); - createAppUserRequest.setBody(requestJSON.toString()); + createAppUserRequest.setBody("{\"name\":\"" + APP_USER_NAME + "\",\"is_platform_access_only\":true}"); requests.add(createAppUserRequest); //Get Root Folder Request diff --git a/src/main/java/com/box/sdk/BatchAPIRequest.java b/src/main/java/com/box/sdk/BatchAPIRequest.java index a398baeea..0ba5f7d88 100644 --- a/src/main/java/com/box/sdk/BatchAPIRequest.java +++ b/src/main/java/com/box/sdk/BatchAPIRequest.java @@ -40,11 +40,15 @@ public BatchAPIRequest(BoxAPIConnection api) { */ public List execute(List requests) { this.prepareRequest(requests); - BoxJSONResponse batchResponse = (BoxJSONResponse) super.send(); + BoxJSONResponse batchResponse = (BoxJSONResponse) send(); return this.parseResponse(batchResponse); } - private void prepareRequest(List requests) { + /** + * Prepare a batch api request using list of individual reuests. + * @param requests list of api requests that has to be executed in batch. + */ + protected void prepareRequest(List requests) { JsonObject body = new JsonObject(); JsonArray requestsJSONArray = new JsonArray(); for (BoxAPIRequest request: requests) { @@ -76,7 +80,12 @@ private void prepareRequest(List requests) { super.setBody(body); } - private List parseResponse(BoxJSONResponse batchResponse) { + /** + * Parses btch api response to create a list of BoxAPIResponse objects. + * @param batchResponse response of a batch api request + * @return list of BoxAPIResponses + */ + protected List parseResponse(BoxJSONResponse batchResponse) { JsonObject responseJSON = JsonObject.readFrom(batchResponse.getJSON()); List responses = new ArrayList(); Iterator responseIterator = responseJSON.get("responses").asArray().iterator(); diff --git a/src/test/java/com/box/sdk/BatchAPIRequestTest.java b/src/test/java/com/box/sdk/BatchAPIRequestTest.java new file mode 100644 index 000000000..a8a072198 --- /dev/null +++ b/src/test/java/com/box/sdk/BatchAPIRequestTest.java @@ -0,0 +1,130 @@ +package com.box.sdk; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import com.box.sdk.http.HttpMethod; +import com.eclipsesource.json.JsonArray; +import com.eclipsesource.json.JsonObject; +import com.eclipsesource.json.JsonValue; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +/** + * + */ +public class BatchAPIRequestTest { + @Test + @Category(UnitTest.class) + public void testThatBodyHasAllRequiredFieldsInEachResponse() { + try { + final String anyClientID = ""; + final String anyClientSecret = ""; + final String anyAccessToken = ""; + final String anyRefreshToken = ""; + + BoxAPIConnection api = new BoxAPIConnection(anyClientID, anyClientSecret, anyAccessToken, anyRefreshToken); + + List requests = new ArrayList(); + + //Get current user request + URL getMeURL = BoxUser.GET_ME_URL.build(api.getBaseURL()); + BoxAPIRequest getMeRequest = new BoxAPIRequest(getMeURL, HttpMethod.GET); + requests.add(getMeRequest); + + //Create App User Request + URL createUserURL = BoxUser.USERS_URL_TEMPLATE.build(api.getBaseURL()); + BoxJSONRequest createAppUserRequest = new BoxJSONRequest(createUserURL, HttpMethod.POST); + createAppUserRequest.setBody("{\"name\":\"some-name\"," + + "\"is_platform_access_only\":true}"); + requests.add(createAppUserRequest); + + //Get Root Folder Request + URL getRootFolderURL = BoxFolder.FOLDER_INFO_URL_TEMPLATE.build(api.getBaseURL(), 0); + BoxAPIRequest getRootFolderRequest = new BoxAPIRequest(getRootFolderURL, HttpMethod.GET); + requests.add(getRootFolderRequest); + + BatchAPIRequest batchRequest = new BatchAPIRequest(api); + batchRequest.prepareRequest(requests); + + assertTrue("requests field should be an array", + (batchRequest.getBodyAsJsonObject().get("requests").isArray())); + + JsonArray requestsArray = batchRequest.getBodyAsJsonObject().get("requests").asArray(); + for (JsonValue request : requestsArray) { + assertTrue("each request should be an object", + (request.isObject())); + assertTrue("each request should have a relative_url that is string", + (((JsonObject) request).get("relative_url").isString())); + assertTrue("each request should have a method that is string", + (((JsonObject) request).get("method").isString())); + assertTrue("each request should have headers as object", + (((JsonObject) request).get("headers").isObject())); + if (((JsonObject) request).get("method").asString().equals(HttpMethod.POST)) { + assertTrue("request should have body when method is POST", + (((JsonObject) request).get("body").isObject())); + } + } + + } catch (Exception e) { + fail("Exception during test execution " + e); + } + } + + @Test + @Category(UnitTest.class) + public void testTheParsingResponseWorksAsIntended() { + try { + final String anyClientID = ""; + final String anyClientSecret = ""; + final String anyAccessToken = ""; + final String anyRefreshToken = ""; + + BoxAPIConnection api = new BoxAPIConnection(anyClientID, anyClientSecret, anyAccessToken, anyRefreshToken); + BatchAPIRequest batchRequest = new BatchAPIRequest(api); + String stringResponse = "{\n" + + "\t\"responses\": [{\n" + + "\t\t\t\"status\": 201,\n" + + "\t\t\t\"response\": {\n" + + "\t\t\t\t\"type\": \"collaboration\",\n" + + "\t\t\t\t\"id\": \"123\"\n" + + "\t\t\t}\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"status\": 404,\n" + + "\t\t\t\"response\": {\n" + + "\t\t\t\t\"type\": \"error\",\n" + + "\t\t\t\t\"status\": 404,\n" + + "\t\t\t\t\"code\": \"not_found\",\n" + + "\t\t\t\t\"message\": \"Not Found\",\n" + + "\t\t\t\t\"request_id\": \"139334760758014ea2935ab\"\n" + + "\t\t\t}\n" + + "\t\t},\n" + + "\t\t{\n" + + "\t\t\t\"status\": 200,\n" + + "\t\t\t\"response\": {\n" + + "\t\t\t\t\"type\": \"collaboration\",\n" + + "\t\t\t\t\"id\": \"456\"\n" + + "\t\t\t}\n" + + "\t\t}\n" + + "\t]\n" + + "}"; + JsonObject responseJson = JsonObject.readFrom(stringResponse); + BoxJSONResponse batchResponse = new BoxJSONResponse(200, null, responseJson); + List responses = batchRequest.parseResponse(batchResponse); + + assertTrue("There should be three responses", responses.size() == 3); + for (BoxAPIResponse response: responses) { + assertTrue("Always has response body", ((BoxJSONResponse) response).getJsonObject() != null); + } + + } catch (Exception e) { + fail("Exception during test execution " + e); + } + } + +} From 947c80b3906474797f2459d13f282cade23451c6 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Fri, 25 Aug 2017 13:30:06 -0700 Subject: [PATCH 6/8] example details --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 9dfe53c2e..2f008218f 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,12 @@ Then just invoke `gradle runAccessAsAppUser` to run the AccessAsAppUser example! Note: The JCE bundled with oracle JRE supports keys upto 128 bit length only. To use larger cryptographic keys, install [JCE Unlimited Strength Jurisdiction Policy Files](http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html). +#### BatchRequestExample + +There migt be cases where you want a bunch of requests to be executed as a single request. This example will show you how to do that + +Just invoke `gradle runBatchExample` to run the BatchRequestExample example! + Building -------- From 1f78f147520a075f7f3c0bc5f544f555e868b4d5 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Fri, 25 Aug 2017 13:51:04 -0700 Subject: [PATCH 7/8] relative path for suppressing checkstyle. documentation for BatchAPIRequest class --- config/checkstyle/suppressions.xml | 2 +- src/main/java/com/box/sdk/BatchAPIRequest.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml index 7dab151a0..58d445bbd 100644 --- a/config/checkstyle/suppressions.xml +++ b/config/checkstyle/suppressions.xml @@ -14,5 +14,5 @@ + files="main/java/com/box/sdk/EventLog.java"/> diff --git a/src/main/java/com/box/sdk/BatchAPIRequest.java b/src/main/java/com/box/sdk/BatchAPIRequest.java index 0ba5f7d88..88871bcfe 100644 --- a/src/main/java/com/box/sdk/BatchAPIRequest.java +++ b/src/main/java/com/box/sdk/BatchAPIRequest.java @@ -5,7 +5,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.logging.Logger; import com.box.sdk.http.HttpHeaders; import com.box.sdk.http.HttpMethod; @@ -14,14 +13,18 @@ import com.eclipsesource.json.JsonValue; /** + * Used to make a bunch of HTTP Requests as a batch. Currently the number of requests that can be batched at once + * is capped at 20 by the API layer. Also there are certain requests which cannot be performed + * by Batch API. Check API documentation for more information. * + *

The request itself is a BoxJSONRequest but extends it to provide additional functionality for aggregating + * a bunch of requests and responding with multiple responses as if the requests were called individually

*/ public class BatchAPIRequest extends BoxJSONRequest { /** * Batch URL Template. */ public static final URLTemplate BATCH_URL_TEMPLATE = new URLTemplate("batch"); - private static final Logger LOGGER = Logger.getLogger(BoxAPIRequest.class.getName()); private final BoxAPIConnection api; /** From 70de9a64f09a3a882bb61dccc67aedca15462288 Mon Sep 17 00:00:00 2001 From: Harish Gokavarapu Date: Mon, 28 Aug 2017 13:05:32 -0700 Subject: [PATCH 8/8] feedback --- src/main/java/com/box/sdk/BoxAPIResponse.java | 3 ++- src/main/java/com/box/sdk/BoxJSONRequest.java | 10 +++++----- src/main/java/com/box/sdk/BoxJSONResponse.java | 11 +++-------- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/box/sdk/BoxAPIResponse.java b/src/main/java/com/box/sdk/BoxAPIResponse.java index 0488b3880..c136aa4f9 100644 --- a/src/main/java/com/box/sdk/BoxAPIResponse.java +++ b/src/main/java/com/box/sdk/BoxAPIResponse.java @@ -27,6 +27,7 @@ public class BoxAPIResponse { private static final int BUFFER_SIZE = 8192; private final HttpURLConnection connection; + //Batch API Response will have headers in response body private final Map headers; private int responseCode; @@ -109,7 +110,7 @@ public long getContentLength() { * @return value of the header. */ public String getHeaderField(String fieldName) { - //Whenever headers map is null, try to get the headers from the connection + // headers map is null for all regular response calls except when made as a batch request if (this.headers == null) { if (this.connection != null) { return this.connection.getHeaderField(fieldName); diff --git a/src/main/java/com/box/sdk/BoxJSONRequest.java b/src/main/java/com/box/sdk/BoxJSONRequest.java index aabfaf823..105f34a95 100644 --- a/src/main/java/com/box/sdk/BoxJSONRequest.java +++ b/src/main/java/com/box/sdk/BoxJSONRequest.java @@ -12,7 +12,7 @@ * automatically sets the appropriate "Content-Type" HTTP headers and allows the JSON in the request to be logged.

*/ public class BoxJSONRequest extends BoxAPIRequest { - private JsonObject json; + private JsonObject jsonObject; /** * Constructs an authenticated BoxJSONRequest using a provided BoxAPIConnection. @@ -53,7 +53,7 @@ public BoxJSONRequest(URL url, HttpMethod method) { @Override public void setBody(String body) { super.setBody(body); - this.json = JsonObject.readFrom(body); + this.jsonObject = JsonObject.readFrom(body); } /** @@ -62,7 +62,7 @@ public void setBody(String body) { */ public void setBody(JsonObject body) { super.setBody(body.toString()); - this.json = body; + this.jsonObject = body; } /** @@ -70,11 +70,11 @@ public void setBody(JsonObject body) { * @return body represented as JsonObject. */ public JsonObject getBodyAsJsonObject() { - return this.json; + return this.jsonObject; } @Override protected String bodyToString() { - return this.json.asString(); + return this.jsonObject.toString(); } } diff --git a/src/main/java/com/box/sdk/BoxJSONResponse.java b/src/main/java/com/box/sdk/BoxJSONResponse.java index 88b1f98f0..082e7aea9 100644 --- a/src/main/java/com/box/sdk/BoxJSONResponse.java +++ b/src/main/java/com/box/sdk/BoxJSONResponse.java @@ -16,7 +16,6 @@ public class BoxJSONResponse extends BoxAPIResponse { private static final int BUFFER_SIZE = 8192; private JsonObject jsonObject; - private String json; /** * Constructs a BoxJSONResponse without an associated HttpURLConnection. @@ -42,7 +41,6 @@ public BoxJSONResponse(HttpURLConnection connection) { public BoxJSONResponse(int responseCode, Map httpHeaders, JsonObject body) { super(responseCode, httpHeaders); this.jsonObject = body; - this.json = body.toString(); } /** @@ -63,12 +61,9 @@ public JsonObject getJsonObject() { * @return the body of the response as a JSON string. */ public String getJSON() { - if (this.json != null) { - return this.json; - } else if (this.jsonObject != null) { + if (this.jsonObject != null) { return this.jsonObject.toString(); } else { - InputStreamReader reader = new InputStreamReader(this.getBody(), StandardCharsets.UTF_8); StringBuilder builder = new StringBuilder(); char[] buffer = new char[BUFFER_SIZE]; @@ -85,8 +80,8 @@ public String getJSON() { } catch (IOException e) { throw new BoxAPIException("Couldn't connect to the Box API due to a network error.", e); } - this.json = builder.toString(); - return this.json; + this.jsonObject = JsonObject.readFrom(builder.toString()); + return builder.toString(); } }