/**
* 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.gradle.plugins.defaults.internal;
import com.liferay.gradle.plugins.cache.CachePlugin;
import com.liferay.gradle.plugins.defaults.internal.util.GradleUtil;
import com.liferay.gradle.plugins.node.tasks.DownloadNodeTask;
import com.liferay.gradle.plugins.node.tasks.ExecuteNodeTask;
import com.liferay.gradle.plugins.node.tasks.ExecuteNpmTask;
import com.liferay.gradle.plugins.node.tasks.NpmInstallTask;
import com.liferay.gradle.plugins.test.integration.TestIntegrationBasePlugin;
import com.liferay.gradle.plugins.test.integration.TestIntegrationPlugin;
import com.liferay.gradle.util.Validator;
import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.gradle.api.Action;
import org.gradle.api.GradleException;
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.artifacts.ProjectDependency;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskContainer;
/**
* @author Andrea Di Giorgi
*/
public class LiferayCIPlugin implements Plugin<Project> {
public static final Plugin<Project> INSTANCE = new LiferayCIPlugin();
@Override
public void apply(final Project project) {
_configureTasksDownloadNode(project);
_configureTasksExecuteNode(project);
_configureTasksExecuteNpm(project);
_configureTasksNpmInstall(project);
GradleUtil.withPlugin(
project, TestIntegrationPlugin.class,
new Action<TestIntegrationPlugin>() {
@Override
public void execute(
TestIntegrationPlugin testIntegrationPlugin) {
_configureTaskTestIntegration(project);
}
});
project.afterEvaluate(
new Action<Project>() {
@Override
public void execute(Project project) {
_configureTasksNpmInstallArgs(project);
}
});
}
private LiferayCIPlugin() {
}
private void _configureTaskDownloadNode(DownloadNodeTask downloadNodeTask) {
downloadNodeTask.doFirst(
new Action<Task>() {
@Override
public void execute(Task task) {
if (GradleUtil.hasPlugin(
task.getProject(), CachePlugin.class)) {
throw new GradleException(
"Unable to use Node.js on CI, please configure " +
"com.liferay.cache or update the cache");
}
}
});
}
private void _configureTaskExecuteNode(ExecuteNodeTask executeNodeTask) {
executeNodeTask.setNpmInstallRetries(_NPM_INSTALL_RETRIES);
}
private void _configureTaskExecuteNodeArgs(
ExecuteNodeTask executeNodeTask, Map<String, String> newArgs) {
List<Object> args = executeNodeTask.getArgs();
for (Map.Entry<String, String> entry : newArgs.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
boolean changed = false;
for (int i = 0; i < args.size(); i++) {
String arg = GradleUtil.toString(args.get(i));
if (arg.startsWith(key)) {
changed = true;
args.set(i, key + value);
break;
}
}
if (!changed) {
args.add(key + value);
}
}
executeNodeTask.setArgs(args);
}
private void _configureTaskExecuteNpm(
ExecuteNpmTask executeNpmTask, String registry) {
executeNpmTask.setRegistry(registry);
}
private void _configureTaskNpmInstall(NpmInstallTask npmInstallTask) {
npmInstallTask.setNodeModulesCacheDir(_NODE_MODULES_CACHE_DIR);
npmInstallTask.setRemoveShrinkwrappedUrls(Boolean.TRUE);
}
private void _configureTasksDownloadNode(Project project) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
DownloadNodeTask.class,
new Action<DownloadNodeTask>() {
@Override
public void execute(DownloadNodeTask downloadNodeTask) {
_configureTaskDownloadNode(downloadNodeTask);
}
});
}
private void _configureTasksExecuteNode(Project project) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
ExecuteNodeTask.class,
new Action<ExecuteNodeTask>() {
@Override
public void execute(ExecuteNodeTask executeNodeTask) {
_configureTaskExecuteNode(executeNodeTask);
}
});
}
private void _configureTasksExecuteNpm(Project project) {
final String ciRegistry = GradleUtil.getProperty(
project, "nodejs.npm.ci.registry", (String)null);
if (Validator.isNull(ciRegistry)) {
return;
}
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
ExecuteNpmTask.class,
new Action<ExecuteNpmTask>() {
@Override
public void execute(ExecuteNpmTask executeNpmTask) {
_configureTaskExecuteNpm(executeNpmTask, ciRegistry);
}
});
}
private void _configureTasksNpmInstall(Project project) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
NpmInstallTask.class,
new Action<NpmInstallTask>() {
@Override
public void execute(NpmInstallTask npmInstallTask) {
_configureTaskNpmInstall(npmInstallTask);
}
});
}
private void _configureTasksNpmInstallArgs(Project project) {
final String ciSassBinarySite = GradleUtil.getProperty(
project, "nodejs.npm.ci.sass.binary.site", (String)null);
if (Validator.isNull(ciSassBinarySite)) {
return;
}
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
NpmInstallTask.class,
new Action<NpmInstallTask>() {
@Override
public void execute(NpmInstallTask npmInstallTask) {
_configureTaskExecuteNodeArgs(
npmInstallTask,
Collections.singletonMap(
_SASS_BINARY_SITE_ARG, ciSassBinarySite));
}
});
}
private void _configureTaskTestIntegration(Project project) {
Task testIntegrationTask = GradleUtil.getTask(
project, TestIntegrationBasePlugin.TEST_INTEGRATION_TASK_NAME);
Action<Task> action = new Action<Task>() {
@Override
public void execute(Task task) {
Project project = task.getProject();
SourceSet sourceSet = GradleUtil.getSourceSet(
project,
TestIntegrationBasePlugin.TEST_INTEGRATION_SOURCE_SET_NAME);
Configuration configuration = GradleUtil.getConfiguration(
project, sourceSet.getCompileConfigurationName());
DependencySet dependencySet = configuration.getDependencies();
for (ProjectDependency projectDependency :
dependencySet.withType(ProjectDependency.class)) {
Project dependencyProject =
projectDependency.getDependencyProject();
File file = dependencyProject.file(".lfrbuild-portal");
if (!file.exists()) {
throw new GradleException(
"Please create marker file " + file);
}
}
}
};
testIntegrationTask.doFirst(action);
}
private static final File _NODE_MODULES_CACHE_DIR = new File(
System.getProperty("user.home"), ".liferay/node-modules-cache");
private static final int _NPM_INSTALL_RETRIES = 3;
private static final String _SASS_BINARY_SITE_ARG = "--sass-binary-site=";
}