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  *     http://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.gradle.api.plugins.JavaBasePlugin
025 import org.kordamp.gradle.plugin.AbstractKordampPlugin
026 import org.kordamp.gradle.plugin.base.BasePlugin
027 import org.kordamp.gradle.plugin.base.ProjectConfigurationExtension
028 
029 import static org.kordamp.gradle.PluginUtils.resolveEffectiveConfig
030 import static org.kordamp.gradle.plugin.base.BasePlugin.isRootProject
031 
032 /**
033  * Configures a {@code minpom} task.
034  * Calculates {@code pom.xml} and {@code pom.properties}.
035  * These files should be packaged under {@code /META-INF/maven}.
036 
037  @author Andres Almiray
038  @since 0.1.0
039  */
040 @CompileStatic
041 class MinPomPlugin extends AbstractKordampPlugin {
042     static final String MINPOM_TASK_NAME = 'minpom'
043 
044     Project project
045 
046     void apply(Project project) {
047         this.project = project
048 
049         if (isRootProject(project)) {
050             if (project.childProjects.size()) {
051                 project.childProjects.values().each {
052                     configureProject(it)
053                 }
054             else {
055                 configureProject(project)
056             }
057         else {
058             configureProject(project)
059         }
060     }
061 
062     static void applyIfMissing(Project project) {
063         if (!project.plugins.findPlugin(MinPomPlugin)) {
064             project.plugins.apply(MinPomPlugin)
065         }
066     }
067 
068     private void configureProject(Project project) {
069         if (hasBeenVisited(project)) {
070             return
071         }
072         setVisited(project, true)
073 
074         BasePlugin.applyIfMissing(project)
075 
076         project.afterEvaluate {
077             ProjectConfigurationExtension effectiveConfig = resolveEffectiveConfig(project)
078             setEnabled(effectiveConfig.minpom.enabled)
079 
080             if (!enabled) {
081                 return
082             }
083 
084             project.plugins.withType(JavaBasePlugin) {
085                 createMinPomTask(project)
086             }
087         }
088     }
089 
090     private void createMinPomTask(Project project) {
091         Task classesTask = project.tasks.findByName('classes')
092 
093         if (classesTask) {
094             project.tasks.register(MINPOM_TASK_NAME, MinpomTask,
095                 new Action<MinpomTask>() {
096                     @Override
097                     void execute(MinpomTask t) {
098                         t.dependsOn classesTask
099                         t.group = org.gradle.api.plugins.BasePlugin.BUILD_GROUP
100                         t.description = 'Generates a minimum POM file'
101                     }
102                 })
103         }
104     }
105 
106     static File resolveMinPomDestinationDir(Project project) {
107         project.file("${project.buildDir}/pom/maven")
108     }
109 }