package edu.harvard.med.screensaver.rest; import java.util.Map; 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 org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import edu.harvard.med.screensaver.db.DAOTransaction; import edu.harvard.med.screensaver.db.LibrariesDAO; import edu.harvard.med.screensaver.model.screenresults.AnnotationType; import edu.harvard.med.screensaver.model.screenresults.AnnotationValue; public class StudyColumnValuesConverter extends RestConverter { public static class StudyColumnValuesRequest { public AnnotationType at; public StudyColumnValuesRequest(AnnotationType at) { this.at = at; } } private static final Logger log = Logger.getLogger(StudyColumnValuesConverter.class); @Autowired private LibrariesDAO librariesDao; public boolean canConvert(Class clazz) { return StudyColumnValuesConverter.StudyColumnValuesRequest.class.isAssignableFrom(clazz); } public void marshal(final Object value, final HierarchicalStreamWriter writer, MarshallingContext context) { getDao().doInTransaction(new DAOTransaction() { @Override public void runTransaction() { AnnotationType at = ((StudyColumnValuesConverter.StudyColumnValuesRequest) value).at; at = getDao().reloadEntity(at); if(at.getAnnotationValues().isEmpty()) { writer.setValue("empty"); // XStream doesn't like empty nodes return; } int i =0; long startTime = System.currentTimeMillis(); long loopTime = startTime; // transform the annotation values into a canonical well list, since they are the same annotations for all the wells (*for LINCS*) Map<String,AnnotationValue> canonicalWellToAnnotationValueMap = Maps.newHashMap(); for(AnnotationValue av :at.getAnnotationValues().values()) { canonicalWellToAnnotationValueMap.put(av.getReagent().getWell().getFacilityId(), av); } for(AnnotationValue av:canonicalWellToAnnotationValueMap.values()) { writer.startNode("value"); writer.addAttribute("reagentUrl", av.getReagent().acceptVisitor(getEntityUriGenerator())); writer.setValue("" + av.getFormattedValue()); 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; } }