/**
* 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.workspace.configurators;
import com.liferay.gradle.plugins.workspace.ProjectConfigurator;
import com.liferay.gradle.plugins.workspace.WorkspaceExtension;
import com.liferay.gradle.plugins.workspace.WorkspacePlugin;
import com.liferay.gradle.plugins.workspace.internal.util.FileUtil;
import com.liferay.gradle.plugins.workspace.internal.util.GradleUtil;
import com.liferay.gradle.plugins.workspace.tasks.UpdatePropertiesTask;
import com.liferay.gradle.util.StringUtil;
import com.liferay.gradle.util.copy.StripPathSegmentsAction;
import groovy.lang.Closure;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import org.gradle.api.Action;
import org.gradle.api.AntBuilder;
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.dsl.DependencyHandler;
import org.gradle.api.file.ConfigurableFileTree;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.FileTree;
import org.gradle.api.initialization.Settings;
import org.gradle.api.plugins.ExtensionAware;
import org.gradle.api.plugins.WarPlugin;
import org.gradle.api.tasks.Copy;
import org.gradle.language.base.plugins.LifecycleBasePlugin;
import org.gradle.util.CollectionUtils;
/**
* @author Andrea Di Giorgi
* @author David Truong
*/
public class PluginsProjectConfigurator extends BaseProjectConfigurator {
public static final String PLUGINS_SDK_CONFIGURATION_NAME = "pluginsSDK";
public static final String UPDATE_PROPERTIES_TASK_NAME = "updateProperties";
public static final String UPGRADE_PLUGINS_SDK_TASK_NAME =
"upgradePluginsSDK";
public PluginsProjectConfigurator(Settings settings) {
super(settings);
}
@Override
public void apply(Project project) {
WorkspaceExtension workspaceExtension = GradleUtil.getExtension(
(ExtensionAware)project.getGradle(), WorkspaceExtension.class);
Task initBundleTask = GradleUtil.getTask(
project.getRootProject(),
RootProjectConfigurator.INIT_BUNDLE_TASK_NAME);
_configureAnt(project);
UpdatePropertiesTask updatePropertiesTask = _addTaskUpdateProperties(
project, workspaceExtension);
_addTaskBuild(project, updatePropertiesTask);
Task warTask = GradleUtil.getTask(project, WarPlugin.WAR_TASK_NAME);
_configureTaskWar(warTask, workspaceExtension, initBundleTask);
_configureRootTaskDistBundle(warTask);
}
@Override
public void configureRootProject(
Project project, WorkspaceExtension workspaceExtension) {
Configuration pluginsSDKConfiguration = _addRootConfigurationPluginsSDK(
project);
_addRootTaskUpgradePluginsSDK(
project, pluginsSDKConfiguration, workspaceExtension);
}
@Override
public String getName() {
return _NAME;
}
@Override
protected Iterable<File> doGetProjectDirs(File rootDir) throws Exception {
File buildXmlFile = new File(rootDir, "build.xml");
if (!buildXmlFile.exists()) {
return Collections.emptySet();
}
return Collections.singleton(rootDir);
}
@Override
protected String getDefaultRootDirName() {
return _DEFAULT_ROOT_DIR_NAME;
}
@Override
protected String getDefaultRootDirPropertyName() {
return _DEFAULT_ROOT_DIR_PROPERTY_NAME;
}
private Configuration _addRootConfigurationPluginsSDK(
final Project project) {
Configuration configuration = GradleUtil.addConfiguration(
project, PLUGINS_SDK_CONFIGURATION_NAME);
configuration.defaultDependencies(
new Action<DependencySet>() {
@Override
public void execute(DependencySet dependencySet) {
_addRootDependenciesPluginsSDK(project);
}
});
configuration.setDescription(
"Configures the Plugins SDK for this Liferay Workspace.");
configuration.setVisible(false);
return configuration;
}
private void _addRootDependenciesPluginsSDK(Project project) {
DependencyHandler dependencyHandler = project.getDependencies();
Map<String, Object> dependencyNotation = new HashMap<>();
dependencyNotation.put("classifier", "withdependencies");
dependencyNotation.put("ext", "zip");
dependencyNotation.put("group", "com.liferay.portal");
dependencyNotation.put("name", "com.liferay.portal.plugins.sdk");
dependencyNotation.put("version", "latest.release");
dependencyHandler.add(
PLUGINS_SDK_CONFIGURATION_NAME, dependencyNotation);
}
private Task _addRootTaskUpgradePluginsSDK(
Project project, Configuration pluginsSDKConfiguration,
WorkspaceExtension workspaceExtension) {
ProjectConfigurator projectConfigurator =
workspaceExtension.propertyMissing(
PluginsProjectConfigurator._NAME);
Collection<File> dirs =
(Collection<File>)projectConfigurator.getDefaultRootDirs();
if (dirs.size() == 1) {
return _addRootTaskUpgradePluginsSDK(
project, UPGRADE_PLUGINS_SDK_TASK_NAME,
CollectionUtils.first(dirs), pluginsSDKConfiguration);
}
Task task = project.task(UPGRADE_PLUGINS_SDK_TASK_NAME);
for (File dir : projectConfigurator.getDefaultRootDirs()) {
String taskName =
UPGRADE_PLUGINS_SDK_TASK_NAME +
StringUtil.capitalize(dir.getName());
Copy copy = _addRootTaskUpgradePluginsSDK(
project, taskName, dir, pluginsSDKConfiguration);
task.dependsOn(copy);
}
task.setDescription(
"Downloads and upgrades all Plugins SDK directories.");
return task;
}
private Copy _addRootTaskUpgradePluginsSDK(
final Project project, String taskName, File dir,
final Configuration pluginsSDKConfiguration) {
Copy copy = GradleUtil.addTask(project, taskName, Copy.class);
copy.from(
new Callable<FileTree>() {
@Override
public FileTree call() throws Exception {
return project.zipTree(
pluginsSDKConfiguration.getSingleFile());
}
},
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySpec copySpec) {
copySpec.eachFile(new StripPathSegmentsAction(1));
}
});
copy.into(dir);
copy.setDescription(
"Downloads the Liferay Plugins SDK zip file into " +
project.relativePath(dir) + ", upgrading if necessary.");
copy.setIncludeEmptyDirs(false);
return copy;
}
private Task _addTaskBuild(
Project project, UpdatePropertiesTask updatePropertiesTask) {
Task task = project.task(LifecycleBasePlugin.BUILD_TASK_NAME);
task.dependsOn(updatePropertiesTask, WarPlugin.WAR_TASK_NAME);
task.setDescription("Alias for 'ant war'.");
return task;
}
private UpdatePropertiesTask _addTaskUpdateProperties(
Project project, final WorkspaceExtension workspaceExtension) {
UpdatePropertiesTask updatePropertiesTask = GradleUtil.addTask(
project, UPDATE_PROPERTIES_TASK_NAME, UpdatePropertiesTask.class);
updatePropertiesTask.property(
"app.server.parent.dir",
new Callable<String>() {
@Override
public String call() throws Exception {
return FileUtil.getAbsolutePath(
workspaceExtension.getHomeDir());
}
});
updatePropertiesTask.setDescription(
"Updates the Plugins SDK build properties with the workspace " +
"configuration.");
String userName = System.getProperty("user.name");
updatePropertiesTask.setPropertiesFile(
"build." + userName + ".properties");
return updatePropertiesTask;
}
private void _configureAnt(Project project) {
AntBuilder antBuilder = project.getAnt();
antBuilder.importBuild("build.xml");
}
private void _configureRootTaskDistBundle(final Task warTask) {
Project project = warTask.getProject();
Copy copy = (Copy)GradleUtil.getTask(
project.getRootProject(),
RootProjectConfigurator.DIST_BUNDLE_TASK_NAME);
copy.dependsOn(warTask);
copy.into(
"osgi/modules",
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySpec copySpec) {
Project project = warTask.getProject();
ConfigurableFileTree configurableFileTree =
project.fileTree("dist");
configurableFileTree.builtBy(warTask);
configurableFileTree.include("*.war");
copySpec.from(configurableFileTree);
}
});
}
private void _configureTaskWar(
Task warTask, final WorkspaceExtension workspaceExtension,
final Task initBundleTask) {
warTask.dependsOn(
new Callable<Task>() {
@Override
public Task call() throws Exception {
File homeDir = workspaceExtension.getHomeDir();
if (homeDir.exists()) {
return null;
}
return initBundleTask;
}
});
}
private static final String _DEFAULT_ROOT_DIR_NAME = "plugins-sdk";
private static final String _DEFAULT_ROOT_DIR_PROPERTY_NAME =
WorkspacePlugin.PROPERTY_PREFIX + "plugins.sdk.dir";
private static final String _NAME = "plugins";
}