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

com.liferay.gradle.plugins.rest.builder.RESTBuilderPlugin Maven / Gradle / Ivy

Go to download

The REST Builder Gradle plugin lets you generate a Liferay REST service layer defined in a rest.yaml file.

The newest version!
/**
 * 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.rest.builder;

import com.liferay.gradle.plugins.rest.builder.internal.util.GradleUtil;
import com.liferay.gradle.util.FileUtil;
import com.liferay.gradle.util.Validator;

import java.io.File;
import java.io.IOException;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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.DependencySet;
import org.gradle.api.internal.GradleInternal;
import org.gradle.api.internal.project.ProjectInternal;
import org.gradle.api.logging.Logger;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaLibraryPlugin;
import org.gradle.api.plugins.PluginContainer;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.execution.ProjectConfigurer;
import org.gradle.internal.service.ServiceRegistry;

/**
 * @author Peter Shin
 */
public class RESTBuilderPlugin implements Plugin {

	public static final String BUILD_REST_TASK_NAME = "buildREST";

	public static final String CONFIGURATION_NAME = "restBuilder";

	@Override
	public void apply(Project project) {
		GradleUtil.applyPlugin(project, JavaLibraryPlugin.class);

		Configuration restBuilderConfiguration = _addConfigurationRESTBuilder(
			project);

		final BuildRESTTask buildRESTTask = _addTaskBuildREST(project);

		_configureTasksBuildREST(project, restBuilderConfiguration);

		project.afterEvaluate(
			new Action() {

				@Override
				public void execute(Project project) {
					_configureTaskBuildREST(buildRESTTask);
				}

			});
	}

	private Configuration _addConfigurationRESTBuilder(final Project project) {
		Configuration configuration = GradleUtil.addConfiguration(
			project, CONFIGURATION_NAME);

		configuration.defaultDependencies(
			new Action() {

				@Override
				public void execute(DependencySet dependencySet) {
					_addDependenciesRESTBuilder(project);
				}

			});

		configuration.setDescription(
			"Configures Liferay REST Builder for this project.");
		configuration.setVisible(false);

		return configuration;
	}

	private void _addDependenciesRESTBuilder(Project project) {
		GradleUtil.addDependency(
			project, CONFIGURATION_NAME, "com.liferay",
			"com.liferay.portal.tools.rest.builder", "latest.release");
	}

	private BuildRESTTask _addTaskBuildREST(Project project) {
		BuildRESTTask buildRESTTask = GradleUtil.addTask(
			project, BUILD_REST_TASK_NAME, BuildRESTTask.class);

		buildRESTTask.setDescription("Runs Liferay REST Builder.");
		buildRESTTask.setGroup(BasePlugin.BUILD_GROUP);
		buildRESTTask.setRESTConfigDir(project.getProjectDir());

		return buildRESTTask;
	}

	@SuppressWarnings("rawtypes")
	private void _configureTaskBuildREST(final BuildRESTTask buildRESTTask) {
		Project project = buildRESTTask.getProject();

		PluginContainer pluginContainer = project.getPlugins();

		pluginContainer.withId(
			"com.liferay.defaults.plugin",
			new Action() {

				@Override
				public void execute(Plugin plugin) {
					_configureTaskBuildRESTForLiferayDefaultsPlugin(
						buildRESTTask);
				}

			});
	}

	private void _configureTaskBuildRESTClasspath(
		BuildRESTTask buildRESTTask, Configuration restBuilderConfiguration) {

		buildRESTTask.setClasspath(restBuilderConfiguration);
	}

	private void _configureTaskBuildRESTForLiferayDefaultsPlugin(
		BuildRESTTask buildRESTTask) {

		File restConfigDir = buildRESTTask.getRESTConfigDir();

		if ((restConfigDir == null) || !restConfigDir.exists()) {
			return;
		}

		File restConfigYAMLFile = new File(restConfigDir, "rest-config.yaml");

		if (!restConfigYAMLFile.exists()) {
			return;
		}

		Project project = buildRESTTask.getProject();

		String content = null;

		try {
			content = new String(
				Files.readAllBytes(restConfigYAMLFile.toPath()),
				StandardCharsets.UTF_8);
		}
		catch (IOException ioException) {
			Logger logger = project.getLogger();

			if (logger.isWarnEnabled()) {
				logger.warn("Unable to read {}", restConfigYAMLFile);
			}
		}

		if (Validator.isNull(content)) {
			return;
		}

		Matcher matcher = _apiDirPattern.matcher(content);

		if (!matcher.find()) {
			return;
		}

		File apiProjectDir = GradleUtil.getRootDir(
			project.file(matcher.group(1)), "bnd.bnd");

		if (apiProjectDir == null) {
			return;
		}

		Project rootProject = project.getRootProject();

		String relativePath = FileUtil.relativize(
			apiProjectDir, rootProject.getProjectDir());

		relativePath = relativePath.replace(File.separatorChar, '/');

		String apiProjectPath = ':' + relativePath.replace('/', ':');

		Project apiProject = rootProject.findProject(apiProjectPath);

		if (apiProject == null) {
			String apiProjectName = apiProjectDir.getName();

			apiProject = GradleUtil.findProject(rootProject, apiProjectName);
		}

		if (apiProject == null) {
			return;
		}

		GradleInternal gradleInternal = (GradleInternal)project.getGradle();

		ServiceRegistry serviceRegistry = gradleInternal.getServices();

		ProjectConfigurer projectConfigurer = serviceRegistry.get(
			ProjectConfigurer.class);

		projectConfigurer.configure((ProjectInternal)apiProject);

		TaskContainer taskContainer = apiProject.getTasks();

		Task task = taskContainer.findByName("baseline");

		if (task != null) {
			task.setProperty("ignoreFailures", Boolean.TRUE);

			buildRESTTask.finalizedBy(task);
		}
	}

	private void _configureTasksBuildREST(
		Project project, final Configuration restBuilderConfiguration) {

		TaskContainer taskContainer = project.getTasks();

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

				@Override
				public void execute(BuildRESTTask buildRESTTask) {
					_configureTaskBuildRESTClasspath(
						buildRESTTask, restBuilderConfiguration);
				}

			});
	}

	private static final Pattern _apiDirPattern = Pattern.compile(
		"^apiDir:\\s*\"(.+)\"", Pattern.MULTILINE);

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy