/**
* 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.wsdl.builder;
import com.liferay.gradle.util.FileUtil;
import com.liferay.gradle.util.GradleUtil;
import groovy.lang.Closure;
import java.io.File;
import java.util.Collections;
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.artifacts.DependencySet;
import org.gradle.api.file.CopySpec;
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.Copy;
import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskInputs;
import org.gradle.api.tasks.TaskOutputs;
import org.gradle.api.tasks.bundling.Jar;
import org.gradle.api.tasks.compile.JavaCompile;
/**
* @author Andrea Di Giorgi
*/
public class WSDLBuilderPlugin implements Plugin<Project> {
public static final String BUILD_WSDL_TASK_NAME = "buildWSDL";
public static final String CONFIGURATION_NAME = "wsdlBuilder";
@Override
public void apply(Project project) {
GradleUtil.applyPlugin(project, JavaPlugin.class);
final Configuration wsdlBuilderConfiguration =
_addConfigurationWSDLBuilder(project);
_addTaskBuildWSDL(project);
project.afterEvaluate(
new Action<Project>() {
@Override
public void execute(Project project) {
_configureTasksBuildWSDL(project, wsdlBuilderConfiguration);
}
});
}
private Configuration _addConfigurationWSDLBuilder(final Project project) {
Configuration configuration = GradleUtil.addConfiguration(
project, CONFIGURATION_NAME);
configuration.defaultDependencies(
new Action<DependencySet>() {
@Override
public void execute(DependencySet dependencySet) {
_addDependenciesWSDLBuilder(project);
}
});
configuration.setDescription(
"Configures Apache Axis for generating WSDL client stubs.");
configuration.setVisible(false);
return configuration;
}
private void _addDependenciesWSDLBuilder(Project project) {
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "axis", "axis-wsdl4j", "1.5.1");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "com.liferay", "org.apache.axis",
"1.4.LIFERAY-PATCHED-1");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "commons-discovery",
"commons-discovery", "0.2");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "commons-logging", "commons-logging",
"1.0.4");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "javax.activation", "activation",
"1.1");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "javax.mail", "mail", "1.4");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "org.apache.axis", "axis-jaxrpc",
"1.4");
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "org.apache.axis", "axis-saaj", "1.4");
}
private BuildWSDLTask _addTaskBuildWSDL(Project project) {
final BuildWSDLTask buildWSDLTask = GradleUtil.addTask(
project, BUILD_WSDL_TASK_NAME, BuildWSDLTask.class);
buildWSDLTask.setDescription("Generates WSDL client stubs.");
buildWSDLTask.setDestinationDir(
new Callable<Object>() {
@Override
public Object call() throws Exception {
if (buildWSDLTask.isBuildLibs()) {
return "lib";
}
else {
return _getJavaDir(buildWSDLTask.getProject());
}
}
});
buildWSDLTask.setGroup(BasePlugin.BUILD_GROUP);
buildWSDLTask.setIncludes(Collections.singleton("**/*.wsdl"));
buildWSDLTask.setSource("wsdl");
PluginContainer pluginContainer = project.getPlugins();
pluginContainer.withType(
WarPlugin.class,
new Action<WarPlugin>() {
@Override
public void execute(WarPlugin warPlugin) {
_configureTaskBuildWSDLForWarPlugin(buildWSDLTask);
}
});
return buildWSDLTask;
}
private Task _addTaskBuildWSDLCompile(
BuildWSDLTask buildWSDLTask, FileCollection classpath, File inputFile,
File tmpDir, Task generateTask) {
Project project = buildWSDLTask.getProject();
String taskName = GradleUtil.getTaskName(
buildWSDLTask.getName() + "Compile", inputFile);
JavaCompile javaCompile = GradleUtil.addTask(
project, taskName, JavaCompile.class);
javaCompile.setClasspath(classpath);
File tmpBinDir = new File(tmpDir, "bin");
javaCompile.setDestinationDir(tmpBinDir);
javaCompile.setSource(generateTask.getOutputs());
return javaCompile;
}
private Task _addTaskBuildWSDLGenerate(
BuildWSDLTask buildWSDLTask, FileCollection classpath, File inputFile,
final File destinationDir) {
Project project = buildWSDLTask.getProject();
String taskName = GradleUtil.getTaskName(
buildWSDLTask.getName() + "Generate", inputFile);
JavaExec javaExec = GradleUtil.addTask(
project, taskName, JavaExec.class);
GenerateOptions generateOptions = buildWSDLTask.getGenerateOptions();
javaExec.args(generateOptions.getArgs());
javaExec.args("--output=" + FileUtil.getAbsolutePath(destinationDir));
javaExec.args(FileUtil.getAbsolutePath(inputFile));
javaExec.doFirst(
new Action<Task>() {
@Override
public void execute(Task task) {
Project project = task.getProject();
project.delete(destinationDir);
}
});
javaExec.setClasspath(classpath);
javaExec.setMain("org.apache.axis.wsdl.WSDL2Java");
TaskInputs taskInputs = javaExec.getInputs();
taskInputs.file(inputFile);
TaskOutputs taskOutputs = javaExec.getOutputs();
taskOutputs.dir(destinationDir);
return javaExec;
}
private Jar _addTaskBuildWSDLJar(
BuildWSDLTask buildWSDLTask, File inputFile, Task compileTask,
final Task generateTask) {
Project project = buildWSDLTask.getProject();
String taskName = GradleUtil.getTaskName(
buildWSDLTask.getName(), inputFile);
Jar jar = GradleUtil.addTask(project, taskName, Jar.class);
jar.from(compileTask.getOutputs());
if (buildWSDLTask.isIncludeSource()) {
jar.into(
"OSGI-OPT/src",
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySpec copySpec) {
copySpec.from(generateTask.getOutputs());
}
});
}
jar.setDestinationDir(buildWSDLTask.getDestinationDir());
String wsdlName = FileUtil.stripExtension(inputFile.getName());
jar.setArchiveName(wsdlName + "-ws.jar");
return jar;
}
private void _addTaskBuildWSDLTasks(
BuildWSDLTask buildWSDLTask, File inputFile,
Configuration wsdlBuilderConfiguration) {
Project project = buildWSDLTask.getProject();
if (buildWSDLTask.isBuildLibs()) {
String tmpDirName =
"build-wsdl/" + FileUtil.stripExtension(inputFile.getName());
File tmpDir = new File(project.getBuildDir(), tmpDirName);
File tmpSrcDir = new File(tmpDir, "src");
Task generateTask = _addTaskBuildWSDLGenerate(
buildWSDLTask, wsdlBuilderConfiguration, inputFile, tmpSrcDir);
Task compileTask = _addTaskBuildWSDLCompile(
buildWSDLTask, wsdlBuilderConfiguration, inputFile, tmpDir,
generateTask);
Jar jar = _addTaskBuildWSDLJar(
buildWSDLTask, inputFile, compileTask, generateTask);
buildWSDLTask.dependsOn(jar);
TaskOutputs taskOutputs = buildWSDLTask.getOutputs();
taskOutputs.file(jar.getArchivePath());
}
else {
Task generateTask = _addTaskBuildWSDLGenerate(
buildWSDLTask, wsdlBuilderConfiguration, inputFile,
buildWSDLTask.getDestinationDir());
buildWSDLTask.dependsOn(generateTask);
}
}
private void _configureTaskBuildWSDL(
final BuildWSDLTask buildWSDLTask, Copy processResourcesTask,
Configuration wsdlBuilderConfiguration) {
FileCollection fileCollection = buildWSDLTask.getSource();
if (fileCollection.isEmpty()) {
return;
}
Project project = buildWSDLTask.getProject();
for (File inputFile : fileCollection) {
_addTaskBuildWSDLTasks(
buildWSDLTask, inputFile, wsdlBuilderConfiguration);
}
if (buildWSDLTask.isBuildLibs()) {
TaskOutputs taskOutputs = buildWSDLTask.getOutputs();
GradleUtil.addDependency(
project, JavaPlugin.COMPILE_CONFIGURATION_NAME,
taskOutputs.getFiles());
}
if (buildWSDLTask.isIncludeWSDLs() && (processResourcesTask != null)) {
processResourcesTask.into(
"wsdl",
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySpec copySpec) {
copySpec.from(buildWSDLTask.getSource());
}
});
}
}
private void _configureTaskBuildWSDLForWarPlugin(
final BuildWSDLTask buildWSDLTask) {
buildWSDLTask.setDestinationDir(
new Callable<File>() {
@Override
public File call() throws Exception {
if (buildWSDLTask.isBuildLibs()) {
return new File(
_getWebAppDir(buildWSDLTask.getProject()),
"WEB-INF/lib");
}
else {
return _getJavaDir(buildWSDLTask.getProject());
}
}
});
buildWSDLTask.setSource(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(
_getWebAppDir(buildWSDLTask.getProject()),
"WEB-INF/wsdl");
}
});
}
private void _configureTasksBuildWSDL(
Project project, final Configuration wsdlBuilderConfiguration) {
TaskContainer taskContainer = project.getTasks();
final Copy processResourcesTask = (Copy)taskContainer.findByName(
JavaPlugin.PROCESS_RESOURCES_TASK_NAME);
taskContainer.withType(
BuildWSDLTask.class,
new Action<BuildWSDLTask>() {
@Override
public void execute(BuildWSDLTask buildWSDLTask) {
_configureTaskBuildWSDL(
buildWSDLTask, processResourcesTask,
wsdlBuilderConfiguration);
}
});
}
private File _getJavaDir(Project project) {
SourceSet sourceSet = GradleUtil.getSourceSet(
project, SourceSet.MAIN_SOURCE_SET_NAME);
return _getSrcDir(sourceSet.getJava());
}
private File _getSrcDir(SourceDirectorySet sourceDirectorySet) {
Set<File> srcDirs = sourceDirectorySet.getSrcDirs();
Iterator<File> iterator = srcDirs.iterator();
return iterator.next();
}
private File _getWebAppDir(Project project) {
WarPluginConvention warPluginConvention = GradleUtil.getConvention(
project, WarPluginConvention.class);
return warPluginConvention.getWebAppDir();
}
}