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.util.InstanceFactory;
020 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
021 import com.liferay.portal.kernel.util.PortalLifecycle;
022 import com.liferay.portal.kernel.util.PortalLifecycleUtil;
023
024 import java.io.IOException;
025
026 import javax.servlet.ServletConfig;
027 import javax.servlet.ServletException;
028 import javax.servlet.http.HttpServlet;
029 import javax.servlet.http.HttpServletRequest;
030 import javax.servlet.http.HttpServletResponse;
031
032
035 public class PortalClassLoaderServlet
036 extends HttpServlet implements PortalLifecycle {
037
038 @Override
039 public void destroy() {
040 portalDestroy();
041 }
042
043 @Override
044 public void init(ServletConfig servletConfig) {
045 _servletConfig = servletConfig;
046
047 PortalLifecycleUtil.register(this);
048 }
049
050 @Override
051 public void portalDestroy() {
052 if (!_calledPortalDestroy) {
053 PortalLifecycleUtil.removeDestroy(this);
054
055 doPortalDestroy();
056
057 _calledPortalDestroy = true;
058 }
059 }
060
061 @Override
062 public void portalInit() {
063 Thread currentThread = Thread.currentThread();
064
065 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
066
067 ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader();
068
069 try {
070 currentThread.setContextClassLoader(portalClassLoader);
071
072 String servletClass = _servletConfig.getInitParameter(
073 "servlet-class");
074
075 _servlet = (HttpServlet)InstanceFactory.newInstance(
076 portalClassLoader, servletClass);
077
078 _servlet.init(_servletConfig);
079 }
080 catch (Exception e) {
081 _log.error(e, e);
082 }
083 finally {
084 currentThread.setContextClassLoader(contextClassLoader);
085 }
086 }
087
088 @Override
089 public void service(
090 HttpServletRequest request, HttpServletResponse response)
091 throws IOException, ServletException {
092
093 Thread currentThread = Thread.currentThread();
094
095 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
096
097 try {
098 currentThread.setContextClassLoader(
099 PortalClassLoaderUtil.getClassLoader());
100
101 _servlet.service(request, response);
102 }
103 finally {
104 currentThread.setContextClassLoader(contextClassLoader);
105 }
106 }
107
108 protected void doPortalDestroy() {
109 Thread currentThread = Thread.currentThread();
110
111 ClassLoader contextClassLoader = currentThread.getContextClassLoader();
112
113 try {
114 currentThread.setContextClassLoader(
115 PortalClassLoaderUtil.getClassLoader());
116
117 if (_servlet != null) {
118 _servlet.destroy();
119 }
120 }
121 finally {
122 currentThread.setContextClassLoader(contextClassLoader);
123 }
124 }
125
126 private static Log _log = LogFactoryUtil.getLog(
127 PortalClassLoaderServlet.class);
128
129 private boolean _calledPortalDestroy;
130 private HttpServlet _servlet;
131 private ServletConfig _servletConfig;
132
133 }