package com.stacksync.syncservice.rpc.parser; import org.apache.log4j.Logger; 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.ItemMetadata; import com.stacksync.syncservice.rpc.messages.APICommitResponse; import com.stacksync.syncservice.rpc.messages.APICreateFolderResponse; import com.stacksync.syncservice.rpc.messages.APIDeleteResponse; import com.stacksync.syncservice.rpc.messages.APIGetMetadata; import com.stacksync.syncservice.rpc.messages.APIGetVersions; import com.stacksync.syncservice.rpc.messages.APIResponse; import com.stacksync.syncservice.rpc.messages.APIRestoreMetadata; public class JSONParser implements IParser { private static final Logger logger = Logger.getLogger(JSONParser.class.getName()); public JSONParser() { } public String createResponse(APIResponse response) { JsonObject jResponse = null; String bResponse = ""; try { if (response instanceof APIGetMetadata) { jResponse = this.createGetMetadataResponse((APIGetMetadata) response); } else if (response instanceof APIGetVersions) { jResponse = this.createGetVersionsResponse((APIGetVersions) response); } else if (response instanceof APICommitResponse || response instanceof APIDeleteResponse || response instanceof APIRestoreMetadata || response instanceof APICreateFolderResponse) { jResponse = this.createGenericAPIResponse(response); } if (jResponse != null) { bResponse = jResponse.toString(); } } catch (Exception ex) { logger.error(ex.toString(), ex); } return bResponse; } private JsonObject createGetVersionsResponse(APIGetVersions response) { JsonObject jResponse = new JsonObject(); if (response.getSuccess()) { ItemMetadata metadata = response.getItemMetadata(); jResponse = parseObjectMetadataForAPI(metadata); if (metadata.getChildren() != null) { JsonArray contents = new JsonArray(); for (ItemMetadata entry : metadata.getChildren()) { JsonObject entryJson = parseObjectMetadataForAPI(entry); contents.add(entryJson); } jResponse.add("versions", contents); } } else { jResponse.addProperty("error", response.getErrorCode()); jResponse.addProperty("description", response.getDescription()); } return jResponse; } private JsonObject createGenericAPIResponse(APIResponse response) { JsonObject jResponse; if (!response.getSuccess()) { jResponse = new JsonObject(); jResponse.addProperty("description", response.getDescription()); jResponse.addProperty("error", response.getErrorCode()); } else { ItemMetadata file = response.getItem().getMetadata(); jResponse = this.parseItemMetadata(file); } return jResponse; } private JsonObject createGetMetadataResponse(APIGetMetadata response) { JsonObject jResponse = new JsonObject(); if (response.getSuccess()) { ItemMetadata metadata = response.getItemMetadata(); jResponse = parseObjectMetadataForAPI(metadata); if (metadata.getChildren() != null) { JsonArray contents = new JsonArray(); for (ItemMetadata entry : metadata.getChildren()) { JsonObject entryJson = parseObjectMetadataForAPI(entry); contents.add(entryJson); } jResponse.add("contents", contents); } } else { jResponse.addProperty("error", response.getErrorCode()); jResponse.addProperty("description", response.getDescription()); } return jResponse; } private 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; } private 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; } 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; } }