All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.portal.kernel.deploy.hot.HotDeployEvent Maven / Gradle / Ivy

There is a newer version: 7.4.3.112-ga112
Show newest version
/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.portal.kernel.deploy.hot;

import aQute.bnd.annotation.ProviderType;

import com.liferay.portal.kernel.deploy.DeployManagerUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.plugin.PluginPackage;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.PortalLifecycle;
import com.liferay.portal.kernel.util.PropertiesUtil;
import com.liferay.portal.kernel.util.ReleaseInfo;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;

import java.io.IOException;
import java.io.InputStream;

import java.util.List;
import java.util.Properties;
import java.util.Queue;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentLinkedQueue;

import javax.servlet.ServletContext;

/**
 * @author Ivica Cardic
 * @author Brian Wing Shun Chan
 * @author Raymond Augé
 * @author Miguel Pastor
 */
@ProviderType
public class HotDeployEvent {

	public HotDeployEvent(ServletContext servletContext) {
		this(servletContext, servletContext.getClassLoader());
	}

	public HotDeployEvent(
		ServletContext servletContext, ClassLoader contextClassLoader) {

		_servletContext = servletContext;
		_contextClassLoader = contextClassLoader;

		try {
			initDependentServletContextNames();
		}
		catch (IOException ioe) {
			_log.error(ioe, ioe);
		}
	}

	public void addPortalLifecycle(PortalLifecycle portalLifecycle) {
		_portalLifecycles.add(portalLifecycle);
	}

	public void flushInits() {
		for (PortalLifecycle portalLifecycle : _portalLifecycles) {
			portalLifecycle.portalInit();
		}

		_portalLifecycles.clear();
	}

	public ClassLoader getContextClassLoader() {
		return _contextClassLoader;
	}

	public Set getDependentServletContextNames() {
		return _dependentServletContextNames;
	}

	public PluginPackage getPluginPackage() {
		return _pluginPackage;
	}

	public ServletContext getServletContext() {
		return _servletContext;
	}

	public String getServletContextName() {
		return _servletContext.getServletContextName();
	}

	public void setPluginPackage(PluginPackage pluginPackage) {
		_pluginPackage = pluginPackage;
	}

	protected void initDependentServletContextNames() throws IOException {
		if (!DependencyManagementThreadLocal.isEnabled() || isWAB()) {
			return;
		}

		List levelsRequiredDeploymentContexts =
			DeployManagerUtil.getLevelsRequiredDeploymentContexts();

		for (String[] levelRequiredDeploymentContexts :
				levelsRequiredDeploymentContexts) {

			if (ArrayUtil.contains(
					levelRequiredDeploymentContexts,
					_servletContext.getServletContextName())) {

				break;
			}

			for (String levelRequiredDeploymentContext :
					levelRequiredDeploymentContexts) {

				_dependentServletContextNames.add(
					levelRequiredDeploymentContext);
			}
		}

		InputStream inputStream = _servletContext.getResourceAsStream(
			"/WEB-INF/liferay-plugin-package.properties");

		if (inputStream != null) {
			String propertiesString = StringUtil.read(inputStream);

			Properties properties = PropertiesUtil.load(propertiesString);

			String[] pluginPackgeRequiredDeploymentContexts = StringUtil.split(
				properties.getProperty("required-deployment-contexts"));

			for (String pluginPackageRequiredDeploymentContext :
					pluginPackgeRequiredDeploymentContexts) {

				_dependentServletContextNames.add(
					pluginPackageRequiredDeploymentContext.trim());
			}
		}

		if (!_dependentServletContextNames.isEmpty() && _log.isInfoEnabled()) {
			String servletContextName = _servletContext.getServletContextName();

			_log.info(
				StringBundler.concat(
					"Plugin ", servletContextName, " requires ",
					StringUtil.merge(_dependentServletContextNames, ", ")));
		}
	}

	protected boolean isWAB() {

		// Never enable plugin dependency management when the servlet context is
		// from a Liferay WAB since dependency is handled by the OSGi runtime

		Object osgiBundleContext = _servletContext.getAttribute(
			"osgi-bundlecontext");
		Object osgiRuntimeVendor = _servletContext.getAttribute(
			"osgi-runtime-vendor");

		if ((osgiBundleContext != null) && (osgiRuntimeVendor != null) &&
			osgiRuntimeVendor.equals(ReleaseInfo.getVendor())) {

			return true;
		}

		return false;
	}

	private static final Log _log = LogFactoryUtil.getLog(HotDeployEvent.class);

	private final ClassLoader _contextClassLoader;
	private final Set _dependentServletContextNames = new TreeSet<>();
	private PluginPackage _pluginPackage;
	private final Queue _portalLifecycles =
		new ConcurrentLinkedQueue<>();
	private final ServletContext _servletContext;

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy