package edu.harvard.med.screensaver.rest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
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.screens.Screen;
import edu.harvard.med.screensaver.model.users.LabHead;
import edu.harvard.med.screensaver.model.users.ScreeningRoomUser;
/**
* TODO: consider a class hierarchy of ScreensaverUserConverter<-ScreeningRoomUserConverter<-LabHeadConverter
*/
@Component
public class ScreeningRoomUserConverter extends RestConverter
{
private static final Logger log = Logger.getLogger(ScreeningRoomUserConverter.class);
@Autowired
private ScreensaverUserConverter screensaverUserConverter;
public boolean canConvert(Class clazz)
{
return ScreeningRoomUser.class.isAssignableFrom(clazz) && !LabHead.class.isAssignableFrom(clazz);
}
public void marshal(final Object value, HierarchicalStreamWriter writer,
final MarshallingContext context)
{
final XStreamUtil util = new XStreamUtil(writer, context, getEntityUriGenerator());
getDao().doInTransaction(new DAOTransaction() {
@Override
public void runTransaction()
{
ScreeningRoomUser user = (ScreeningRoomUser) value;
user = getDao().findEntityById(ScreeningRoomUser.class, user.getEntityId());
write(util,user);
}
});
}
protected final void write(final XStreamUtil util, final ScreeningRoomUser user)
{
screensaverUserConverter.write(util, user);
util.writeUri(user.getLab().getLabHead(), "labHead");
util.writeNode(new EntityCollection.Screens(Screen.class, user.getScreensLed()), "screensLed");
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context)
{
return null;
}
}