/** * */ package com.ebay.cloud.cms.typsafe.restful; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ArrayNode; import org.codehaus.jackson.node.ObjectNode; import com.ebay.cloud.cms.typsafe.entity.AbstractCMSEntity; import com.ebay.cloud.cms.typsafe.entity.GenericCMSEntity; import com.ebay.cloud.cms.typsafe.entity.ICMSEntity; import com.ebay.cloud.cms.typsafe.entity.internal.CMSEntityMapper; import com.ebay.cloud.cms.typsafe.entity.internal.JsonCMSEntity; import com.ebay.cloud.cms.typsafe.exception.CMSClientException; import com.ebay.cloud.cms.typsafe.restful.RestExecutor.HttpRequest; import com.ebay.cloud.cms.typsafe.service.CMSClientConfig; import com.ebay.cloud.cms.typsafe.service.CMSClientContext; import com.sun.jersey.api.client.ClientResponse; /** * @author liasu * */ public class EntityResponseProcessor<T> extends AbstractResponseProcessor { private final Class<T> meta; private final List<T> result; private final JsonNode rootNode; // private final boolean isGeneric; private final CMSEntityMapper.ProcessModeEnum mode; private final CMSClientConfig config; public EntityResponseProcessor(Class<T> amc, ClientResponse resp, CMSClientConfig config, HttpRequest request, CMSClientContext context) { super(resp, request, context); this.config = config; this.meta = amc; this.mode = getMode(amc); this.rootNode = readJson(jsonResponse); this.result = new ArrayList<T>(); parseResponseHeader(); parseReponseBody(); } private CMSEntityMapper.ProcessModeEnum getMode(Class<T> amc) { if (GenericCMSEntity.class == amc) { return CMSEntityMapper.ProcessModeEnum.GENERIC; } else if (ICMSEntity.class == amc) { return CMSEntityMapper.ProcessModeEnum.DYNAMIC; } else { return CMSEntityMapper.ProcessModeEnum.TYPE_SAFE; } } EntityResponseProcessor(Class<T> amc, ClientResponse resp, String jsonString, JsonNode rNode, CMSClientConfig config, HttpRequest request, CMSClientContext context) { super(resp, jsonString, request, context); this.config = config; this.meta = amc; this.mode = getMode(amc); this.rootNode = rNode; this.result = new ArrayList<T>(); parseResponseHeader(); parseReponseBody(); } private void parseReponseBody() { JsonNode resultNode = rootNode.get(RESULT); if (resultNode != null && resultNode.isArray()) { ArrayNode resultArray = (ArrayNode) resultNode; for (JsonNode node : resultArray) { T o = parseResponseObject(node); result.add(o); } } } @SuppressWarnings({ "unchecked", "deprecation"}) private T parseResponseObject(JsonNode node) { T o = null; if (!ICMSEntity.class.isAssignableFrom(meta)) { try { o = objectMapper.readValue(node, meta); } catch (Exception e) { throw new CMSClientException(response.getStatus(), MessageFormat.format( "Parsing reponse result node error, walformed node string {0}, target meta class name {1}", node.getValueAsText(), meta.getName()), e, jsonResponse, requestInfo); } return o; } JsonCMSEntity cmsJsonCMSEntity = new JsonCMSEntity((ObjectNode) node, (Class<? extends ICMSEntity>) meta); CMSEntityMapper mapper = new CMSEntityMapper((ObjectNode) node, config, meta, mode, meta); cmsJsonCMSEntity.traverse(mapper); o = (T) mapper.getTargetEntity(); if (o instanceof AbstractCMSEntity) { ((AbstractCMSEntity) o).set_repo(config.getRepository()); ((AbstractCMSEntity) o).set_branch(config.getBranch()); } return o; } protected final JsonNode getRootNode() { return rootNode; } public List<T> getBuildEntity() { return result; } }