/** * 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.jasper.jspc; import com.liferay.gradle.util.GradleUtil; 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.artifacts.Configuration; import org.gradle.api.artifacts.DependencySet; import org.gradle.api.artifacts.ModuleDependency; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.SourceDirectorySet; import org.gradle.api.plugins.JavaBasePlugin; 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.bundling.Jar; import org.gradle.api.tasks.compile.JavaCompile; /** * @author Andrea Di Giorgi */ public class JspCPlugin implements Plugin<Project> { public static final String COMPILE_JSP_TASK_NAME = "compileJSP"; public static final String CONFIGURATION_NAME = "jspC"; public static final String GENERATE_JSP_JAVA_TASK_NAME = "generateJSPJava"; public static final String TOOL_CONFIGURATION_NAME = "jspCTool"; @Override public void apply(Project project) { GradleUtil.applyPlugin(project, JavaPlugin.class); Configuration jspCConfiguration = _addConfigurationJspC(project); Configuration jspCToolConfiguration = _addConfigurationJspCTool( project); final CompileJSPTask generateJSPJavaTask = _addTaskGenerateJSPJava( project, jspCConfiguration, jspCToolConfiguration); _addTaskCompileJSP( generateJSPJavaTask, jspCConfiguration, jspCToolConfiguration); project.afterEvaluate( new Action<Project>() { @Override public void execute(Project project) { _addDependenciesJspC(project); } }); } private Configuration _addConfigurationJspC(Project project) { Configuration configuration = GradleUtil.addConfiguration( project, CONFIGURATION_NAME); configuration.setDescription( "Configures the classpath of the JSP compilation tasks."); configuration.setVisible(false); return configuration; } private Configuration _addConfigurationJspCTool(final Project project) { Configuration configuration = GradleUtil.addConfiguration( project, TOOL_CONFIGURATION_NAME); configuration.defaultDependencies( new Action<DependencySet>() { @Override public void execute(DependencySet dependencySet) { _addDependenciesJspCTool(project); } }); configuration.setDescription( "Configures Liferay Jasper JspC for this project."); configuration.setVisible(false); return configuration; } private void _addDependenciesJspC(Project project) { DependencyHandler dependencyHandler = project.getDependencies(); Jar jar = (Jar)GradleUtil.getTask(project, JavaPlugin.JAR_TASK_NAME); ConfigurableFileCollection configurableFileCollection = project.files( jar); configurableFileCollection.builtBy(jar); dependencyHandler.add(CONFIGURATION_NAME, configurableFileCollection); SourceSet sourceSet = GradleUtil.getSourceSet( project, SourceSet.MAIN_SOURCE_SET_NAME); dependencyHandler.add( CONFIGURATION_NAME, sourceSet.getCompileClasspath()); } private void _addDependenciesJspCTool(Project project) { GradleUtil.addDependency( project, TOOL_CONFIGURATION_NAME, "org.apache.ant", "ant", "1.9.4"); ModuleDependency moduleDependency = (ModuleDependency)GradleUtil.addDependency( project, TOOL_CONFIGURATION_NAME, "com.liferay", "com.liferay.jasper.jspc", "latest.release"); moduleDependency.exclude( Collections.singletonMap("group", "com.liferay.portal")); moduleDependency.exclude( Collections.singletonMap("group", "javax.servlet")); } private JavaCompile _addTaskCompileJSP( CompileJSPTask generateJSPJavaTask, Configuration jspCConfiguration, Configuration jspCToolConfiguration) { JavaCompile javaCompile = GradleUtil.addTask( generateJSPJavaTask.getProject(), COMPILE_JSP_TASK_NAME, JavaCompile.class); javaCompile.setClasspath(jspCToolConfiguration.plus(jspCConfiguration)); javaCompile.setDescription("Compile JSP files to check for errors."); javaCompile.setDestinationDir(javaCompile.getTemporaryDir()); javaCompile.setGroup(JavaBasePlugin.VERIFICATION_GROUP); javaCompile.setSource(generateJSPJavaTask.getOutputs()); return javaCompile; } private CompileJSPTask _addTaskGenerateJSPJava( Project project, Configuration jspCConfiguration, Configuration jspCToolConfiguration) { final CompileJSPTask compileJSPTask = GradleUtil.addTask( project, GENERATE_JSP_JAVA_TASK_NAME, CompileJSPTask.class); compileJSPTask.setClasspath(jspCToolConfiguration); compileJSPTask.setDescription( "Compiles JSP files to Java source files to check for errors."); compileJSPTask.setDestinationDir( new File(project.getBuildDir(), "jspc")); compileJSPTask.setJspCClasspath(jspCConfiguration); compileJSPTask.setWebAppDir( new Callable<File>() { @Override public File call() throws Exception { SourceSet sourceSet = GradleUtil.getSourceSet( compileJSPTask.getProject(), SourceSet.MAIN_SOURCE_SET_NAME); return _getSrcDir(sourceSet.getResources()); } }); PluginContainer pluginContainer = project.getPlugins(); pluginContainer.withType( WarPlugin.class, new Action<WarPlugin>() { @Override public void execute(WarPlugin warPlugin) { _configureTaskGenerateJSPJavaForWarPlugin(compileJSPTask); } }); return compileJSPTask; } private void _configureTaskGenerateJSPJavaForWarPlugin( final CompileJSPTask compileJSPTask) { compileJSPTask.setWebAppDir( new Callable<File>() { @Override public File call() throws Exception { WarPluginConvention warPluginConvention = GradleUtil.getConvention( compileJSPTask.getProject(), WarPluginConvention.class); return warPluginConvention.getWebAppDir(); } }); } private File _getSrcDir(SourceDirectorySet sourceDirectorySet) { Set<File> srcDirs = sourceDirectorySet.getSrcDirs(); Iterator<File> iterator = srcDirs.iterator(); return iterator.next(); } }