1 20 package org.enhydra.barracuda.contrib.dbroggisch.page; 21 22 import java.io.IOException ; 23 import javax.servlet.ServletException ; 24 import javax.servlet.http.HttpServletRequest ; 25 import javax.servlet.http.HttpSession ; 26 import org.enhydra.barracuda.core.event.BaseEvent; 27 import org.enhydra.barracuda.core.event.ControlEventContext; 28 import org.enhydra.barracuda.core.event.DefaultBaseEventListener; 29 import org.enhydra.barracuda.core.event.EventException; 30 import org.apache.log4j.Logger; 31 32 33 37 public abstract class PageEventListener extends DefaultBaseEventListener { 38 39 private static final Logger logger = Logger.getLogger(PageEventListener.class.getName()); 40 41 public final void handleControlEvent(ControlEventContext context) 42 throws EventException, ServletException , IOException { 43 HttpServletRequest req = context.getRequest(); 44 HttpSession session = req.getSession(false); 45 46 Page page = null; 47 boolean pageNewOrDiffers = false; 51 if (session != null) { 52 page = (Page)session.getAttribute(PageFactory.PAGE_KEY); 53 } 54 if (page == null) { 55 page = (Page)context.getState(PageFactory.PAGE_KEY); 56 } 57 58 BaseEvent event = context.getEvent(); 59 if (logger.isDebugEnabled()) logger.debug("Processing event " + event.getClass().getName()); 60 if (page == null) { 61 pageNewOrDiffers = true; 62 if (logger.isDebugEnabled()) logger.debug("No cached PAGE found, need to create fresh PAGE for event"); 63 page = PageFactory.createPage(event); 64 if (page != null) { 65 if (logger.isDebugEnabled()) logger.debug("Page creation successful!"); 66 page.createDefaultModels(context); 67 } else { 68 String errMsg = "Failed to create fresh PAGE for event"; 70 logger.fatal(errMsg); 71 throw new PageException(errMsg); 72 } 73 } else { 74 if (logger.isDebugEnabled()) logger.debug("Cached Page found, checking if it differs from the one specified for event"); 75 if (!page.getClass().equals(PageFactory.getPageClass(event))) { 76 pageNewOrDiffers = true; 77 if (logger.isDebugEnabled()) logger.debug("Page differs, may need to create fresh Page to hand over for event"); 78 Page newPage = PageFactory.createPage(event); 79 if (newPage != null) { 80 if (logger.isInfoEnabled()) logger.info("Handing over"); 81 newPage.handOver(context, page); 82 page = newPage; 83 } else { 84 pageNewOrDiffers = false; 85 } 90 } else { 91 if (logger.isInfoEnabled()) logger.info("Cached Page class matches that associated with requested event " + event.getClass().getName() + ", using cached Page"); 92 } 93 } 94 95 if (page instanceof SessionPage) { 96 if (logger.isDebugEnabled()) logger.debug("Page " + page.getClass().getName() + " implements SessionPage"); 97 if (session == null) { 98 if (logger.isDebugEnabled()) logger.debug("Creating session for SessionPage storage"); 105 session = req.getSession(true); 106 } 107 if (pageNewOrDiffers) { 108 if (logger.isDebugEnabled()) logger.debug("Storing Page in the HttpSession"); 111 session.setAttribute(PageFactory.PAGE_KEY, page); 112 } 113 } else { 114 if (pageNewOrDiffers && session != null) { 115 if (logger.isDebugEnabled()) logger.debug("Ensuring any existing SessionPage is Removed from the HttpSession"); 122 session.removeAttribute(PageFactory.PAGE_KEY); 123 } 124 context.putState(PageFactory.PAGE_KEY, page); 125 } 126 127 handleControlEvent(context, page); 128 } 129 130 public abstract void handleControlEvent(ControlEventContext context, Page page) 131 throws EventException, ServletException , IOException ; 132 133 } 134 | Popular Tags |