001
014
015 package com.liferay.portal.kernel.servlet;
016
017 import com.liferay.portal.kernel.portlet.PortletClassLoaderUtil;
018 import com.liferay.portal.kernel.util.BasePortalLifecycle;
019 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
020
021 import javax.servlet.ServletContext;
022 import javax.servlet.ServletContextEvent;
023 import javax.servlet.ServletContextListener;
024
025
029 public abstract class PortalClassLoaderServletContextListener
030 extends BasePortalLifecycle implements ServletContextListener {
031
032 public PortalClassLoaderServletContextListener() {
033 }
034
035 public void contextDestroyed(ServletContextEvent servletContextEvent) {
036 portalDestroy();
037 }
038
039 public void contextInitialized(ServletContextEvent servletContextEvent) {
040 _servletContextEvent = servletContextEvent;
041
042 ServletContext servletContext = servletContextEvent.getServletContext();
043
044 _servletContextName = servletContext.getServletContextName();
045
046 Thread currentThread = Thread.currentThread();
047
048 _portletClassLoader = currentThread.getContextClassLoader();
049
050 registerPortalLifecycle();
051 }
052
053 @Override
054 protected void doPortalDestroy() {
055 PortletClassLoaderUtil.setClassLoader(_portletClassLoader);
056 PortletClassLoaderUtil.setServletContextName(_servletContextName);
057
058 Thread currentThread = Thread.currentThread();
059
060 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
061
062 try {
063 currentThread.setContextClassLoader(
064 PortalClassLoaderUtil.getClassLoader());
065
066 _servletContextListener.contextDestroyed(_servletContextEvent);
067 }
068 finally {
069 currentThread.setContextClassLoader(contextClassLoader);
070
071 PortletClassLoaderUtil.setClassLoader(null);
072 PortletClassLoaderUtil.setServletContextName(null);
073 }
074 }
075
076 @Override
077 protected void doPortalInit() throws Exception {
078 PortletClassLoaderUtil.setClassLoader(_portletClassLoader);
079 PortletClassLoaderUtil.setServletContextName(_servletContextName);
080
081 Thread currentThread = Thread.currentThread();
082
083 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
084
085 try {
086 currentThread.setContextClassLoader(
087 PortalClassLoaderUtil.getClassLoader());
088
089 _servletContextListener = getInstance();
090
091 _servletContextListener.contextInitialized(_servletContextEvent);
092 }
093 finally {
094 currentThread.setContextClassLoader(contextClassLoader);
095 }
096 }
097
098 protected abstract ServletContextListener getInstance() throws Exception;
099
100 private ClassLoader _portletClassLoader;
101 private ServletContextEvent _servletContextEvent;
102 private ServletContextListener _servletContextListener;
103 private String _servletContextName;
104
105 }