package edu.harvard.med.screensaver.rest;
import java.util.Map;
import java.util.Set;
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;
public class StudyReagentsCanonicalConverter extends RestConverter
{
public static class StudyReagentsCanonical
{
public Set<Reagent> reagents;
public StudyReagentsCanonical(Class clazz, Set<Reagent> reagents)
{
this.reagents = reagents;
}
}
private static final Logger log = Logger.getLogger(StudyReagentsCanonicalConverter.class);
public boolean canConvert(Class clazz)
{
return StudyReagentsCanonicalConverter.StudyReagentsCanonical.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()
{
Set<Reagent> reagents = ((StudyReagentsCanonicalConverter.StudyReagentsCanonical) value).reagents;
// create a list of the canonical wells - any reagent will do
Map<String,Reagent> canonicalWellsMap = Maps.newHashMap();
for(Reagent r:reagents)
{
r = getDao().reloadEntity(r);
canonicalWellsMap.put(r.getWell().getFacilityId(), r);
}
for (Reagent r : canonicalWellsMap.values())
{
writer.startNode("reagent");
writeReagent(util, r);
writer.endNode();
}
}
});
}
protected static void writeReagent(final XStreamUtil util, Reagent r)
{
util.writeUriAttribute(r);
util.writeNode(r.getVendorId().getVendorName(), "vendorName");
util.writeNode(r.getVendorId().getVendorIdentifier(), "vendorId");
}
}