MinPomPlugin.groovy
001 /*
002  * SPDX-License-Identifier: Apache-2.0
003  *
004  * Copyright 2018-2019 Andres Almiray.
005  *
006  * Licensed under the Apache License, Version 2.0 (the "License");
007  * you may not use this file except in compliance with the License.
008  * You may obtain a copy of the License at
009  *
010  *     https://www.apache.org/licenses/LICENSE-2.0
011  *
012  * Unless required by applicable law or agreed to in writing, software
013  * distributed under the License is distributed on an "AS IS" BASIS,
014  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015  * See the License for the specific language governing permissions and
016  * limitations under the License.
017  */
018 package org.kordamp.gradle.plugin.minpom
019 
020 import groovy.transform.CompileStatic
021 import org.gradle.api.Action
022 import org.gradle.api.Project
023 import org.gradle.api.Task
024 import org.kordamp.gradle.plugin.AbstractKordampPlugin
025 import org.kordamp.gradle.plugin.base.BasePlugin
026 import org.kordamp.gradle.plugin.base.ProjectConfigurationExtension
027 
028 import static org.kordamp.gradle.PluginUtils.resolveEffectiveConfig
029 import static org.kordamp.gradle.plugin.base.BasePlugin.isRootProject
030 
031 /**
032  * Configures a {@code minpom} task.
033  * Calculates {@code pom.xml} and {@code pom.properties}.
034  * These files should be packaged under {@code /META-INF/maven}.
035 
036  @author Andres Almiray
037  @since 0.1.0
038  */
039 @CompileStatic
040 class MinPomPlugin extends AbstractKordampPlugin {
041     static final String MINPOM_TASK_NAME = 'minpom'
042 
043     Project project
044 
045     void apply(Project project) {
046         this.project = project
047 
048         if (isRootProject(project)) {
049             if (project.childProjects.size()) {
050                 project.childProjects.values().each {
051                     configureProject(it)
052                 }
053             else {
054                 configureProject(project)
055             }
056         else {
057             configureProject(project)
058         }
059     }
060 
061     static void applyIfMissing(Project project) {
062         if (!project.plugins.findPlugin(MinPomPlugin)) {
063             project.pluginManager.apply(MinPomPlugin)
064         }
065     }
066 
067     private void configureProject(Project project) {
068         if (hasBeenVisited(project)) {
069             return
070         }
071         setVisited(project, true)
072 
073         BasePlugin.applyIfMissing(project)
074 
075         project.afterEvaluate {
076             ProjectConfigurationExtension effectiveConfig = resolveEffectiveConfig(project)
077             setEnabled(effectiveConfig.minpom.enabled)
078 
079             if (!enabled) {
080                 return
081             }
082 
083             project.pluginManager.withPlugin('java-base') {
084                 createMinPomTask(project)
085             }
086         }
087     }
088 
089     private void createMinPomTask(Project project) {
090         Task classesTask = project.tasks.findByName('classes')
091 
092         if (classesTask) {
093             project.tasks.register(MINPOM_TASK_NAME, MinpomTask,
094                 new Action<MinpomTask>() {
095                     @Override
096                     void execute(MinpomTask t) {
097                         t.dependsOn classesTask
098                         t.group = org.gradle.api.plugins.BasePlugin.BUILD_GROUP
099                         t.description = 'Generates a minimum POM file.'
100                     }
101                 })
102         }
103     }
104 
105     static File resolveMinPomDestinationDir(Project project) {
106         project.file("${project.buildDir}/pom/maven")
107     }
108 }