1 5 package org.exoplatform.portal.filter; 6 7 import java.io.IOException ; 8 import javax.servlet.*; 9 import javax.servlet.http.HttpServletRequest ; 10 import javax.servlet.http.HttpServletResponse ; 11 import javax.servlet.http.HttpSession ; 12 import org.apache.commons.logging.Log; 13 import org.exoplatform.commons.utils.ExceptionUtil; 14 import org.exoplatform.container.PortalContainer; 15 import org.exoplatform.container.RootContainer; 16 import org.exoplatform.container.SessionContainer; 17 import org.exoplatform.container.client.http.HttpClientInfo; 18 import org.exoplatform.container.monitor.ActionData; 19 import org.exoplatform.portal.session.PortalResources; 20 import org.exoplatform.portal.session.RequestInfo; 21 import org.exoplatform.services.database.HibernateServiceContainer; 22 import org.exoplatform.services.log.LogService; 23 29 public class AdminRequestFilter implements Filter { 30 final public static String ACTION = "action" ; 31 final public static String ADMIN = "admin" ; 32 final public static String RETURN = "return" ; 33 34 private Log log_ ; 35 private String portalName_ ; 36 private HibernateServiceContainer hserviceContainer_; 37 38 public void init(FilterConfig filterConfig) { 39 portalName_ = filterConfig.getServletContext().getServletContextName() ; 40 PortalContainer pcontainer = RootContainer.getInstance().getPortalContainer(portalName_) ; 41 if(pcontainer == null){ 42 pcontainer = RootContainer.getInstance().createPortalContainer(filterConfig.getServletContext()); 43 } 44 PortalContainer.setInstance(pcontainer) ; 45 hserviceContainer_ = 46 (HibernateServiceContainer) pcontainer.getComponentInstanceOfType(HibernateServiceContainer.class) ; 47 LogService lservice = (LogService) pcontainer.getComponentInstanceOfType(LogService.class) ; 48 log_ = lservice.getLog("org.exoplatform.portal.filter") ; 49 PortalContainer.setInstance(null) ; 50 } 51 52 public void doFilter(ServletRequest request, ServletResponse response, 53 FilterChain chain) throws IOException , ServletException { 54 55 long start = System.currentTimeMillis() ; 56 PortalContainer pcontainer = RootContainer.getInstance().getPortalContainer(portalName_) ; 57 PortalContainer.setInstance(pcontainer) ; 58 HttpServletRequest httpRequest = (HttpServletRequest ) request ; 59 HttpSession session = httpRequest.getSession() ; 60 String action = httpRequest.getParameter(ACTION) ; 61 if(ADMIN.equals(action)) { 62 saveAdminPortal(httpRequest,pcontainer) ; 63 } else if(RETURN.equals(action)) { 64 HttpServletResponse httpResponse = (HttpServletResponse ) response ; 65 restoreAdminPortal(httpRequest, httpResponse, pcontainer) ; 66 return ; 67 } 68 SessionContainer scontainer = (SessionContainer)pcontainer.getComponentInstance(session.getId()) ; 69 RequestInfo rinfo = null ; 70 if(scontainer != null) { 71 PortalResources appres = 72 (PortalResources)scontainer.getComponentInstanceOfType(PortalResources.class); 73 appres.getLocaleConfig().setInput(httpRequest) ; 74 rinfo = (RequestInfo) scontainer.getComponentInstanceOfType(RequestInfo.class); 75 } 76 try { 77 if (rinfo == null) { 78 String owner = RequestInfo.getPortalOwner(httpRequest) ; 79 scontainer = pcontainer.createSessionContainer(session.getId(), owner) ; 80 scontainer.getMonitor().setClientInfo(new HttpClientInfo(httpRequest)) ; 81 rinfo = (RequestInfo) scontainer.getComponentInstanceOfType(RequestInfo.class); 82 } 83 rinfo.init(httpRequest, RequestInfo.ADMIN_ACCESS) ; 84 scontainer.startActionLifcycle() ; 85 httpRequest.setAttribute("javax.servlet.include.path_info", rinfo.getViewId()) ; 86 chain.doFilter(request, response) ; 87 } catch (Throwable ex) { 88 ex = ExceptionUtil.getRootCause(ex) ; 89 log_.error("Error: ", ex) ; 90 } finally { 91 hserviceContainer_.closeAllSessions() ; 92 long end = System.currentTimeMillis() ; 93 ActionData data = new ActionData(rinfo.getPortalOwner(), 94 rinfo.getPageName(), 95 httpRequest.getMethod(), 96 end - start, 97 httpRequest.getParameterMap()) ; 98 scontainer.getMonitor().log(data) ; 99 scontainer.endActionLifcycle() ; 100 PortalContainer.setInstance(null) ; 101 } 102 } 103 104 private void saveAdminPortal(HttpServletRequest httpRequest, 105 PortalContainer pcontainer) { 106 HttpSession session = httpRequest.getSession() ; 107 SessionContainer scontainer = (SessionContainer)pcontainer.getComponentInstance(session.getId()) ; 108 Object jsfTree = session.getAttribute(RequestInfo.PORTAL_VIEW_ID) ; 109 Backup backup = new Backup(scontainer, jsfTree) ; 110 session.setAttribute("org.exoplatform.portal.backup", backup) ; 111 pcontainer.removeSessionContainer(session.getId()) ; 112 session.removeAttribute(RequestInfo.PORTAL_VIEW_ID) ; 113 } 114 115 private void restoreAdminPortal(HttpServletRequest request, 116 HttpServletResponse response, 117 PortalContainer pcontainer) throws IOException { 118 HttpSession session = request.getSession() ; 119 Backup backup = (Backup)session.getAttribute("org.exoplatform.portal.backup") ; 120 session.removeAttribute("org.exoplatform.portal.backup") ; 121 SessionContainer scontainer = backup.scontainer_ ; 122 RequestInfo rinfo = (RequestInfo)scontainer.getComponentInstanceOfType(RequestInfo.class); 123 pcontainer.removeSessionContainer(session.getId()) ; 124 pcontainer.registerComponentInstance(session.getId(), scontainer) ; 125 session.setAttribute(rinfo.getViewId(), backup.jsfTree_) ; 126 response.sendRedirect(rinfo.getPageURI()) ; 127 } 128 129 public void destroy() { } 130 131 static class Backup { 132 SessionContainer scontainer_ ; 133 Object jsfTree_ ; 134 135 public Backup(SessionContainer scontainer, Object jsfTree) { 136 scontainer_ = scontainer; 137 jsfTree_ = jsfTree ; 138 } 139 } 140 } | Popular Tags |