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

com.liferay.gradle.plugins.EclipseDefaultsPlugin 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.internal.util.GradleUtil;
import com.liferay.gradle.util.Validator;

import groovy.lang.Closure;

import groovy.util.Node;

import java.io.File;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.XmlProvider;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.PluginContainer;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.plugins.ide.api.FileContentMerger;
import org.gradle.plugins.ide.api.XmlFileContentMerger;
import org.gradle.plugins.ide.eclipse.EclipsePlugin;
import org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry;
import org.gradle.plugins.ide.eclipse.model.Classpath;
import org.gradle.plugins.ide.eclipse.model.ClasspathEntry;
import org.gradle.plugins.ide.eclipse.model.EclipseClasspath;
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
import org.gradle.plugins.ide.eclipse.model.EclipseProject;

/**
 * @author Andrea Di Giorgi
 */
public class EclipseDefaultsPlugin extends BaseDefaultsPlugin {

	public static final Plugin INSTANCE = new EclipseDefaultsPlugin();

	@Override
	protected void applyPluginDefaults(
		Project project, EclipsePlugin eclipsePlugin) {

		// Extensions

		ExtensionContainer extensionContainer = project.getExtensions();

		final EclipseModel eclipseModelExtension = extensionContainer.getByType(
			EclipseModel.class);

		// Tasks

		TaskProvider eclipseTaskProvider = GradleUtil.getTaskProvider(
			project, _ECLIPSE_TASK_NAME);

		_configureTaskEclipseProvider(eclipseTaskProvider);

		// Containers

		PluginContainer pluginContainer = project.getPlugins();

		pluginContainer.configureEach(
			new Action() {

				@Override
				public void execute(Plugin plugin) {
					if (plugin instanceof JavaPlugin) {
						_configurePluginJava(project, eclipseModelExtension);
					}
				}

			});

		// Other

		File portalRootDir = GradleUtil.getRootDir(
			project.getRootProject(), "portal-impl");

		_configureEclipseClasspath(project, eclipseModelExtension);
		_configureEclipseProject(
			project, eclipseModelExtension, eclipseTaskProvider, portalRootDir);
	}

	@Override
	protected Class getPluginClass() {
		return EclipsePlugin.class;
	}

	private EclipseDefaultsPlugin() {
	}

	private void _configureEclipseClasspath(
		Project project, EclipseModel eclipseModelExtension) {

		EclipseClasspath eclipseClasspath =
			eclipseModelExtension.getClasspath();

		FileContentMerger fileContentMerger = eclipseClasspath.getFile();

		@SuppressWarnings("serial")
		Closure closure = new Closure(project) {

			@SuppressWarnings("unused")
			public void doCall(Classpath classpath) {
				List classpathEntries = classpath.getEntries();

				Iterator iterator = classpathEntries.iterator();

				while (iterator.hasNext()) {
					ClasspathEntry classpathEntry = iterator.next();

					if (!(classpathEntry instanceof AbstractClasspathEntry)) {
						continue;
					}

					AbstractClasspathEntry abstractClasspathEntry =
						(AbstractClasspathEntry)classpathEntry;

					String kind = abstractClasspathEntry.getKind();
					String path = abstractClasspathEntry.getPath();

					if (kind.equals("lib") && path.endsWith(".pom")) {
						iterator.remove();
					}
				}
			}

		};

		fileContentMerger.whenMerged(closure);
	}

	private void _configureEclipseProject(
		Project project, EclipseModel eclipseModelExtension,
		TaskProvider eclipseTaskProvider, File portalRootDir) {

		EclipseProject eclipseProject = eclipseModelExtension.getProject();

		String eclipseProjectName = project.getName();

		String gitWorkingBranch = GradleUtil.getTaskPrefixedProperty(
			project.getPath(), eclipseTaskProvider.getName(),
			"git.working.branch");

		if (Boolean.parseBoolean(gitWorkingBranch) && (portalRootDir != null) &&
			portalRootDir.exists()) {

			String gitWorkingBranchName = GradleUtil.getProperty(
				project, "git.working.branch.name", (String)null);

			if (Validator.isNotNull(gitWorkingBranchName)) {
				eclipseProjectName =
					eclipseProjectName + '-' + gitWorkingBranchName;
			}
		}

		eclipseProject.setName(eclipseProjectName);

		List natures = eclipseProject.getNatures();

		natures.add("com.liferay.ide.core.liferayNature");

		Action action = new Action() {

			@Override
			public void execute(XmlProvider xmlProvider) {
				Node projectDescriptionNode = xmlProvider.asNode();

				Node filteredResourcesNode = projectDescriptionNode.appendNode(
					"filteredResources");

				Node filterNode = filteredResourcesNode.appendNode("filter");

				filterNode.appendNode("id", System.currentTimeMillis());
				filterNode.appendNode("name");
				filterNode.appendNode("type", "26");

				Node matcherNode = filterNode.appendNode("matcher");

				matcherNode.appendNode(
					"id", "org.eclipse.ui.ide.orFilterMatcher");

				Node argumentsNode = matcherNode.appendNode("arguments");

				for (String filteredDirName : _FILTERED_DIR_NAMES) {
					Node curMatcherNode = argumentsNode.appendNode("matcher");

					curMatcherNode.appendNode(
						"arguments",
						"1.0-name-matches-false-false-" + filteredDirName);
					curMatcherNode.appendNode(
						"id", "org.eclipse.ui.ide.multiFilter");
				}
			}

		};

		XmlFileContentMerger xmlFileContentMerger = eclipseProject.getFile();

		xmlFileContentMerger.withXml(action);
	}

	private void _configurePluginJava(
		Project project, EclipseModel eclipseModelExtension) {

		// Configurations

		ConfigurationContainer configurationContainer =
			project.getConfigurations();

		Configuration compileOnlyConfiguration =
			configurationContainer.getByName(
				JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME);

		compileOnlyConfiguration.setCanBeResolved(true);

		// Other

		EclipseClasspath eclipseClasspath =
			eclipseModelExtension.getClasspath();

		Collection configurations =
			eclipseClasspath.getPlusConfigurations();

		configurations.add(compileOnlyConfiguration);
	}

	private void _configureTaskEclipseProvider(
		TaskProvider eclipseTaskProvider) {

		eclipseTaskProvider.configure(
			new Action() {

				@Override
				public void execute(Task eclipseTask) {
					eclipseTask.dependsOn(_CLEAN_ECLIPSE_TASK_NAME);
				}

			});
	}

	private static final String _CLEAN_ECLIPSE_TASK_NAME = "cleanEclipse";

	private static final String _ECLIPSE_TASK_NAME = "eclipse";

	private static final String[] _FILTERED_DIR_NAMES = {
		".git", ".gradle", "build", "node_modules", "node_modules_cache", "tmp"
	};

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy