package com.stacksync.syncservice.rpc.messages; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.stacksync.commons.models.CommitInfo; import com.stacksync.commons.models.ItemMetadata; import com.stacksync.commons.models.User; import com.stacksync.commons.models.UserWorkspace; public abstract class APIResponse { protected CommitInfo item; protected Long quotaLimit; protected Long quotaUsed; protected Boolean success; protected int errorCode; protected String description; public Boolean getSuccess() { return success; } public int getErrorCode() { return errorCode; } public String getDescription() { return description; } public CommitInfo getItem() { return item; } public ItemMetadata getMetadata() { return item.getMetadata(); } public Long getQuotaLimit() { return quotaLimit; } public void setQuotaLimit(Long quotaLimit) { this.quotaLimit = quotaLimit; } public Long getQuotaUsed() { return quotaUsed; } public void setQuotaUsed(Long quotaUsed) { this.quotaUsed = quotaUsed; } @Override public String toString() { JsonObject jResponse; if (!getSuccess()) { jResponse = new JsonObject(); jResponse.addProperty("error", getErrorCode()); jResponse.addProperty("description", getDescription()); } else { ItemMetadata file = getItem().getMetadata(); jResponse = this.parseItemMetadata(file); } return jResponse.toString(); } private JsonObject parseItemMetadata(ItemMetadata metadata) { JsonObject jMetadata = parseMetadata(metadata); if (metadata.getParentId() == null) { jMetadata.addProperty("parent_file_id", ""); } else { jMetadata.addProperty("parent_file_id", metadata.getParentId()); } if (metadata.getParentId() == null) { jMetadata.addProperty("parent_file_version", ""); } else { jMetadata.addProperty("parent_file_version", metadata.getParentVersion()); } // TODO: send only chunks when is a file if (!metadata.isFolder()) { JsonArray chunks = new JsonArray(); for (String chunk : metadata.getChunks()) { JsonElement elem = new JsonPrimitive(chunk); chunks.add(elem); } jMetadata.add("chunks", chunks); } return jMetadata; } protected JsonObject parseObjectMetadataForAPI(ItemMetadata metadata) { JsonObject jMetadata = parseMetadata(metadata); if (metadata.isFolder()) { jMetadata.addProperty("is_root", metadata.isRoot()); } else { JsonArray chunks = new JsonArray(); for (String chunk : metadata.getChunks()) { JsonElement elem = new JsonPrimitive(chunk); chunks.add(elem); } jMetadata.add("chunks", chunks); } return jMetadata; } protected JsonObject parseMetadata(ItemMetadata metadata) { JsonObject jMetadata = new JsonObject(); if (metadata == null) { return jMetadata; } jMetadata.addProperty("id", metadata.getId()); jMetadata.addProperty("parent_id", metadata.getParentId()); jMetadata.addProperty("filename", metadata.getFilename()); jMetadata.addProperty("is_folder", metadata.isFolder()); jMetadata.addProperty("status", metadata.getStatus()); if (metadata.getModifiedAt() != null) { jMetadata.addProperty("modified_at", metadata.getModifiedAt().toString()); } jMetadata.addProperty("version", metadata.getVersion()); jMetadata.addProperty("checksum", metadata.getChecksum()); jMetadata.addProperty("size", metadata.getSize()); jMetadata.addProperty("mimetype", metadata.getMimetype()); return jMetadata; } protected JsonObject parseUser(User user) { JsonObject jUser = new JsonObject(); if (user == null) { return jUser; } jUser.addProperty("name", user.getName()); jUser.addProperty("email", user.getEmail()); return jUser; } protected JsonObject parseUserWorkspace(UserWorkspace userWorkspace) { if (userWorkspace == null) { return new JsonObject(); } JsonObject jUser = parseUser(userWorkspace.getUser()); jUser.addProperty("is_owner", userWorkspace.isOwner()); jUser.addProperty("joined_at", userWorkspace.getJoinedAt().toString()); return jUser; } }