diff --git a/src/main/kotlin/com/jaredsburrows/license/BaseLicenseReportTask.kt b/src/main/kotlin/com/jaredsburrows/license/BaseLicenseReportTask.kt new file mode 100644 index 00000000..118bb18a --- /dev/null +++ b/src/main/kotlin/com/jaredsburrows/license/BaseLicenseReportTask.kt @@ -0,0 +1,49 @@ +package com.jaredsburrows.license + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputFile +import java.io.File + +/** A [org.gradle.api.Task] that is common for both Java and Android projects. */ +open class BaseLicenseReportTask : DefaultTask() { + + // Task annotations cannot be internal + @OutputFile var csvFile: File + @OutputFile var htmlFile: File + @OutputFile var jsonFile: File + @Input var generateCsvReport = false + @Input var generateHtmlReport = false + @Input var generateJsonReport = false + @Input var copyCsvReportToAssets = false + @Input var copyHtmlReportToAssets = false + @Input var copyJsonReportToAssets = false + private var outputPath: String + + init { + // From DefaultTask + description = "Outputs licenses report for $name." + group = "Reporting" + + // Customizing internal task options + outputPath = "${project.buildDir}/reports/licenses/".replace('/', File.separatorChar) + csvFile = File(outputPath, "$name$CSV_EXT") + htmlFile = File(outputPath, "$name$HTML_EXT") + jsonFile = File(outputPath, "$name$JSON_EXT") + + // Customizing internal task options from extension + val extension = project.extensions.getByType(LicenseReportExtension::class.java) + generateCsvReport = extension.generateCsvReport + generateHtmlReport = extension.generateHtmlReport + generateJsonReport = extension.generateJsonReport + copyCsvReportToAssets = extension.copyCsvReportToAssets + copyHtmlReportToAssets = extension.copyHtmlReportToAssets + copyJsonReportToAssets = extension.copyJsonReportToAssets + } + + internal companion object { + const val CSV_EXT = ".csv" + const val HTML_EXT = ".html" + const val JSON_EXT = ".json" + } +} diff --git a/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt b/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt index b0652646..16aa5e1d 100644 --- a/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt +++ b/src/main/kotlin/com/jaredsburrows/license/LicensePlugin.kt @@ -11,106 +11,63 @@ import com.android.build.gradle.api.BaseVariant import org.gradle.api.DomainObjectSet import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.plugins.ExtensionContainer import org.gradle.api.plugins.JavaPlugin -import java.io.File import java.util.Locale -import kotlin.reflect.KClass /** A [Plugin] which grabs the POM.xml files from maven dependencies. */ class LicensePlugin : Plugin { override fun apply(project: Project) { - val extension = project.extensions.create("licenseReport", LicenseReportExtension::class.java) + project.extensions.add("licenseReport", LicenseReportExtension::class.java) project.plugins.all { when (it) { - is JavaPlugin -> configureJavaProject(project, extension) + is JavaPlugin -> project.configureJavaProject() is FeaturePlugin -> { - project.extensions[FeatureExtension::class].run { - configureAndroidProject(project, extension, featureVariants) - configureAndroidProject(project, extension, libraryVariants) + project.extensions.getByType(FeatureExtension::class.java).run { + project.configureAndroidProject(featureVariants) + project.configureAndroidProject(libraryVariants) } } is LibraryPlugin -> { - project.extensions[LibraryExtension::class].run { - configureAndroidProject(project, extension, libraryVariants) + project.extensions.getByType(LibraryExtension::class.java).run { + project.configureAndroidProject(libraryVariants) } } is AppPlugin -> { - project.extensions[AppExtension::class].run { - configureAndroidProject(project, extension, applicationVariants) + project.extensions.getByType(AppExtension::class.java).run { + project.configureAndroidProject(applicationVariants) } } } } } +} - /** Configure for Java projects. */ - private fun configureJavaProject(project: Project, extension: LicenseReportExtension) { - val taskName = "licenseReport" - val path = "${project.buildDir}/reports/licenses/$taskName".replace('/', File.separatorChar) - - // Create tasks - project.tasks.register(taskName, LicenseReportTask::class.java) { - it.description = "Outputs licenses report." - it.group = "Reporting" - it.csvFile = File(path + LicenseReportTask.CSV_EXT) - it.htmlFile = File(path + LicenseReportTask.HTML_EXT) - it.jsonFile = File(path + LicenseReportTask.JSON_EXT) - it.generateCsvReport = extension.generateCsvReport - it.generateHtmlReport = extension.generateHtmlReport - it.generateJsonReport = extension.generateJsonReport - it.copyCsvReportToAssets = false - it.copyHtmlReportToAssets = false - it.copyJsonReportToAssets = false - } - } - - /** Configure for Android projects. */ - private fun configureAndroidProject( - project: Project, - extension: LicenseReportExtension, - variants: DomainObjectSet? = null - ) { - // Configure tasks for all variants - variants?.all { variant -> - val name = variant.name.replaceFirstChar { - if (it.isLowerCase()) { - it.titlecase(Locale.getDefault()) - } else { - it.toString() - } - } - val taskName = "license${name}Report" - val path = "${project.buildDir}/reports/licenses/$taskName".replace('/', File.separatorChar) +/** Configure for Java projects. */ +private fun Project.configureJavaProject() { + tasks.register("licenseReport", LicenseReportTask::class.java) +} - // Create tasks based on variant - project.tasks.register(taskName, LicenseReportTask::class.java) { - it.description = "Outputs licenses report for $name variant." - it.group = "Reporting" - it.csvFile = File(path + LicenseReportTask.CSV_EXT) - it.htmlFile = File(path + LicenseReportTask.HTML_EXT) - it.jsonFile = File(path + LicenseReportTask.JSON_EXT) - it.generateCsvReport = extension.generateCsvReport - it.generateHtmlReport = extension.generateHtmlReport - it.generateJsonReport = extension.generateJsonReport - it.copyCsvReportToAssets = extension.copyCsvReportToAssets - it.copyHtmlReportToAssets = extension.copyHtmlReportToAssets - it.copyJsonReportToAssets = extension.copyJsonReportToAssets - it.assetDirs = (project.extensions.getByName("android") as BaseExtension) - .sourceSets - .getByName("main") - .assets - .srcDirs - .toList() - it.buildType = variant.buildType.name - it.variantName = variant.name - it.productFlavors = variant.productFlavors +/** Configure for Android projects. */ +private fun Project.configureAndroidProject(variants: DomainObjectSet? = null) { + // Configure tasks for all variants + variants?.all { variant -> + val name = variant.name.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.getDefault()) + } else { + it.toString() } } - } - private operator fun ExtensionContainer.get(type: KClass): T { - return getByType(type.java) + tasks.register("license${name}Report", LicenseReportTask::class.java) { + it.assetDirs = (extensions.getByName("android") as BaseExtension) + .sourceSets + .getByName("main") + .assets + .srcDirs + .toList() + it.variantName = variant.name + } } } diff --git a/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt b/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt index 8fda984e..7269850e 100644 --- a/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt +++ b/src/main/kotlin/com/jaredsburrows/license/LicenseReportTask.kt @@ -1,6 +1,5 @@ package com.jaredsburrows.license -import com.android.builder.model.ProductFlavor import com.jaredsburrows.license.internal.ConsoleRenderer import com.jaredsburrows.license.internal.pom.Developer import com.jaredsburrows.license.internal.pom.License @@ -12,8 +11,6 @@ import groovy.namespace.QName import groovy.util.Node import groovy.util.NodeList import groovy.xml.XmlParser -import org.gradle.api.DefaultTask -import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency @@ -21,7 +18,6 @@ import org.gradle.api.logging.LogLevel import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import java.io.File import java.net.URI @@ -29,31 +25,19 @@ import java.net.URL import java.util.Locale import java.util.UUID -/** A [Task] that creates HTML and JSON reports of the current projects dependencies. */ -internal open class LicenseReportTask : DefaultTask() { // tasks can't be final +/** A [org.gradle.api.Task] that creates HTML and JSON reports of the current projects dependencies. */ +internal open class LicenseReportTask : BaseLicenseReportTask() { // tasks can't be final @Internal var projects = mutableListOf() @Input var assetDirs = emptyList() - @Input var generateCsvReport = false - @Input var generateHtmlReport = false - @Input var generateJsonReport = false - @Input var copyCsvReportToAssets = false - @Input var copyHtmlReportToAssets = false - @Input var copyJsonReportToAssets = false - - @Optional @Input - var buildType: String? = null @Optional @Input var variantName: String? = null - @Internal var productFlavors = listOf() - @OutputFile lateinit var csvFile: File - @OutputFile lateinit var htmlFile: File - @OutputFile lateinit var jsonFile: File private var pomConfiguration = "poms" private var tempPomConfiguration = "tempPoms" - @TaskAction fun licenseReport() { + @TaskAction + fun licenseReport() { setupEnvironment() initDependencies() generatePOMInfo() @@ -113,7 +97,7 @@ internal open class LicenseReportTask : DefaultTask() { // tasks can't be final } } - // Iterate through all the configurations's dependencies + // Iterate through all the configuration's dependencies configurationSet.forEach { configuration -> if (configuration.isCanBeResolved) { val allDeps = configuration.resolvedConfiguration.lenientConfiguration.allModuleDependencies @@ -507,8 +491,5 @@ internal open class LicenseReportTask : DefaultTask() { // tasks can't be final private const val APACHE_LICENSE_NAME = "The Apache Software License" private const val APACHE_LICENSE_URL = "http://www.apache.org/licenses/LICENSE-2.0.txt" private const val OPEN_SOURCE_LICENSES = "open_source_licenses" - const val CSV_EXT = ".csv" - const val HTML_EXT = ".html" - const val JSON_EXT = ".json" } }