package edu.harvard.med.screensaver.rest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
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.screenresults.AssayWell;
import edu.harvard.med.screensaver.model.screenresults.DataColumn;
import edu.harvard.med.screensaver.model.screens.Screen;
public class ScreenResultValuesConverter extends RestConverter
{
public static class ScreenResult
{
public Screen s;
public ScreenResult(Screen s)
{
this.s = s;
}
}
private static final Logger log = Logger.getLogger(ScreenResultValuesConverter.class);
@Autowired
private AssayWellConverter assayWellConverter;
public boolean canConvert(Class clazz)
{
return ScreenResultValuesConverter.ScreenResult.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()
{
Screen s = getDao().reloadEntity(((ScreenResultValuesConverter.ScreenResult) value).s);
if(s.getScreenResult() == null )
{
writer.setValue("empty"); // xstream doesn't like empty nodes.
return;
}
util.writeNodes(s.getScreenResult().getDataColumns(), "columns", getNodeName(DataColumn.class));
writer.startNode("data");
for(AssayWell aw:s.getScreenResult().getAssayWells())
{
writer.startNode(getNodeName(AssayWell.class));
assayWellConverter.write(writer,aw);
writer.startNode("values");
AssayWellValuesConverter.write(writer, aw);
writer.endNode();
writer.endNode();
}
writer.endNode();
}
});
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
return null;
}
}