/**
* 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.LiferayBasePlugin;
import com.liferay.gradle.plugins.LiferayOSGiPlugin;
import com.liferay.gradle.plugins.extensions.LiferayExtension;
import com.liferay.gradle.plugins.jasper.jspc.JspCPlugin;
import com.liferay.gradle.plugins.poshi.runner.PoshiRunnerPlugin;
import com.liferay.gradle.plugins.service.builder.ServiceBuilderPlugin;
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 groovy.lang.Closure;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashSet;
import java.util.Set;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.CopySourceSpec;
import org.gradle.api.initialization.Settings;
import org.gradle.api.plugins.BasePluginConvention;
import org.gradle.api.plugins.ExtensionAware;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.Copy;
import org.gradle.api.tasks.compile.JavaCompile;
import org.gradle.jvm.tasks.Jar;
/**
* @author Andrea Di Giorgi
* @author David Truong
*/
public class ModulesProjectConfigurator extends BaseProjectConfigurator {
public ModulesProjectConfigurator(Settings settings) {
super(settings);
_defaultRepositoryEnabled = GradleUtil.getProperty(
settings,
WorkspacePlugin.PROPERTY_PREFIX + _NAME +
".default.repository.enabled",
_DEFAULT_REPOSITORY_ENABLED);
_jspPrecompileEnabled = GradleUtil.getProperty(
settings,
WorkspacePlugin.PROPERTY_PREFIX + _NAME + ".jsp.precompile.enabled",
_DEFAULT_JSP_PRECOMPILE_ENABLED);
}
@Override
public void apply(Project project) {
final WorkspaceExtension workspaceExtension = GradleUtil.getExtension(
(ExtensionAware)project.getGradle(), WorkspaceExtension.class);
_applyPlugins(project);
if (isDefaultRepositoryEnabled()) {
GradleUtil.addDefaultRepositories(project);
}
_configureLiferay(project, workspaceExtension);
_configureTaskRunPoshi(project);
Jar jar = (Jar)GradleUtil.getTask(project, JavaPlugin.JAR_TASK_NAME);
final JavaCompile compileJSPTask = (JavaCompile)GradleUtil.getTask(
project, JspCPlugin.COMPILE_JSP_TASK_NAME);
_configureRootTaskDistBundle(jar, compileJSPTask);
project.afterEvaluate(
new Action<Project>() {
@Override
public void execute(Project project) {
_configureTaskCompileJSP(
compileJSPTask, workspaceExtension);
}
});
}
@Override
public String getName() {
return _NAME;
}
public boolean isDefaultRepositoryEnabled() {
return _defaultRepositoryEnabled;
}
public boolean isJspPrecompileEnabled() {
return _jspPrecompileEnabled;
}
public void setDefaultRepositoryEnabled(boolean defaultRepositoryEnabled) {
_defaultRepositoryEnabled = defaultRepositoryEnabled;
}
public void setJspPrecompileEnabled(boolean jspPrecompileEnabled) {
_jspPrecompileEnabled = jspPrecompileEnabled;
}
@Override
protected Iterable<File> doGetProjectDirs(File rootDir) throws Exception {
final Set<File> projectDirs = new HashSet<>();
Files.walkFileTree(
rootDir.toPath(),
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(
Path dirPath, BasicFileAttributes basicFileAttributes)
throws IOException {
if (Files.exists(dirPath.resolve("bnd.bnd"))) {
projectDirs.add(dirPath.toFile());
return FileVisitResult.SKIP_SUBTREE;
}
return FileVisitResult.CONTINUE;
}
});
return projectDirs;
}
private void _applyPlugins(Project project) {
GradleUtil.applyPlugin(project, LiferayOSGiPlugin.class);
GradleUtil.applyPlugin(project, PoshiRunnerPlugin.class);
if (FileUtil.exists(project, "service.xml")) {
GradleUtil.applyPlugin(project, ServiceBuilderPlugin.class);
}
}
private void _configureLiferay(
Project project, WorkspaceExtension workspaceExtension) {
LiferayExtension liferayExtension = GradleUtil.getExtension(
project, LiferayExtension.class);
liferayExtension.setAppServerParentDir(workspaceExtension.getHomeDir());
}
private void _configureRootTaskDistBundle(
final Jar jar, final JavaCompile compileJSPTask) {
final Project project = jar.getProject();
Copy copy = (Copy)GradleUtil.getTask(
project.getRootProject(),
RootProjectConfigurator.DIST_BUNDLE_TASK_NAME);
copy.into(
"osgi/modules",
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySourceSpec copySourceSpec) {
copySourceSpec.from(jar);
}
});
if (isJspPrecompileEnabled()) {
copy.into(
new Closure<String>(project) {
@SuppressWarnings("unused")
public String doCall() {
return _getCompileJSPDestinationDirName(project);
}
},
new Closure<Void>(project) {
@SuppressWarnings("unused")
public void doCall(CopySourceSpec copySourceSpec) {
copySourceSpec.from(compileJSPTask);
}
});
}
}
private void _configureTaskCompileJSP(
JavaCompile compileJSPTask, WorkspaceExtension workspaceExtension) {
if (!isJspPrecompileEnabled()) {
return;
}
File dir = new File(
workspaceExtension.getHomeDir(),
_getCompileJSPDestinationDirName(compileJSPTask.getProject()));
compileJSPTask.setDestinationDir(dir);
}
private void _configureTaskRunPoshi(Project project) {
Task task = GradleUtil.getTask(
project, PoshiRunnerPlugin.RUN_POSHI_TASK_NAME);
task.dependsOn(LiferayBasePlugin.DEPLOY_TASK_NAME);
}
private String _getCompileJSPDestinationDirName(Project project) {
BasePluginConvention basePluginConvention = GradleUtil.getConvention(
project, BasePluginConvention.class);
return "work/" + basePluginConvention.getArchivesBaseName() + "-" +
project.getVersion();
}
private static final boolean _DEFAULT_JSP_PRECOMPILE_ENABLED = false;
private static final boolean _DEFAULT_REPOSITORY_ENABLED = true;
private static final String _NAME = "modules";
private boolean _defaultRepositoryEnabled;
private boolean _jspPrecompileEnabled;
}