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