001
014
015 package com.liferay.portal.test.listeners;
016
017 import com.liferay.portal.deploy.hot.HookHotDeployListener;
018 import com.liferay.portal.kernel.deploy.hot.DependencyManagementThreadLocal;
019 import com.liferay.portal.kernel.deploy.hot.HotDeployEvent;
020 import com.liferay.portal.kernel.deploy.hot.HotDeployUtil;
021 import com.liferay.portal.kernel.portlet.PortletClassLoaderUtil;
022 import com.liferay.portal.kernel.servlet.ServletContextPool;
023 import com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterHelper;
024 import com.liferay.portal.kernel.test.AbstractExecutionTestListener;
025 import com.liferay.portal.kernel.test.TestContext;
026 import com.liferay.portal.kernel.util.ClassLoaderPool;
027 import com.liferay.portal.kernel.util.PortalLifecycleUtil;
028 import com.liferay.portal.spring.context.PortletContextLoaderListener;
029 import com.liferay.portal.test.mock.AutoDeployMockServletContext;
030 import com.liferay.portal.test.runners.PACLIntegrationJUnitTestRunner;
031 import com.liferay.portal.util.PortalUtil;
032
033 import java.util.HashMap;
034 import java.util.Map;
035
036 import javax.servlet.ServletContext;
037 import javax.servlet.ServletContextEvent;
038
039 import org.springframework.core.io.ClassPathResource;
040 import org.springframework.core.io.FileSystemResourceLoader;
041 import org.springframework.core.io.Resource;
042 import org.springframework.core.io.ResourceLoader;
043 import org.springframework.mock.web.MockServletContext;
044
045
048 public class PACLExecutionTestListener extends AbstractExecutionTestListener {
049
050 @Override
051 public void runAfterClass(TestContext testContext) {
052 HotDeployEvent hotDeployEvent = _hotDeployEvents.remove(
053 testContext.getClazz());
054
055 if (hotDeployEvent == null) {
056 return;
057 }
058
059 HotDeployUtil.fireUndeployEvent(hotDeployEvent);
060
061 PortletContextLoaderListener portletContextLoaderListener =
062 new PortletContextLoaderListener();
063
064 ClassLoaderPool.register(
065 hotDeployEvent.getServletContextName(),
066 hotDeployEvent.getContextClassLoader());
067 PortletClassLoaderUtil.setServletContextName(
068 hotDeployEvent.getServletContextName());
069
070 try {
071 portletContextLoaderListener.contextDestroyed(
072 new ServletContextEvent(hotDeployEvent.getServletContext()));
073 }
074 finally {
075 ClassLoaderPool.unregister(hotDeployEvent.getServletContextName());
076 PortletClassLoaderUtil.setServletContextName(null);
077 }
078 }
079
080 @Override
081 public void runBeforeClass(TestContext testContext) {
082 ServletContext servletContext = ServletContextPool.get(
083 PortalUtil.getServletContextName());
084
085 if (servletContext == null) {
086 servletContext = new AutoDeployMockServletContext(
087 new FileSystemResourceLoader());
088
089 servletContext.setAttribute(
090 InvokerFilterHelper.class.getName(), new InvokerFilterHelper());
091
092 ServletContextPool.put(PortalUtil.getPathContext(), servletContext);
093 }
094
095 HotDeployUtil.reset();
096
097 HotDeployUtil.registerListener(new HookHotDeployListener());
098
099 HotDeployUtil.setCapturePrematureEvents(false);
100
101 PortalLifecycleUtil.flushInits();
102
103 Class<?> clazz = testContext.getClazz();
104
105 ClassLoader classLoader = clazz.getClassLoader();
106
107 MockServletContext mockServletContext = new MockServletContext(
108 new PACLResourceLoader(classLoader));
109
110 mockServletContext.setServletContextName("a-test-hook");
111
112 HotDeployEvent hotDeployEvent = getHotDeployEvent(
113 mockServletContext, classLoader);
114
115 HotDeployUtil.fireDeployEvent(hotDeployEvent);
116
117 PortletContextLoaderListener portletContextLoaderListener =
118 new PortletContextLoaderListener();
119
120 ClassLoaderPool.register(
121 hotDeployEvent.getServletContextName(),
122 hotDeployEvent.getContextClassLoader());
123 PortletClassLoaderUtil.setServletContextName(
124 hotDeployEvent.getServletContextName());
125
126 try {
127 portletContextLoaderListener.contextInitialized(
128 new ServletContextEvent(mockServletContext));
129 }
130 finally {
131 ClassLoaderPool.unregister(hotDeployEvent.getServletContextName());
132 PortletClassLoaderUtil.setServletContextName(null);
133 }
134
135 _hotDeployEvents.put(clazz, hotDeployEvent);
136 }
137
138 protected HotDeployEvent getHotDeployEvent(
139 ServletContext servletContext, ClassLoader classLoader) {
140
141 boolean dependencyManagementEnabled =
142 DependencyManagementThreadLocal.isEnabled();
143
144 try {
145 DependencyManagementThreadLocal.setEnabled(false);
146
147 return new HotDeployEvent(servletContext, classLoader);
148 }
149 finally {
150 DependencyManagementThreadLocal.setEnabled(
151 dependencyManagementEnabled);
152 }
153 }
154
155 private static final Map<Class<?>, HotDeployEvent> _hotDeployEvents =
156 new HashMap<Class<?>, HotDeployEvent>();
157
158 private static class PACLResourceLoader implements ResourceLoader {
159
160 public PACLResourceLoader(ClassLoader classLoader) {
161 _classLoader = classLoader;
162 }
163
164 @Override
165 public ClassLoader getClassLoader() {
166 return _classLoader;
167 }
168
169 @Override
170 public Resource getResource(String location) {
171 ClassLoader classLoader = getClassLoader();
172
173 return new ClassPathResource(
174 PACLIntegrationJUnitTestRunner.RESOURCE_PATH + location,
175 classLoader);
176 }
177
178 private final ClassLoader _classLoader;
179
180 }
181
182 }