package edu.harvard.med.screensaver.rest;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
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.screenresults.AnnotationValue;
import edu.harvard.med.screensaver.model.screens.Study;
@Component
public class StudyRowConverter extends RestConverter
{
public static class StudyRow
{
public Study s;
public Reagent r;
public StudyRow(Study s, Reagent r)
{
this.s = s;
this.r = r;
}
}
private static final Logger log = Logger.getLogger(StudyRowConverter.class);
public boolean canConvert(Class clazz)
{
return StudyRowConverter.StudyRow.class.isAssignableFrom(clazz);
}
public void marshal(final Object value, final HierarchicalStreamWriter writer, MarshallingContext context)
{
getDao().doInTransaction(new DAOTransaction() {
@Override
public void runTransaction()
{
Study s = getDao().reloadEntity(((StudyRowConverter.StudyRow) value).s);
Reagent r = getDao().reloadEntity(((StudyRowConverter.StudyRow) value).r);
writeRow(writer, s, r);
}
});
}
protected static void writeRow(final HierarchicalStreamWriter writer, Study s, Reagent r)
{
int colsWritten = 0;
for (AnnotationType at : s.getAnnotationTypes()) {
AnnotationValue av = at.getAnnotationValues().get(r);
writer.startNode("value");
writer.addAttribute("ordinal", at.getOrdinal().toString());
writer.setValue(av.getFormattedValue());
writer.endNode();
colsWritten++;
// NOTE: since we are doing this for one row, do not print out *all* of the wells, just the first one, as this will serve as the "canonical" instance (any will do) - LINCS only
continue;
}
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
return null;
}
}