package edu.harvard.med.screensaver.rest;
import org.apache.log4j.Logger;
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.DataColumn;
import edu.harvard.med.screensaver.model.screenresults.ResultValue;
public class DataColumnValuesConverter extends RestConverter
{
public static class DataColumnValuesRequest
{
public DataColumn dc;
public DataColumnValuesRequest(DataColumn dc)
{
this.dc = dc;
}
}
private static final Logger log = Logger.getLogger(DataColumnValuesConverter.class);
public boolean canConvert(Class clazz)
{
return DataColumnValuesConverter.DataColumnValuesRequest.class.isAssignableFrom(clazz);
}
public void marshal(final Object value, final HierarchicalStreamWriter writer,
MarshallingContext context)
{
getDao().doInTransaction(new DAOTransaction() {
@Override
public void runTransaction()
{
DataColumn dataColumn = ((DataColumnValuesConverter.DataColumnValuesRequest) value).dc;
dataColumn = getDao().findEntityById(DataColumn.class, dataColumn.getEntityId());
if(dataColumn.getResultValues().isEmpty())
{
writer.setValue("empty"); // XStream doesn't like empty nodes
return;
}
int i =0;
long startTime = System.currentTimeMillis();
long loopTime = startTime;
//TODO: not memory performant for larg datasets (>100k) possibly run this out in batches, getting RV's by Plate range, or the like -sde4
for(ResultValue rv:dataColumn.getResultValues())
{
writer.startNode("value");
// Note: may want to just display the platenumber/wellname
// writer.addAttribute("plate", "" + rv.getWell().getPlateNumber());
// writer.addAttribute("well", rv.getWell().getWellName());
writer.addAttribute("href", (String)rv.getWell().acceptVisitor(getEntityUriGenerator()));
writer.setValue("" + rv.getTypedValue());
writer.endNode();
if (i++ % 1000 == 0) {
log.debug("i: " + i + ", elapsed: " + (System.currentTimeMillis() - startTime) + " (ms), loop: " +
(System.currentTimeMillis() - loopTime) + " (ms)");
loopTime = System.currentTimeMillis();
}
}
log.debug("DataColumnValuesRequest: done: " + i + " values, elapsed: " + (System.currentTimeMillis() - startTime) +
" (ms)");
}
});
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
return null;
}
}