/**
* 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.maven.plugin.builder;
import com.liferay.gradle.plugins.maven.plugin.builder.internal.util.GradleUtil;
import com.liferay.gradle.plugins.maven.plugin.builder.tasks.BuildPluginDescriptorTask;
import com.liferay.gradle.plugins.maven.plugin.builder.tasks.WriteMavenSettingsTask;
import com.liferay.gradle.util.Validator;
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.JavaVersion;
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.file.FileCollection;
import org.gradle.api.file.SourceDirectorySet;
import org.gradle.api.internal.plugins.osgi.OsgiHelper;
import org.gradle.api.logging.Logger;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetOutput;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.Upload;
import org.gradle.api.tasks.javadoc.Javadoc;
import org.gradle.external.javadoc.CoreJavadocOptions;
/**
* @author Andrea Di Giorgi
*/
public class MavenPluginBuilderPlugin implements Plugin<Project> {
public static final String BUILD_PLUGIN_DESCRIPTOR_TASK_NAME =
"buildPluginDescriptor";
public static final String MAVEN_EMBEDDER_CONFIGURATION_NAME =
"mavenEmbedder";
public static final String WRITE_MAVEN_SETTINGS_TASK = "writeMavenSettings";
@Override
public void apply(Project project) {
GradleUtil.applyPlugin(project, JavaPlugin.class);
Configuration mavenEmbedderConfiguration =
_addConfigurationMavenEmbedder(project);
WriteMavenSettingsTask writeMavenSettingsTask =
_addTaskWriteMavenSettings(project);
BuildPluginDescriptorTask buildPluginDescriptorTask =
_addTaskBuildPluginDescriptor(
writeMavenSettingsTask, mavenEmbedderConfiguration);
JavaVersion javaVersion = JavaVersion.current();
if (javaVersion.isJava8Compatible()) {
_configureTasksJavadocDisableDoclint(project);
}
_configureTasksUpload(project, buildPluginDescriptorTask);
}
private Configuration _addConfigurationMavenEmbedder(
final Project project) {
Configuration configuration = GradleUtil.addConfiguration(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME);
configuration.defaultDependencies(
new Action<DependencySet>() {
@Override
public void execute(DependencySet dependencySet) {
_addDependenciesMavenEmbedder(project);
}
});
configuration.setDescription(
"Configures Maven Embedder for this project.");
configuration.setVisible(false);
return configuration;
}
private void _addDependenciesMavenEmbedder(Project project) {
GradleUtil.addDependency(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME, "org.apache.maven",
"maven-embedder", "3.3.9");
GradleUtil.addDependency(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME,
"org.apache.maven.wagon", "wagon-http", "2.10");
GradleUtil.addDependency(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME, "org.eclipse.aether",
"aether-connector-basic", "1.0.2.v20150114");
GradleUtil.addDependency(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME, "org.eclipse.aether",
"aether-transport-wagon", "1.0.2.v20150114");
GradleUtil.addDependency(
project, MAVEN_EMBEDDER_CONFIGURATION_NAME, "org.slf4j",
"slf4j-simple", "1.7.5");
}
private BuildPluginDescriptorTask _addTaskBuildPluginDescriptor(
final WriteMavenSettingsTask writeMavenSettingsTask,
FileCollection mavenEmbedderClasspath) {
final Project project = writeMavenSettingsTask.getProject();
BuildPluginDescriptorTask buildPluginDescriptorTask =
GradleUtil.addTask(
project, BUILD_PLUGIN_DESCRIPTOR_TASK_NAME,
BuildPluginDescriptorTask.class);
buildPluginDescriptorTask.dependsOn(
JavaPlugin.COMPILE_JAVA_TASK_NAME, writeMavenSettingsTask);
final SourceSet sourceSet = GradleUtil.getSourceSet(
project, SourceSet.MAIN_SOURCE_SET_NAME);
buildPluginDescriptorTask.setClassesDir(
new Callable<File>() {
@Override
public File call() throws Exception {
SourceSetOutput sourceSetOutput = sourceSet.getOutput();
return sourceSetOutput.getClassesDir();
}
});
buildPluginDescriptorTask.setDescription(
"Generates the Maven plugin descriptor for the project.");
buildPluginDescriptorTask.setGroup(BasePlugin.BUILD_GROUP);
buildPluginDescriptorTask.setMavenEmbedderClasspath(
mavenEmbedderClasspath);
buildPluginDescriptorTask.setMavenSettingsFile(
new Callable<File>() {
@Override
public File call() throws Exception {
return writeMavenSettingsTask.getOutputFile();
}
});
buildPluginDescriptorTask.setOutputDir(
new Callable<File>() {
@Override
public File call() throws Exception {
File resourcesDir = _getSrcDir(sourceSet.getResources());
return new File(resourcesDir, "META-INF/maven");
}
});
buildPluginDescriptorTask.setPomArtifactId(
new Callable<String>() {
@Override
public String call() throws Exception {
return _osgiHelper.getBundleSymbolicName(project);
}
});
buildPluginDescriptorTask.setPomGroupId(
new Callable<Object>() {
@Override
public Object call() throws Exception {
return project.getGroup();
}
});
buildPluginDescriptorTask.setPomVersion(
new Callable<String>() {
@Override
public String call() throws Exception {
String version = String.valueOf(project.getVersion());
if (version.endsWith("-SNAPSHOT")) {
version = version.substring(0, version.length() - 9);
}
return version;
}
});
buildPluginDescriptorTask.setSourceDir(
new Callable<File>() {
@Override
public File call() throws Exception {
return _getSrcDir(sourceSet.getJava());
}
});
Task processResourcesTask = GradleUtil.getTask(
project, JavaPlugin.PROCESS_RESOURCES_TASK_NAME);
processResourcesTask.mustRunAfter(buildPluginDescriptorTask);
return buildPluginDescriptorTask;
}
private WriteMavenSettingsTask _addTaskWriteMavenSettings(
final Project project) {
WriteMavenSettingsTask writeMavenSettingsTask = GradleUtil.addTask(
project, WRITE_MAVEN_SETTINGS_TASK, WriteMavenSettingsTask.class);
writeMavenSettingsTask.doFirst(
new Action<Task>() {
@Override
public void execute(Task task) {
WriteMavenSettingsTask writeMavenSettingsTask =
(WriteMavenSettingsTask)task;
Logger logger = writeMavenSettingsTask.getLogger();
if (!logger.isLifecycleEnabled()) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append("Using ");
String repositoryUrl =
writeMavenSettingsTask.getRepositoryUrl();
if (Validator.isNotNull(repositoryUrl)) {
sb.append(repositoryUrl);
sb.append(" as");
}
else {
sb.append("no");
}
sb.append(" custom repository and ");
String proxyHost = writeMavenSettingsTask.getProxyHost();
Integer proxyPort = writeMavenSettingsTask.getProxyPort();
if (Validator.isNotNull(proxyHost) && (proxyPort != null)) {
sb.append(proxyHost);
sb.append(':');
sb.append(proxyPort);
sb.append(" as");
}
else {
sb.append("no");
}
sb.append(" proxy for Maven invocations in ");
sb.append(writeMavenSettingsTask.getProject());
sb.append('.');
logger.lifecycle(sb.toString());
}
});
writeMavenSettingsTask.setDescription(
"Writes a temporary Maven settings file to be used during " +
"subsequent Maven invocations.");
writeMavenSettingsTask.setLocalRepositoryDir(
new SystemPropertyCallable("maven.repo.local"));
writeMavenSettingsTask.setNonProxyHosts(
System.getProperty("http.nonProxyHosts"));
writeMavenSettingsTask.setProxyHost(
new ProxyPropertyCallable("proxyHost", writeMavenSettingsTask));
writeMavenSettingsTask.setProxyPassword(
new ProxyPropertyCallable("proxyPassword", writeMavenSettingsTask));
writeMavenSettingsTask.setProxyPort(
new ProxyPropertyCallable("proxyPort", writeMavenSettingsTask));
writeMavenSettingsTask.setProxyUser(
new ProxyPropertyCallable("proxyUser", writeMavenSettingsTask));
writeMavenSettingsTask.setRepositoryUrl(
System.getProperty("repository.url"));
writeMavenSettingsTask.setOutputFile(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(project.getBuildDir(), "settings.xml");
}
});
return writeMavenSettingsTask;
}
private void _configureTaskJavadocDisableDoclint(Javadoc javadoc) {
CoreJavadocOptions coreJavadocOptions =
(CoreJavadocOptions)javadoc.getOptions();
coreJavadocOptions.addStringOption("Xdoclint:none", "-quiet");
}
private void _configureTasksJavadocDisableDoclint(Project project) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
Javadoc.class,
new Action<Javadoc>() {
@Override
public void execute(Javadoc javadoc) {
_configureTaskJavadocDisableDoclint(javadoc);
}
});
}
private void _configureTasksUpload(
Project project,
final BuildPluginDescriptorTask buildPluginDescriptorTask) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
Upload.class,
new Action<Upload>() {
@Override
public void execute(Upload upload) {
_configureTaskUpload(upload, buildPluginDescriptorTask);
}
});
}
private void _configureTaskUpload(
Upload upload, BuildPluginDescriptorTask buildPluginDescriptorTask) {
upload.dependsOn(buildPluginDescriptorTask);
}
private File _getSrcDir(SourceDirectorySet sourceDirectorySet) {
Set<File> srcDirs = sourceDirectorySet.getSrcDirs();
Iterator<File> iterator = srcDirs.iterator();
return iterator.next();
}
private static final OsgiHelper _osgiHelper = new OsgiHelper();
private static class ProxyPropertyCallable extends SystemPropertyCallable {
public ProxyPropertyCallable(
String key, WriteMavenSettingsTask writeMavenSettingsTask) {
super(key);
_writeMavenSettingsTask = writeMavenSettingsTask;
}
@Override
protected String getSystemPropertyKey() {
String protocol = "https";
String repositoryUrl = _writeMavenSettingsTask.getRepositoryUrl();
if (Validator.isNotNull(repositoryUrl)) {
protocol = repositoryUrl.substring(
0, repositoryUrl.indexOf(':'));
}
return protocol + "." + super.getSystemPropertyKey();
}
private final WriteMavenSettingsTask _writeMavenSettingsTask;
}
private static class SystemPropertyCallable implements Callable<String> {
public SystemPropertyCallable(String key) {
_key = key;
}
@Override
public String call() throws Exception {
return System.getProperty(getSystemPropertyKey());
}
protected String getSystemPropertyKey() {
return _key;
}
private final String _key;
}
}