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 protected void doPortalDestroy() {
056 PortletClassLoaderUtil.setClassLoader(_portletClassLoader);
057 PortletClassLoaderUtil.setServletContextName(_servletContextName);
058
059 Thread currentThread = Thread.currentThread();
060
061 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
062
063 try {
064 currentThread.setContextClassLoader(
065 PortalClassLoaderUtil.getClassLoader());
066
067 _servletContextListener.contextDestroyed(_servletContextEvent);
068 }
069 finally {
070 currentThread.setContextClassLoader(contextClassLoader);
071
072 PortletClassLoaderUtil.setClassLoader(null);
073 PortletClassLoaderUtil.setServletContextName(null);
074 }
075 }
076
077 protected void doPortalInit() {
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 catch (Exception e) {
094 _log.error(e, e);
095 }
096 finally {
097 currentThread.setContextClassLoader(contextClassLoader);
098 }
099 }
100
101 protected abstract ServletContextListener getInstance() throws Exception;
102
103 private static Log _log = LogFactoryUtil.getLog(
104 PortalClassLoaderServletContextListener.class);
105
106 private ServletContextEvent _servletContextEvent;
107 private ServletContextListener _servletContextListener;
108 private ClassLoader _portletClassLoader;
109 private String _servletContextName;
110
111 }