/*
* Copyright 2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.jelmerk;
import org.gradle.BuildAdapter;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.invocation.Gradle;
import org.gradle.api.plugins.WarPlugin;
import org.gradle.api.plugins.WarPluginConvention;
import org.gradle.api.specs.Spec;
import java.io.File;
/**
* Implementation of {@link Plugin} that adds tasks and configuration for creating Liferay themes.
* When you configure this plugin {@link LiferayBasePlugin} is configured as well
*
* @author Jelmer Kuperus
*/
public class ThemePlugin implements Plugin<Project> {
/**
* The name of the task that builds the thumbnail out of a larger image.
*/
public static final String BUILD_THUMBNAIL_TASK_NAME = "buildThumbnail";
/**
* The name of the task that merges the parent theme and the diffs.
*/
public static final String MERGE_THEME_TASK_NAME = "mergeTheme";
/**
* The name of the theme extension.
*/
public static final String THEME_EXTENSION_NAME = "theme";
/**
* {@inheritDoc}
*/
@Override
public void apply(Project project) {
project.getPlugins().apply(LiferayBasePlugin.class);
createThemeExtension(project);
configureWar(project);
configureMergeTemplateTaskDefaults(project);
createMergeTemplateTask(project);
configureBuildThumbnailTaskDefaults(project);
createBuildThumbnailTask(project);
}
private void configureWar(Project project) {
project.getConvention().getPlugin(WarPluginConvention.class)
.setWebAppDirName(new File(project.getBuildDir(), "webapp").getAbsolutePath());
}
private void createThemeExtension(Project project) {
project.getExtensions().create(THEME_EXTENSION_NAME, ThemePluginExtension.class, project);
}
private void configureMergeTemplateTaskDefaults(Project project) {
project.getGradle().addBuildListener(new MergeTemplateTaskDefaultsBuildListener(project));
}
private void createMergeTemplateTask(Project project) {
WarPluginConvention warConvention = project.getConvention().getPlugin(WarPluginConvention.class);
ThemePluginExtension themeExtension = project.getExtensions().getByType(ThemePluginExtension.class);
MergeTheme task = project.getTasks().create(MERGE_THEME_TASK_NAME, MergeTheme.class);
task.setThemeType(themeExtension.getThemeType());
project.getGradle().addBuildListener(new MergeTemplateTaskBuildListener(task, themeExtension, warConvention));
}
private void configureBuildThumbnailTaskDefaults(Project project) {
project.getGradle().addBuildListener(new BuildThumbnailTaskDefaultsBuildListener(project));
}
private void createBuildThumbnailTask(Project project) {
WarPluginConvention warConvention = project.getConvention().getPlugin(WarPluginConvention.class);
ThemePluginExtension themeExtension = project.getExtensions().getByType(ThemePluginExtension.class);
Task mergeTask = project.getTasks().getByName(MERGE_THEME_TASK_NAME);
BuildThumbnail task = project.getTasks().create(BUILD_THUMBNAIL_TASK_NAME, BuildThumbnail.class);
project.getGradle().addBuildListener(new BuildThumbnailTaskBuildListener(task, themeExtension, warConvention));
task.dependsOn(mergeTask);
task.onlyIf(new ThumbnailTaskOnlyIfSpec(themeExtension));
Task warTask = project.getTasks().getByName(WarPlugin.WAR_TASK_NAME);
warTask.dependsOn(task);
}
private static final class BuildThumbnailTaskBuildListener extends BuildAdapter {
private final BuildThumbnail task;
private final ThemePluginExtension themeExtension;
private final WarPluginConvention warConvention;
private BuildThumbnailTaskBuildListener(BuildThumbnail task,
ThemePluginExtension themeExtension,
WarPluginConvention warConvention) {
this.task = task;
this.themeExtension = themeExtension;
this.warConvention = warConvention;
}
@Override
public void projectsEvaluated(Gradle gradle) {
// only set the default if nothing was changed from say a configuration closure
if (task.getOriginalFile() == null) {
task.setOriginalFile(new File(themeExtension.getDiffsDir(), "images/screenshot.png"));
}
if (task.getThumbnailFile() == null) {
task.setThumbnailFile(new File(warConvention.getWebAppDir(), "images/thumbnail.png"));
}
}
}
private static final class BuildThumbnailTaskDefaultsBuildListener extends BuildAdapter {
private final Project project;
private BuildThumbnailTaskDefaultsBuildListener(Project project) {
this.project = project;
}
@Override
public void projectsEvaluated(Gradle gradle) {
LiferayPluginExtension liferayExtension = project.getExtensions().getByType(LiferayPluginExtension.class);
project.getTasks().withType(BuildThumbnail.class, new SetBuildThumbnailDefaultsAction(liferayExtension));
}
private static final class SetBuildThumbnailDefaultsAction implements Action<BuildThumbnail> {
private final LiferayPluginExtension liferayExtension;
private SetBuildThumbnailDefaultsAction(LiferayPluginExtension liferayExtension) {
this.liferayExtension = liferayExtension;
}
@Override
public void execute(BuildThumbnail task) {
if (task.getClasspath() == null) {
task.setClasspath(liferayExtension.getPortalClasspath());
}
}
}
}
private static final class MergeTemplateTaskBuildListener extends BuildAdapter {
private final MergeTheme task;
private final ThemePluginExtension themeExtension;
private final WarPluginConvention warConvention;
private MergeTemplateTaskBuildListener(MergeTheme task,
ThemePluginExtension themeExtension,
WarPluginConvention warConvention) {
this.task = task;
this.themeExtension = themeExtension;
this.warConvention = warConvention;
}
@Override
public void projectsEvaluated(Gradle gradle) {
if (task.getThemeType() == null) {
task.setThemeType(themeExtension.getThemeType());
}
if (task.getParentThemeName() == null) {
task.setParentThemeName(themeExtension.getParentThemeName());
}
if (task.getParentThemeProjectName() == null) {
task.setParentThemeProjectName(themeExtension.getParentThemeProjectName());
}
if (task.getDiffsDir() == null) {
task.setDiffsDir(themeExtension.getDiffsDir());
}
if (task.getOutputDir() == null) {
task.setOutputDir(warConvention.getWebAppDir());
}
}
}
private static final class MergeTemplateTaskDefaultsBuildListener extends BuildAdapter {
private final Project project;
private MergeTemplateTaskDefaultsBuildListener(Project project) {
this.project = project;
}
@Override
public void projectsEvaluated(Gradle gradle) {
project.getTasks().withType(MergeTheme.class, new SetMergeThemeTaskDefaultsAction(project));
}
private static final class SetMergeThemeTaskDefaultsAction implements Action<MergeTheme> {
private final Project project;
private SetMergeThemeTaskDefaultsAction(Project project) {
this.project = project;
}
@Override
public void execute(MergeTheme mergeTheme) {
LiferayPluginExtension liferayExtension = project.getExtensions()
.getByType(LiferayPluginExtension.class);
if (mergeTheme.getAppServerPortalDir() == null) {
mergeTheme.setAppServerPortalDir(liferayExtension.getAppServerPortalDir());
}
}
}
}
private static final class ThumbnailTaskOnlyIfSpec implements Spec<Task> {
private final ThemePluginExtension themeExtension;
private ThumbnailTaskOnlyIfSpec(ThemePluginExtension themeExtension) {
this.themeExtension = themeExtension;
}
@Override
public boolean isSatisfiedBy(Task element) {
BuildThumbnail castTask = (BuildThumbnail) element; //NOSONAR
return castTask.getOriginalFile().exists() &&
!new File(themeExtension.getDiffsDir(), "images/thumbnail.png").exists();
}
}
}