/**
* 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.xsd.builder;
import com.liferay.gradle.util.FileUtil;
import com.liferay.gradle.util.GradleUtil;
import com.liferay.gradle.util.StringUtil;
import java.io.File;
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.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.JavaExec;
import org.gradle.api.tasks.TaskContainer;
import org.gradle.api.tasks.TaskInputs;
import org.gradle.api.tasks.TaskOutputs;
import org.gradle.api.tasks.compile.JavaCompile;
/**
* @author Andrea Di Giorgi
*/
public class XSDBuilderPlugin implements Plugin<Project> {
public static final String BUILD_XSD_TASK_NAME = "buildXSD";
public static final String CONFIGURATION_NAME = "xsdBuilder";
@Override
public void apply(Project project) {
GradleUtil.applyPlugin(project, JavaPlugin.class);
addConfigurationXSDBuilder(project);
addTaskBuildXSD(project);
project.afterEvaluate(
new Action<Project>() {
@Override
public void execute(Project project) {
configureTasksBuildXSD(project);
}
});
}
protected Configuration addConfigurationXSDBuilder(final Project project) {
Configuration configuration = GradleUtil.addConfiguration(
project, CONFIGURATION_NAME);
configuration.setDescription(
"Configures Apache XMLBeans for generating XMLBeans bindings.");
configuration.setVisible(false);
GradleUtil.executeIfEmpty(
configuration,
new Action<Configuration>() {
@Override
public void execute(Configuration configuration) {
addDependenciesXSDBuilder(project);
}
});
return configuration;
}
protected void addDependenciesXSDBuilder(Project project) {
GradleUtil.addDependency(
project, CONFIGURATION_NAME, "org.apache.xmlbeans", "xmlbeans",
"2.5.0");
}
protected BuildXSDTask addTaskBuildXSD(Project project) {
final BuildXSDTask buildXSDTask = GradleUtil.addTask(
project, BUILD_XSD_TASK_NAME, BuildXSDTask.class);
buildXSDTask.setDescription(
"Generates XMLBeans bindings and compiles them in a JAR file.");
buildXSDTask.setDestinationDir(project.file("lib"));
buildXSDTask.setGroup(BasePlugin.BUILD_GROUP);
buildXSDTask.setInputDir("xsd");
PluginContainer pluginContainer = project.getPlugins();
pluginContainer.withType(
WarPlugin.class,
new Action<WarPlugin>() {
@Override
public void execute(WarPlugin warPlugin) {
configureTaskBuildXSDForWarPlugin(buildXSDTask);
}
});
return buildXSDTask;
}
protected Task addTaskBuildXSDCompile(
BuildXSDTask buildXSDTask, Task generateTask) {
Project project = buildXSDTask.getProject();
JavaCompile javaCompile = GradleUtil.addTask(
project, buildXSDTask.getName() + "Compile", JavaCompile.class);
javaCompile.dependsOn(
BasePlugin.CLEAN_TASK_NAME +
StringUtil.capitalize(javaCompile.getName()));
javaCompile.setClasspath(
GradleUtil.getConfiguration(project, CONFIGURATION_NAME));
javaCompile.setDescription("Compiles the generated Java types.");
File tmpBinDir = new File(
project.getBuildDir(), buildXSDTask.getName() + "/bin");
javaCompile.setDestinationDir(tmpBinDir);
javaCompile.setSource(generateTask.getOutputs());
return javaCompile;
}
protected Task addTaskBuildXSDGenerate(BuildXSDTask buildXSDTask) {
Project project = buildXSDTask.getProject();
JavaExec javaExec = GradleUtil.addTask(
project, buildXSDTask.getName() + "Generate", JavaExec.class);
File tmpSrcDir = new File(
project.getBuildDir(), buildXSDTask.getName() + "/src");
javaExec.args("-d");
javaExec.args(FileUtil.getAbsolutePath(tmpSrcDir));
javaExec.args("-srconly");
Iterable<File> xsdFiles = buildXSDTask.getInputFiles();
for (File xsdFile : xsdFiles) {
javaExec.args(FileUtil.getAbsolutePath(xsdFile));
}
javaExec.dependsOn(
BasePlugin.CLEAN_TASK_NAME +
StringUtil.capitalize(javaExec.getName()));
javaExec.setClasspath(
GradleUtil.getConfiguration(project, CONFIGURATION_NAME));
javaExec.setDescription(
"Invokes the XMLBeans Schema Compiler in order to generate Java " +
"types from XML Schema.");
javaExec.setMain("org.apache.xmlbeans.impl.tool.SchemaCompiler");
TaskInputs taskInputs = javaExec.getInputs();
taskInputs.files(xsdFiles);
TaskOutputs taskOutputs = javaExec.getOutputs();
taskOutputs.dir(tmpSrcDir);
return javaExec;
}
protected void configureTaskBuildXSD(BuildXSDTask buildXSDTask) {
FileCollection inputFiles = buildXSDTask.getInputFiles();
if (inputFiles.isEmpty()) {
return;
}
Task generateTask = addTaskBuildXSDGenerate(buildXSDTask);
Task compileTask = addTaskBuildXSDCompile(buildXSDTask, generateTask);
buildXSDTask.from(compileTask.getOutputs());
buildXSDTask.from(generateTask.getOutputs());
TaskOutputs taskOutputs = buildXSDTask.getOutputs();
GradleUtil.addDependency(
buildXSDTask.getProject(), JavaPlugin.COMPILE_CONFIGURATION_NAME,
taskOutputs.getFiles());
}
protected void configureTaskBuildXSDForWarPlugin(
final BuildXSDTask buildXSDTask) {
buildXSDTask.setDestinationDir(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(
getWebAppDir(buildXSDTask.getProject()), "WEB-INF/lib");
}
});
buildXSDTask.setInputDir(
new Callable<File>() {
@Override
public File call() throws Exception {
return new File(
getWebAppDir(buildXSDTask.getProject()), "WEB-INF/xsd");
}
});
}
protected void configureTasksBuildXSD(Project project) {
TaskContainer taskContainer = project.getTasks();
taskContainer.withType(
BuildXSDTask.class,
new Action<BuildXSDTask>() {
@Override
public void execute(BuildXSDTask buildXSDTask) {
configureTaskBuildXSD(buildXSDTask);
}
});
}
protected File getWebAppDir(Project project) {
WarPluginConvention warPluginConvention = GradleUtil.getConvention(
project, WarPluginConvention.class);
return warPluginConvention.getWebAppDir();
}
}