/**
* 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.wsdd.builder;
import com.liferay.gradle.util.GradleUtil;
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.Task;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.SourceDirectorySet;
import org.gradle.api.plugins.BasePlugin;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.PluginContainer;
import org.gradle.api.plugins.WarPlugin;
import org.gradle.api.plugins.WarPluginConvention;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskOutputs;
/**
* @author Andrea Di Giorgi
*/
public class WSDDBuilderPlugin implements Plugin<Project> {
public static final String BUILD_WSDD_TASK_NAME = "buildWSDD";
public static final String CONFIGURATION_NAME = "wsddBuilder";
@Override
public void apply(Project project) {
GradleUtil.applyPlugin(project, JavaPlugin.class);
Configuration wsddBuilderConfiguration = addConfigurationWSDDBuilder(
project);
addTaskBuildWSDD(project);
configureTasksBuildWSDD(project, wsddBuilderConfiguration);
}
protected Configuration addConfigurationWSDDBuilder(final Project project) {
Configuration configuration = GradleUtil.addConfiguration(
project, CONFIGURATION_NAME);
configuration.setDescription(
"Configures Liferay WSDD Builder for this project.");
configuration.setVisible(false);
GradleUtil.executeIfEmpty(
configuration,
new Action<Configuration>() {
@Override
public void execute(Configuration configuration) {
addDependenciesWSDDBuilder(project);
}
});
return configuration;
}
protected void addDependenciesWSDDBuilder(Project project) {
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "com.liferay",
"com.liferay.portal.tools.wsdd.builder", "latest.release");
}
protected BuildWSDDTask addTaskBuildWSDD(Project project) {
final BuildWSDDTask buildWSDDTask = GradleUtil.addTask(
project, BUILD_WSDD_TASK_NAME, BuildWSDDTask.class);
buildWSDDTask.dependsOn(JavaPlugin.COMPILE_JAVA_TASK_NAME);
buildWSDDTask.setBuilderClasspath(
new Callable<String>() {
@Override
public String call() throws Exception {
Project project = buildWSDDTask.getProject();
Task compileJavaTask = GradleUtil.getTask(
project, JavaPlugin.COMPILE_JAVA_TASK_NAME);
TaskOutputs taskOutputs = compileJavaTask.getOutputs();
FileCollection fileCollection = taskOutputs.getFiles();
SourceSet sourceSet = GradleUtil.getSourceSet(
project, SourceSet.MAIN_SOURCE_SET_NAME);
fileCollection = fileCollection.plus(
sourceSet.getCompileClasspath());
fileCollection = fileCollection.plus(
sourceSet.getRuntimeClasspath());
return fileCollection.getAsPath();
}
});
buildWSDDTask.setDescription("Runs Liferay WSDD Builder.");
buildWSDDTask.setGroup(BasePlugin.BUILD_GROUP);
buildWSDDTask.setInputFile("service.xml");
buildWSDDTask.setOutputDir(
new Callable<File>() {
@Override
public File call() throws Exception {
return getResourcesDir(buildWSDDTask.getProject());
}
});
PluginContainer pluginContainer = project.getPlugins();
pluginContainer.withType(
WarPlugin.class,
new Action<WarPlugin>() {
@Override
public void execute(WarPlugin warPlugin) {
configureTaskBuildWSDDForWarPlugin(buildWSDDTask);
}
});
return buildWSDDTask;
}
protected void configureTaskBuildWSDDClasspath(
BuildWSDDTask buildWSDDTask, FileCollection fileCollection) {
buildWSDDTask.setClasspath(fileCollection);
}
protected void configureTaskBuildWSDDForWarPlugin(
final BuildWSDDTask buildWSDDTask) {
buildWSDDTask.setInputFile(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(
getWebAppDir(buildWSDDTask.getProject()),
"WEB-INF/service.xml");
}
});
buildWSDDTask.setServerConfigFile(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(
getWebAppDir(buildWSDDTask.getProject()),
"WEB-INF/server-config.wsdd");
}
});
}
protected void configureTasksBuildWSDD(
Project project, final Configuration wsddBuilderCOnfiguration) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
BuildWSDDTask.class,
new Action<BuildWSDDTask>() {
@Override
public void execute(BuildWSDDTask buildWSDDTask) {
configureTaskBuildWSDDClasspath(
buildWSDDTask, wsddBuilderCOnfiguration);
}
});
}
protected File getResourcesDir(Project project) {
SourceSet sourceSet = GradleUtil.getSourceSet(
project, SourceSet.MAIN_SOURCE_SET_NAME);
return getSrcDir(sourceSet.getResources());
}
protected File getSrcDir(SourceDirectorySet sourceDirectorySet) {
Set<File> srcDirs = sourceDirectorySet.getSrcDirs();
Iterator<File> iterator = srcDirs.iterator();
return iterator.next();
}
protected File getWebAppDir(Project project) {
WarPluginConvention warPluginConvention = GradleUtil.getConvention(
project, WarPluginConvention.class);
return warPluginConvention.getWebAppDir();
}
}