package edu.harvard.med.screensaver.rest; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.common.base.Function; import com.google.common.collect.Maps; import org.apache.log4j.Logger; import org.springframework.web.servlet.view.AbstractView; import edu.harvard.med.screensaver.model.Entity; import edu.harvard.med.screensaver.ui.arch.view.EntityViewerBackingBean; import edu.harvard.med.screensaver.ui.arch.view.EntityViewerInitializer; public class ScreensaverEntityView extends AbstractView { private static final Logger log = Logger.getLogger(ScreensaverEntityView.class); private String modelEntityKey; private Map<Class<? extends Entity>,ViewerMapping> viewerMappings; public static class ViewerMapping { public static Function<ViewerMapping,Class<? extends Entity>> toKey = new Function<ViewerMapping,Class<? extends Entity>>() { @Override public Class<? extends Entity> apply(ViewerMapping from) { return from.getEntityClass(); } }; Class<? extends Entity> entityClass; String relativeUrlPath; EntityViewerBackingBean viewer; public Class<? extends Entity> getEntityClass() { return entityClass; } public void setEntityClass(Class<? extends Entity> entityClass) { this.entityClass = entityClass; } public String getRelativeUrlPath() { return relativeUrlPath; } public void setRelativeUrlPath(String relativeUrlPath) { this.relativeUrlPath = relativeUrlPath; } public EntityViewerBackingBean getViewer() { return viewer; } public void setViewer(EntityViewerBackingBean viewer) { this.viewer = viewer; } } public void setEntityViewers(List<ViewerMapping> viewerMappings) { this.viewerMappings = Maps.uniqueIndex(viewerMappings, ViewerMapping.toKey); } public String getModelEntityKey() { return modelEntityKey; } public void setModelEntityKey(String modelEntityKey) { this.modelEntityKey = modelEntityKey; } protected void renderMergedOutputModel(Map<String,Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { Entity entity = (Entity) model.get(getModelEntityKey()); // TODO: check for an 'error' here; i.e. if the value stored is an ErrorConverter.ErrorContainer String urlRelativePath; EntityViewerBackingBean viewer; Class<? extends Entity> entityClass = (Class<? extends Entity>) model.get("entityClass"); if (entityClass == null) { entityClass = entity.getClass(); } // if(RestCollection.class.isAssignableFrom(...) ) { // // TODO: this is a proposed "container" for a collection result - invoke a searchResult now? -sde4 // throw new NotImplementedException(); // } if (!!!viewerMappings.containsKey(entityClass)) { throw new RuntimeException("no viewer mapping for " + entity.getClass()); } urlRelativePath = viewerMappings.get(entityClass).getRelativeUrlPath(); viewer = viewerMappings.get(entityClass).getViewer(); log.info("initializing Screensaver viewer " + viewer + " with entity " + entity); request.getSession().setAttribute("entityViewerInitializer", new EntityViewerInitializer(viewer, entity)); response.sendRedirect(request.getContextPath() + urlRelativePath); } }