package gov.nih.ncgc.bard.tools;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import gov.nih.ncgc.bard.entity.Assay;
import gov.nih.ncgc.bard.entity.BardLinkedEntity;
import gov.nih.ncgc.bard.entity.Experiment;
import gov.nih.ncgc.bard.entity.Project;
import gov.nih.ncgc.bard.entity.Publication;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Rajarshi Guha
*/
public class ProjectListJsonConverter implements IJsonConverter<BardLinkedEntity> {
@Override
public JsonNode convert(BardLinkedEntity o) throws Exception {
DBUtils db = new DBUtils();
ObjectMapper mapper = new ObjectMapper();
if (!(o.getCollection() instanceof Collection)) throw new IllegalArgumentException("Must supply an object of type BardLinkedEntity");
Collection coll = (Collection) o.getCollection();
JsonNode list = mapper.valueToTree(o);
ArrayNode items = mapper.createArrayNode();
for (Object item : coll) {
if (!(item instanceof Project)) throw new IllegalArgumentException("The BardLinkedEntity must contain Project objects as elements");
Project p = (Project) item;
List<Assay> assays = new ArrayList<Assay>();
for (Long aid : p.getAids())
assays.add(db.getAssayByAid(aid));
List<Experiment> expts = new ArrayList<Experiment>();
for (Long eid : p.getEids())
expts.add(db.getExperimentByExptId(eid));
List<Publication> pubs = new ArrayList<Publication>();
for (Long pmid : p.getPublications())
pubs.add(db.getPublicationByPmid(pmid));
ArrayNode an = mapper.createArrayNode();
for (Assay assay : assays) {
an.add(mapper.valueToTree(assay));
}
ArrayNode en = mapper.createArrayNode();
for (Experiment expt : expts) {
en.add(mapper.valueToTree(expt));
}
ArrayNode pn = mapper.createArrayNode();
for (Publication pub : pubs) {
pn.add(mapper.valueToTree(pub));
}
JsonNode tree = mapper.valueToTree(p);
((ObjectNode)tree).put("eids", en);
((ObjectNode)tree).put("aids", an);
((ObjectNode)tree).put("publications", pn);
items.add(tree);
}
((ObjectNode)list).put("collection", items);
db.closeConnection();
return list;
}
}