package edu.harvard.med.screensaver.rest;
import java.util.Map;
import org.apache.log4j.Logger;
import com.google.common.collect.Maps;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import edu.harvard.med.screensaver.db.DAOTransaction;
import edu.harvard.med.screensaver.model.libraries.Reagent;
import edu.harvard.med.screensaver.model.screenresults.AnnotationType;
import edu.harvard.med.screensaver.model.screens.Study;
public class StudyValuesConverter extends RestConverter
{
public static class StudyValues
{
public Study s;
public StudyValues(Study s)
{
this.s = s;
}
}
private static final Logger log = Logger.getLogger(StudyValuesConverter.class);
public boolean canConvert(Class clazz)
{
return StudyValuesConverter.StudyValues.class.isAssignableFrom(clazz);
}
public void marshal(final Object value, final HierarchicalStreamWriter writer, MarshallingContext context)
{
final XStreamUtil util = new XStreamUtil(writer, context, getEntityUriGenerator());
getDao().doInTransaction(new DAOTransaction() {
@Override
public void runTransaction()
{
Study s = getDao().reloadEntity(((StudyValuesConverter.StudyValues) value).s);
// Write out the columns
util.writeNodes(s.getAnnotationTypes(), "columns", "column");
// Write out the <data><reagent><values>....
writer.startNode("data");
// create a list of the canonical wells - any reagent will do
Map<String,Reagent> canonicalWellsMap = Maps.newHashMap();
for(Reagent r:s.getReagents())
{
canonicalWellsMap.put(r.getWell().getFacilityId(), r);
}
for(Reagent r:canonicalWellsMap.values())
{
writer.startNode("reagent");
StudyReagentsCanonicalConverter.writeReagent(util, r);
writer.startNode("values");
StudyRowConverter.writeRow(writer, s, r);
writer.endNode();
writer.endNode();
}
writer.endNode();
}
});
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
return null;
}
}