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

com.liferay.gradle.plugins.JspCDefaultsPlugin 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.BundleExtension;
import com.liferay.gradle.plugins.internal.util.FileUtil;
import com.liferay.gradle.plugins.internal.util.GradleUtil;
import com.liferay.gradle.plugins.jasper.jspc.CompileJSPTask;
import com.liferay.gradle.plugins.jasper.jspc.JspCPlugin;
import com.liferay.gradle.plugins.util.BndUtil;

import java.io.File;

import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.Callable;

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.DuplicatesStrategy;
import org.gradle.api.file.FileTree;
import org.gradle.api.file.SourceDirectorySet;
import org.gradle.api.plugins.Convention;
import org.gradle.api.plugins.ExtensionContainer;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.Copy;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
import org.gradle.api.tasks.SourceSetOutput;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.bundling.Jar;
import org.gradle.api.tasks.compile.JavaCompile;
import org.gradle.api.tasks.util.PatternFilterable;

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

	public static final String COMPILE_JSP_INCLUDE_PROPERTY_NAME =
		"compile.jsp.include";

	public static final Plugin INSTANCE = new JspCDefaultsPlugin();

	@Override
	protected void applyPluginDefaults(Project project, JspCPlugin jspCPlugin) {

		// Extensions

		ExtensionContainer extensionContainer = project.getExtensions();

		final BundleExtension bundleExtension = BndUtil.getBundleExtension(
			extensionContainer);

		// Conventions

		Convention convention = project.getConvention();

		JavaPluginConvention javaPluginConvention = convention.getPlugin(
			JavaPluginConvention.class);

		SourceSetContainer javaSourceSetContainer =
			javaPluginConvention.getSourceSets();

		SourceSet javaMainSourceSet = javaSourceSetContainer.getByName(
			SourceSet.MAIN_SOURCE_SET_NAME);

		// Tasks

		final TaskProvider compileJSPTaskProvider =
			GradleUtil.getTaskProvider(
				project, JspCPlugin.COMPILE_JSP_TASK_NAME, JavaCompile.class);
		final TaskProvider generateJSPJavaTaskProvider =
			GradleUtil.getTaskProvider(
				project, JspCPlugin.GENERATE_JSP_JAVA_TASK_NAME,
				CompileJSPTask.class);
		TaskProvider jarTaskProvider = GradleUtil.getTaskProvider(
			project, JavaPlugin.JAR_TASK_NAME, Jar.class);
		TaskProvider processResourcesTaskProvider =
			GradleUtil.getTaskProvider(
				project, JavaPlugin.PROCESS_RESOURCES_TASK_NAME, Copy.class);

		_configureTaskGenerateJSPJavaProvider(
			javaMainSourceSet, generateJSPJavaTaskProvider,
			processResourcesTaskProvider);
		_configureTaskJarProvider(
			project, compileJSPTaskProvider, jarTaskProvider);
		_configureTaskProcessResourcesProvider(
			javaMainSourceSet, processResourcesTaskProvider);

		// Other

		project.afterEvaluate(
			new Action() {

				@Override
				public void execute(Project project) {
					_configureExtensionBundleAfterEvaluate(
						bundleExtension, compileJSPTaskProvider,
						generateJSPJavaTaskProvider);
				}

			});
	}

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

	private JspCDefaultsPlugin() {
	}

	private void _configureExtensionBundleAfterEvaluate(
		BundleExtension bundleExtension,
		TaskProvider compileJSPTaskProvider,
		TaskProvider generateJSPJavaTaskProvider) {

		StringBuilder sb = new StringBuilder();

		JavaCompile compileJSPJavaCompile = compileJSPTaskProvider.get();

		DirectoryProperty directoryProperty =
			compileJSPJavaCompile.getDestinationDirectory();

		Provider provider = directoryProperty.getAsFile();

		File file = provider.getOrNull();

		if (file != null) {
			sb.append(FileUtil.getAbsolutePath(file));
			sb.append(',');
		}

		CompileJSPTask generateJSPJavaCompileJSPTask =
			generateJSPJavaTaskProvider.get();

		sb.append(
			FileUtil.getAbsolutePath(
				generateJSPJavaCompileJSPTask.getDestinationDir()));

		bundleExtension.instruction("-add-resource", sb.toString());
	}

	private void _configureTaskGenerateJSPJavaProvider(
		final SourceSet javaMainSourceSet,
		TaskProvider generateJSPJavaTaskProvider,
		final TaskProvider processResourcesTaskProvider) {

		generateJSPJavaTaskProvider.configure(
			new Action() {

				@Override
				public void execute(
					CompileJSPTask generateJSPJavaCompileJSPTask) {

					generateJSPJavaCompileJSPTask.dependsOn(
						processResourcesTaskProvider);

					generateJSPJavaCompileJSPTask.setWebAppDir(
						new Callable() {

							@Override
							public File call() throws Exception {
								SourceSetOutput sourceSetOutput =
									javaMainSourceSet.getOutput();

								return new File(
									sourceSetOutput.getResourcesDir(),
									"META-INF/resources");
							}

						});
				}

			});
	}

	private void _configureTaskJarProvider(
		final Project project,
		final TaskProvider compileJSPTaskProvider,
		TaskProvider jarTaskProvider) {

		jarTaskProvider.configure(
			new Action() {

				@Override
				public void execute(Jar jar) {
					boolean compileJspInclude = GradleUtil.getProperty(
						project, COMPILE_JSP_INCLUDE_PROPERTY_NAME, false);

					if (compileJspInclude) {
						jar.dependsOn(compileJSPTaskProvider);
					}
				}

			});
	}

	private void _configureTaskProcessResourcesProvider(
		final SourceSet javaMainSourceSet,
		TaskProvider processResourcesTaskProvider) {

		processResourcesTaskProvider.configure(
			new Action() {

				@Override
				public void execute(Copy processResourcesCopy) {
					processResourcesCopy.setDuplicatesStrategy(
						DuplicatesStrategy.INCLUDE);

					SourceDirectorySet sourceDirectorySet =
						javaMainSourceSet.getResources();

					FileTree fileTree = sourceDirectorySet.getAsFileTree();

					fileTree = fileTree.matching(
						new Action() {

							@Override
							public void execute(
								PatternFilterable patternFilterable) {

								patternFilterable.include("**/*.tld");
							}

						});

					processResourcesCopy.from(
						fileTree.getFiles(),
						new Action() {

							@Override
							public void execute(CopySpec copySpec) {
								copySpec.into("META-INF/resources/WEB-INF");
							}

						});

					Set srcDirs = sourceDirectorySet.getSrcDirs();

					Iterator iterator = srcDirs.iterator();

					if (iterator.hasNext()) {
						File tagsDir = new File(
							iterator.next(), "META-INF/tags");

						if (tagsDir.exists()) {
							processResourcesCopy.from(
								tagsDir,
								new Action() {

									@Override
									public void execute(CopySpec copySpec) {
										copySpec.into(
											"META-INF/resources/META-INF/tags");
									}

								});
						}
					}
				}

			});
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy