All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.box.sdk.BoxComment Maven / Gradle / Ivy

There is a newer version: 4.12.0
Show newest version
package com.box.sdk;

import com.eclipsesource.json.Json;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
import java.net.URL;
import java.util.Date;
import java.util.regex.Pattern;

/**
 * Represents a comment on a file. Comments can be added directly to a file or they can be created as replies to other
 * comments.
 *
 * 

Unless otherwise noted, the methods in this class can throw an unchecked {@link BoxAPIException} (unchecked * meaning that the compiler won't force you to handle it) if an error occurs. If you wish to implement custom error * handling for errors related to the Box REST API, you should capture this exception explicitly.

*/ @BoxResourceType("comment") public class BoxComment extends BoxResource { /** * 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. * @param id the ID of the comment. */ public BoxComment(BoxAPIConnection api, String id) { super(api, id); } /** * Determines if a comment message contains an @mention. * * @param message the comment message. * @return true if the message contains an @mention; otherwise false. */ static boolean messageContainsMention(String message) { return MENTION_REGEX.matcher(message).find(); } /** * Gets information about this comment. * * @return info about this comment. */ public Info getInfo() { URL url = COMMENT_URL_TEMPLATE.build(this.getAPI().getBaseURL(), this.getID()); BoxJSONRequest request = new BoxJSONRequest(this.getAPI(), url, "GET"); try (BoxJSONResponse response = request.send()) { JsonObject jsonResponse = Json.parse(response.getJSON()).asObject(); return new Info(jsonResponse); } } /** * Changes the message of this comment. * * @param newMessage the new message for this comment. * @return updated info about this comment. */ public Info changeMessage(String newMessage) { Info newInfo = new Info(); newInfo.setMessage(newMessage); URL url = COMMENT_URL_TEMPLATE.build(this.getAPI().getBaseURL(), this.getID()); BoxJSONRequest request = new BoxJSONRequest(this.getAPI(), url, "PUT"); request.setBody(newInfo.getPendingChanges()); try (BoxJSONResponse response = request.send()) { JsonObject jsonResponse = Json.parse(response.getJSON()).asObject(); return new Info(jsonResponse); } } /** * Replies to this comment with another message. * * @param message the message for the reply. * @return info about the newly created reply comment. */ public BoxComment.Info reply(String message) { JsonObject itemJSON = new JsonObject(); itemJSON.add("type", "comment"); itemJSON.add("id", this.getID()); JsonObject requestJSON = new JsonObject(); requestJSON.add("item", itemJSON); if (BoxComment.messageContainsMention(message)) { requestJSON.add("tagged_message", message); } else { requestJSON.add("message", message); } URL url = ADD_COMMENT_URL_TEMPLATE.build(this.getAPI().getBaseURL()); BoxJSONRequest request = new BoxJSONRequest(this.getAPI(), url, "POST"); request.setBody(requestJSON.toString()); try (BoxJSONResponse response = request.send()) { JsonObject responseJSON = Json.parse(response.getJSON()).asObject(); BoxComment addedComment = new BoxComment(this.getAPI(), responseJSON.get("id").asString()); return addedComment.new Info(responseJSON); } } /** * Deletes this comment. */ public void delete() { URL url = COMMENT_URL_TEMPLATE.build(this.getAPI().getBaseURL(), this.getID()); BoxAPIRequest request = new BoxAPIRequest(this.getAPI(), url, "DELETE"); request.send().close(); } /** * Contains information about a BoxComment. */ public class Info extends BoxResource.Info { private boolean isReplyComment; private String message; private String taggedMessage; private BoxUser.Info createdBy; private Date createdAt; private BoxResource.Info item; private BoxUser.Info modifiedBy; private Date modifiedAt; /** * Constructs an empty Info object. */ public Info() { super(); } /** * Constructs an Info object by parsing information from a JSON string. * * @param json the JSON string to parse. */ public Info(String json) { super(json); } /** * Constructs an Info object using an already parsed JSON object. * * @param jsonObject the parsed JSON object. */ Info(JsonObject jsonObject) { super(jsonObject); } /** * Gets whether or not the comment is a reply to another comment. * * @return true if this comment is a reply to another comment; otherwise false. */ public boolean getIsReplyComment() { return this.isReplyComment; } /** * Gets the comment's message. * * @return the comment's message. */ public String getMessage() { if (this.taggedMessage != null) { return this.taggedMessage; } return this.message; } /** * Sets the comment's message. The message can contain @mentions by using the string @[userid:username] anywhere * within the message, where userid and username are the ID and username of the person being mentioned. * * @param message the comment's new message. */ public void setMessage(String message) { if (messageContainsMention(message)) { this.taggedMessage = message; this.addPendingChange("tagged_message", message); this.removePendingChange("message"); } else { this.message = message; this.addPendingChange("message", message); this.removePendingChange("tagged_message"); } } /** * Gets info about the user who created the comment. * * @return info about the user who created the comment. */ public BoxUser.Info getCreatedBy() { return this.createdBy; } /** * Gets the time the comment was created. * * @return the time the comment was created. */ public Date getCreatedAt() { return this.createdAt; } /** * Gets info about the item this comment is attached to. If the comment is a reply, then the item will be * another BoxComment. Otherwise, the item will be a {@link BoxFile}. * * @return the item this comment is attached to. */ public BoxResource.Info getItem() { return this.item; } /** * Gets info about the user who last modified the comment. * * @return info about the user who last modified the comment. */ public BoxUser.Info getModifiedBy() { return this.modifiedBy; } /** * Gets the time the comment was last modified. * * @return the time the comment was last modified. */ public Date getModifiedAt() { return this.modifiedAt; } @Override public BoxComment getResource() { return BoxComment.this; } @Override protected void parseJSONMember(JsonObject.Member member) { super.parseJSONMember(member); String memberName = member.getName(); JsonValue value = member.getValue(); try { if (memberName.equals("is_reply_comment")) { this.isReplyComment = value.asBoolean(); } else if (memberName.equals("message")) { this.message = value.asString(); } else if (memberName.equals("tagged_message")) { this.taggedMessage = value.asString(); } else if (memberName.equals("created_by")) { JsonObject userJSON = value.asObject(); if (this.createdBy == null) { String userID = userJSON.get("id").asString(); BoxUser user = new BoxUser(getAPI(), userID); this.createdBy = user.new Info(userJSON); } else { this.createdBy.update(userJSON); } } else if (memberName.equals("created_at")) { this.createdAt = BoxDateFormat.parse(value.asString()); } else if (memberName.equals("item")) { this.parseItem(value); } else if (memberName.equals("modified_by")) { JsonObject userJSON = value.asObject(); if (this.modifiedBy == null) { String userID = userJSON.get("id").asString(); BoxUser user = new BoxUser(getAPI(), userID); this.modifiedBy = user.new Info(userJSON); } else { this.modifiedBy.update(userJSON); } } else if (memberName.equals("modified_at")) { this.modifiedAt = BoxDateFormat.parse(value.asString()); } } catch (Exception e) { throw new BoxDeserializationException(memberName, value.toString(), e); } } private void parseItem(JsonValue value) { JsonObject itemJSON = value.asObject(); String itemType = itemJSON.get("type").asString(); if (itemType.equals("file")) { this.updateItemAsFile(itemJSON); } else if (itemType.equals("comment")) { this.updateItemAsComment(itemJSON); } } private void updateItemAsFile(JsonObject itemJSON) { String itemID = itemJSON.get("id").asString(); if (this.item != null && this.item instanceof BoxFile.Info && this.item.getID().equals(itemID)) { this.item.update(itemJSON); } else { BoxFile file = new BoxFile(getAPI(), itemID); this.item = file.new Info(itemJSON); } } private void updateItemAsComment(JsonObject itemJSON) { String itemID = itemJSON.get("id").asString(); if (this.item != null && this.item instanceof BoxComment.Info && this.item.getID().equals(itemID)) { this.item.update(itemJSON); } else { BoxComment comment = new BoxComment(getAPI(), itemID); this.item = comment.new Info(itemJSON); } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy