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

com.liferay.gradle.plugins.LiferayBasePlugin Maven / Gradle / Ivy

/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.gradle.plugins;

import com.liferay.gradle.plugins.extensions.AppServer;
import com.liferay.gradle.plugins.extensions.LiferayExtension;
import com.liferay.gradle.plugins.internal.LangBuilderDefaultsPlugin;
import com.liferay.gradle.plugins.internal.util.FileUtil;
import com.liferay.gradle.plugins.internal.util.GradleUtil;
import com.liferay.gradle.plugins.task.DirectDeployTask;
import com.liferay.gradle.plugins.task.DockerCopyTask;
import com.liferay.gradle.plugins.util.PortalTools;
import com.liferay.gradle.util.Validator;

import java.io.File;

import java.net.URL;

import java.util.concurrent.Callable;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.DependencyResolveDetails;
import org.gradle.api.artifacts.DependencySet;
import org.gradle.api.artifacts.ModuleVersionSelector;
import org.gradle.api.artifacts.ResolutionStrategy;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.FileTree;
import org.gradle.api.logging.Logger;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.tasks.Copy;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskProvider;

/**
 * @author Andrea Di Giorgi
 */
public class LiferayBasePlugin implements Plugin {

	public static final String DEPLOY_TASK_NAME = "deploy";

	public static final String DOCKER_COPY_TASK_NAME = "dockerCopy";

	public static final String PORTAL_CONFIGURATION_NAME = "portal";

	@Override
	public void apply(Project project) {

		// Plugins

		GradleUtil.applyPlugin(project, NodeDefaultsPlugin.class);

		LangBuilderDefaultsPlugin.INSTANCE.apply(project);
		SourceFormatterDefaultsPlugin.INSTANCE.apply(project);

		// Extensions

		ExtensionContainer extensionContainer = project.getExtensions();

		final LiferayExtension liferayExtension = extensionContainer.create(
			LiferayPlugin.PLUGIN_NAME, LiferayExtension.class, project);

		// Configurations

		ConfigurationContainer configurationContainer =
			project.getConfigurations();

		Configuration portalConfiguration = configurationContainer.create(
			PORTAL_CONFIGURATION_NAME);

		_configureConfigurationPortal(
			project, liferayExtension, portalConfiguration);

		// Tasks

		TaskProvider deployTaskProvider = GradleUtil.addTaskProvider(
			project, DEPLOY_TASK_NAME, Copy.class);

		_configureTaskDeployProvider(
			project, liferayExtension, deployTaskProvider);

		String dockerContainerId = GradleUtil.getTaskPrefixedProperty(
			project.getPath(), deployTaskProvider.getName(),
			"docker.container.id");
		String dockerFilesDir = GradleUtil.getTaskPrefixedProperty(
			project.getPath(), deployTaskProvider.getName(),
			"docker.files.dir");

		if (Validator.isNotNull(dockerContainerId)) {
			TaskProvider dockerCopyTaskProvider =
				GradleUtil.addTaskProvider(
					project, DOCKER_COPY_TASK_NAME, DockerCopyTask.class);

			_configureTaskDeployProvider(
				liferayExtension, deployTaskProvider, dockerCopyTaskProvider,
				dockerContainerId, dockerFilesDir);
		}

		// Containers

		TaskContainer taskContainer = project.getTasks();

		taskContainer.withType(
			DirectDeployTask.class,
			new Action() {

				@Override
				public void execute(DirectDeployTask directDeployTask) {
					_configureTaskDirectDeploy(
						directDeployTask, liferayExtension);
				}

			});

		// Other

		GradleUtil.applyScript(
			project, _getScriptLiferayExtension(project), project);

		configurationContainer.all(
			new Action() {

				@Override
				public void execute(Configuration configuration) {
					ResolutionStrategy resolutionStrategy =
						configuration.getResolutionStrategy();

					resolutionStrategy.eachDependency(
						new Action() {

							@Override
							public void execute(
								DependencyResolveDetails
									dependencyResolveDetails) {

								ModuleVersionSelector moduleVersionSelector =
									dependencyResolveDetails.getRequested();

								String version =
									moduleVersionSelector.getVersion();

								if (version.equals("default")) {
									dependencyResolveDetails.useVersion(
										liferayExtension.getDefaultVersion(
											moduleVersionSelector));
								}
							}

						});
				}

			});
	}

