package edu.harvard.med.screensaver.ui.arch.util.servlet; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; import edu.harvard.med.screensaver.rest.ScreensaverEntityView; import edu.harvard.med.screensaver.ui.arch.view.EntityViewerBackingBean; import edu.harvard.med.screensaver.ui.arch.view.EntityViewerInitializer; /** * Initializes an {@link EntityViewerBackingBean} before JSF attempts to render to the viewer. * * @motivation for servicing RESTful URLs redirects into the web application by the Spring MVC framework, which cannot * initialize the viewer until a user has been authenticated by the web application. * @see EntityViewerInitializer * @see ScreensaverEntityView * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a> */ public class EntityViewerInitializerPhaseListener implements PhaseListener { private static final Logger log = Logger.getLogger(EntityViewerInitializerPhaseListener.class); @Override public PhaseId getPhaseId() { return PhaseId.RENDER_RESPONSE; } @Override public void beforePhase(PhaseEvent event) { log.info("intercepted " + event); HttpSession httpSession = (HttpSession) event.getFacesContext().getExternalContext().getSession(false); Object entityViewerInitializer = httpSession.getAttribute("entityViewerInitializer"); if (entityViewerInitializer != null) { // viewers rely upon having an authenticated user in place, which is not the case if Tomcat has sent us to the login page if (((EntityViewerInitializer) entityViewerInitializer).isReadyForInitialization()) { httpSession.removeAttribute("entityViewerInitializer"); ((EntityViewerInitializer) entityViewerInitializer).apply(); } } } @Override public void afterPhase(PhaseEvent event) { } }