001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
046     * @author Raymond Aug??
047     */
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    }