	private void _configureConfigurationPortal(
		final Project project, final LiferayExtension liferayExtension,
		Configuration portalConfiguration) {

		portalConfiguration.setDescription(
			"Configures the classpath from the local Liferay bundle.");
		portalConfiguration.setVisible(false);

		portalConfiguration.defaultDependencies(
			new Action() {

				@Override
				public void execute(DependencySet dependencySet) {
					File appServerClassesPortalDir = new File(
						liferayExtension.getAppServerPortalDir(),
						"WEB-INF/classes");

					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME,
						appServerClassesPortalDir);

					File appServerLibPortalDir = new File(
						liferayExtension.getAppServerPortalDir(),
						"WEB-INF/lib");

					FileTree appServerLibPortalDirJarFiles =
						FileUtil.getJarsFileTree(
							project, appServerLibPortalDir);

					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME,
						appServerLibPortalDirJarFiles);

					File appServerShieldedContainerLibPortalDir = new File(
						liferayExtension.getAppServerPortalDir(),
						"WEB-INF/shielded-container-lib");

					FileTree appServerShieldedContainerLibPortalDirJarFiles =
						FileUtil.getJarsFileTree(
							project, appServerShieldedContainerLibPortalDir);

					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME,
						appServerShieldedContainerLibPortalDirJarFiles);

					FileTree appServerLibGlobalDirJarFiles =
						FileUtil.getJarsFileTree(
							project,
							liferayExtension.getAppServerLibGlobalDir(),
							"mail.jar");

					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME,
						appServerLibGlobalDirJarFiles);

					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME, "com.liferay",
						"net.sf.jargs", "1.0");
					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME,
						"com.thoughtworks.qdox", "qdox", "1.12.1");
					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME, "javax.activation",
						"activation", "1.1");
					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME, "javax.servlet",
						"javax.servlet-api", "3.0.1");
					GradleUtil.addDependency(
						project, PORTAL_CONFIGURATION_NAME, "javax.servlet.jsp",
						"javax.servlet.jsp-api", "2.3.1");

					AppServer appServer = liferayExtension.getAppServer();

					appServer.addAdditionalDependencies(
						PORTAL_CONFIGURATION_NAME);
				}

			});
	}

	private void _configureTaskDeployProvider(
		final LiferayExtension liferayExtension,
		final TaskProvider deployTaskProvider,
		final TaskProvider dockerCopyTaskProvider,
		final String dockerContainerId, final String dockerFilesDir) {

		deployTaskProvider.configure(
			new Action() {

				@Override
				public void execute(Copy deployCopy) {
					if (dockerContainerId != null) {
						deployCopy.finalizedBy(dockerCopyTaskProvider);

						deployCopy.setEnabled(false);
					}
					else if (dockerFilesDir != null) {
						deployCopy.into(
							new Callable() {

								@Override
								public File call() throws Exception {
									String relativePath = FileUtil.relativize(
										liferayExtension.getDeployDir(),
										liferayExtension.getLiferayHome());

									return new File(
										dockerFilesDir, relativePath);
								}

							});
					}
				}

			});

		dockerCopyTaskProvider.configure(
			new Action() {

				@Override
				public void execute(DockerCopyTask dockerCopyTask) {
					dockerCopyTask.dependsOn(deployTaskProvider);

					dockerCopyTask.setContainerId(dockerContainerId);

					dockerCopyTask.setDeployDir(
						new Callable() {

							@Override
							public String call() throws Exception {
								StringBuilder sb = new StringBuilder();

								sb.append(dockerCopyTask.getLiferayHome());
								sb.append('/');

								String relativePath = FileUtil.relativize(
									liferayExtension.getDeployDir(),
									liferayExtension.getLiferayHome());

								sb.append(relativePath);

								String deployDir = sb.toString();

								return deployDir.replace('\\', '/');
							}

						});

					dockerCopyTask.setDescription(
						"Deploys the project to the Docker container.");
					dockerCopyTask.setGroup(BasePlugin.BUILD_GROUP);

					dockerCopyTask.setSourceFile(
						new Callable() {

							@Override
							public File call() throws Exception {
								Copy deployCopy = deployTaskProvider.get();

								FileCollection fileCollection =
									deployCopy.getSource();

								return fileCollection.getSingleFile();
							}

						});
				}

			});
	}

	private void _configureTaskDeployProvider(
		final Project project, final LiferayExtension liferayExtension,
		TaskProvider deployTaskProvider) {

		deployTaskProvider.configure(
			new Action() {

				@Override
				public void execute(Copy deployCopy) {
					deployCopy.doLast(
						new Action() {

							@Override
							public void execute(Task task) {
								Logger logger = task.getLogger();

								if (logger.isLifecycleEnabled()) {
									Copy copy = (Copy)task;

									logger.lifecycle(
										"Files of {} deployed to {}", project,
										copy.getDestinationDir());
								}
							}

						});

					deployCopy.into(
						new Callable() {

							@Override
							public File call() throws Exception {
								return liferayExtension.getDeployDir();
							}

						});

					deployCopy.setDescription(
						"Assembles the project and deploys it to Liferay.");
					deployCopy.setGroup(BasePlugin.BUILD_GROUP);
				}

			});
	}

	private void _configureTaskDirectDeploy(
		DirectDeployTask directDeployTask,
		final LiferayExtension liferayExtension) {

		directDeployTask.setAppServerDir(
			new Callable() {

				@Override
				public File call() throws Exception {
					return liferayExtension.getAppServerDir();
				}

			});

		directDeployTask.setAppServerLibGlobalDir(
			new Callable() {

				@Override
				public File call() throws Exception {
					return liferayExtension.getAppServerLibGlobalDir();
				}

			});

		directDeployTask.setAppServerPortalDir(
			new Callable() {

				@Override
				public File call() throws Exception {
					return liferayExtension.getAppServerPortalDir();
				}

			});

		directDeployTask.setAppServerType(
			new Callable() {

				@Override
				public String call() throws Exception {
					return liferayExtension.getAppServerType();
				}

			});
	}

	private String _getScriptLiferayExtension(Project project) {
		StringBuilder sb = new StringBuilder();

		sb.append("com/liferay/gradle/plugins/dependencies/config-liferay");

		String portalVersion = PortalTools.getPortalVersion(project);

		if (Validator.isNotNull(portalVersion)) {
			sb.append('-');
			sb.append(portalVersion);
		}

		sb.append(".gradle");

		ClassLoader classLoader = LiferayBasePlugin.class.getClassLoader();

		URL url = classLoader.getResource(sb.toString());

		if (url != null) {
			return sb.toString();
		}

		return "com/liferay/gradle/plugins/dependencies/config-liferay.gradle";
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy