/** * 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.service.builder; import com.liferay.gradle.util.GradleUtil; import java.io.File; 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.file.SourceDirectorySet; import org.gradle.api.internal.plugins.osgi.OsgiHelper; 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.SourceSet; import org.gradle.api.tasks.TaskContainer; /** * @author Andrea Di Giorgi */ public class ServiceBuilderPlugin implements Plugin<Project> { public static final String BUILD_SERVICE_TASK_NAME = "buildService"; public static final String CONFIGURATION_NAME = "serviceBuilder"; @Override public void apply(Project project) { GradleUtil.applyPlugin(project, JavaPlugin.class); Configuration serviceBuilderConfiguration = addConfigurationServiceBuilder(project); addTaskBuildService(project); configureTasksBuildService(project, serviceBuilderConfiguration); } protected Configuration addConfigurationServiceBuilder( final Project project) { Configuration configuration = GradleUtil.addConfiguration( project, CONFIGURATION_NAME); configuration.setDescription( "Configures Liferay Service Builder for this project."); configuration.setVisible(false); GradleUtil.executeIfEmpty( configuration, new Action<Configuration>() { @Override public void execute(Configuration configuration) { addDependenciesServiceBuilder(project); } }); return configuration; } protected void addDependenciesServiceBuilder(Project project) { GradleUtil.addDependency( project, CONFIGURATION_NAME, "com.liferay", "com.liferay.portal.tools.service.builder", "latest.release"); } protected BuildServiceTask addTaskBuildService(final Project project) { final BuildServiceTask buildServiceTask = GradleUtil.addTask( project, BUILD_SERVICE_TASK_NAME, BuildServiceTask.class); buildServiceTask.setDescription("Runs Liferay Service Builder."); buildServiceTask.setGroup(BasePlugin.BUILD_GROUP); buildServiceTask.setHbmFile( new Callable<File>() { @Override public File call() throws Exception { File resourcesDir = getResourcesDir(project); String fileName = "META-INF/portlet-hbm.xml"; if (buildServiceTask.isOsgiModule()) { fileName = "META-INF/module-hbm.xml"; } return new File(resourcesDir, fileName); } }); buildServiceTask.setImplDir( new Callable<File>() { @Override public File call() throws Exception { return getJavaDir(project); } }); buildServiceTask.setInputFile("service.xml"); buildServiceTask.setModelHintsFile( new Callable<File>() { @Override public File call() throws Exception { File resourcesDir = getResourcesDir(project); return new File( resourcesDir, "META-INF/portlet-model-hints.xml"); } }); buildServiceTask.setPluginName( new Callable<String>() { @Override public String call() throws Exception { if (buildServiceTask.isOsgiModule()) { return ""; } return project.getName(); } }); buildServiceTask.setPropsUtil( new Callable<String>() { @Override public String call() throws Exception { if (buildServiceTask.isOsgiModule()) { String bundleSymbolicName = _osgiHelper.getBundleSymbolicName(project); return bundleSymbolicName + ".util.ServiceProps"; } return "com.liferay.util.service.ServiceProps"; } }); buildServiceTask.setResourcesDir( new Callable<File>() { @Override public File call() throws Exception { return getResourcesDir(project); } }); buildServiceTask.setSpringFile( new Callable<File>() { @Override public File call() throws Exception { File resourcesDir = getResourcesDir(project); String fileName = "META-INF/portlet-spring.xml"; if (buildServiceTask.isOsgiModule()) { fileName = "META-INF/spring/module-spring.xml"; } return new File(resourcesDir, fileName); } }); buildServiceTask.setSqlDir( new Callable<File>() { @Override public File call() throws Exception { File resourcesDir = getResourcesDir(project); return new File(resourcesDir, "META-INF/sql"); } }); PluginContainer pluginContainer = project.getPlugins(); pluginContainer.withType( WarPlugin.class, new Action<WarPlugin>() { @Override public void execute(WarPlugin warPlugin) { configureTaskBuildServiceForWarPlugin(buildServiceTask); } }); return buildServiceTask; } protected void configureTaskBuildServiceClasspath( BuildServiceTask buildServiceTask, Configuration serviceBuilderConfiguration) { buildServiceTask.setClasspath(serviceBuilderConfiguration); } protected void configureTaskBuildServiceForWarPlugin( final BuildServiceTask buildServiceTask) { buildServiceTask.setApiDir( new Callable<File>() { @Override public File call() throws Exception { return new File( getWebAppDir(buildServiceTask.getProject()), "WEB-INF/service"); } }); buildServiceTask.setInputFile( new Callable<File>() { @Override public File call() throws Exception { return new File( getWebAppDir(buildServiceTask.getProject()), "WEB-INF/service.xml"); } }); buildServiceTask.setSqlDir( new Callable<File>() { @Override public File call() throws Exception { return new File( getWebAppDir(buildServiceTask.getProject()), "WEB-INF/sql"); } }); } protected void configureTasksBuildService( Project project, final Configuration serviceBuilderConfiguration) { TaskContainer taskContainer = project.getTasks(); taskContainer.withType( BuildServiceTask.class, new Action<BuildServiceTask>() { @Override public void execute(BuildServiceTask buildServiceTask) { configureTaskBuildServiceClasspath( buildServiceTask, serviceBuilderConfiguration); } }); } protected File getJavaDir(Project project) { SourceSet sourceSet = GradleUtil.getSourceSet( project, SourceSet.MAIN_SOURCE_SET_NAME); return getSrcDir(sourceSet.getJava()); } protected File getResourcesDir(Project project) { SourceSet sourceSet = GradleUtil.getSourceSet( project, SourceSet.MAIN_SOURCE_SET_NAME); return getSrcDir(sourceSet.getResources()); } protected File getSrcDir(SourceDirectorySet sourceDirectorySet) { Set<File> srcDirs = sourceDirectorySet.getSrcDirs(); Iterator<File> iterator = srcDirs.iterator(); return iterator.next(); } protected File getWebAppDir(Project project) { WarPluginConvention warPluginConvention = GradleUtil.getConvention( project, WarPluginConvention.class); return warPluginConvention.getWebAppDir(); } private static final OsgiHelper _osgiHelper = new OsgiHelper(); }