diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/ArchiveFileFinder.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/ArchiveFileFinder.kt new file mode 100644 index 00000000..6cddba35 --- /dev/null +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/ArchiveFileFinder.kt @@ -0,0 +1,11 @@ +package com.beust.kobalt.plugin.packaging + +import com.beust.kobalt.api.KobaltContext +import com.beust.kobalt.api.Project +import com.beust.kobalt.archive.Zip +import com.beust.kobalt.misc.IncludedFile + +interface ArchiveFileFinder { + fun findIncludedFiles(project: Project, context: KobaltContext, zip: Zip) : List +} + diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt index aeef361c..e2383e50 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/JarGenerator.kt @@ -4,9 +4,11 @@ import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.archive.Archives import com.beust.kobalt.archive.Jar +import com.beust.kobalt.archive.Zip import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.maven.aether.Scope import com.beust.kobalt.misc.* +import com.beust.kobalt.plugin.packaging.ArchiveFileFinder import com.google.inject.Inject import java.io.File import java.io.FileInputStream @@ -15,9 +17,10 @@ import java.nio.file.Paths import java.util.jar.JarOutputStream import java.util.jar.Manifest -class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) { +class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) : ArchiveFileFinder { companion object { - fun findIncludedFiles(directory: String, files: List, excludes: List) + fun findIncludedFiles(directory: String, files: List, excludes: List, + throwOnError: Boolean = true) : List { val result = arrayListOf() files.forEach { includedFile -> @@ -27,7 +30,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) if (File(directory, fromPath).exists()) { spec.toFiles(directory, fromPath).forEach { file -> val fullFile = File(KFiles.joinDir(directory, fromPath, file.path)) - if (! fullFile.exists()) { + if (! fullFile.exists() && throwOnError) { throw AssertionError("File should exist: $fullFile") } @@ -52,7 +55,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) } } - fun findIncludedFiles(project: Project, context: KobaltContext, jar: Jar) : List { + override fun findIncludedFiles(project: Project, context: KobaltContext, jar: Zip) : List { // // Add all the applicable files for the current project // @@ -86,7 +89,7 @@ class JarGenerator @Inject constructor(val dependencyManager: DependencyManager) // // The user specified an include, just use it verbatim // - val includedFiles = findIncludedFiles(project.directory, jar.includedFiles, jar.excludes) + val includedFiles = findIncludedFiles(project.directory, jar.includedFiles, jar.excludes, false) result.addAll(includedFiles) } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Jar.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Jar.kt index f8a47848..80a7bd1a 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Jar.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Jar.kt @@ -8,7 +8,7 @@ import com.beust.kobalt.api.annotation.Directive */ open class Jar(override val project: Project, override var name : String = Archives.defaultArchiveName(project) + ".jar", - var fatJar: Boolean = false) : Zip(project, name), AttributeHolder { + override var fatJar: Boolean = false) : Zip(project, name, fatJar), AttributeHolder { @Directive fun manifest(init: Manifest.(p: Manifest) -> Unit) : Manifest { val m = Manifest(this) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Zip.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Zip.kt index 61237291..22b5809d 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Zip.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/archive/Zip.kt @@ -8,7 +8,8 @@ import com.beust.kobalt.misc.From import com.beust.kobalt.misc.IncludedFile import com.beust.kobalt.misc.To -open class Zip(open val project: Project, open var name: String = Archives.defaultArchiveName(project) + ".zip") { +open class Zip(open val project: Project, open var name: String = Archives.defaultArchiveName(project) + ".zip", + open var fatJar: Boolean = false) { val excludes = arrayListOf() @Directive diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt index 0518fed6..ba04971e 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/PackagingPlugin.kt @@ -11,7 +11,9 @@ import com.beust.kobalt.internal.IncrementalManager import com.beust.kobalt.internal.JvmCompilerPlugin import com.beust.kobalt.internal.ParallelLogger import com.beust.kobalt.maven.DependencyManager +import com.beust.kobalt.maven.Md5 import com.beust.kobalt.maven.PomGenerator +import com.beust.kobalt.misc.IncludedFile import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.KobaltExecutors import java.io.File @@ -68,6 +70,34 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana * skipped. */ override fun assemble(project: Project, context: KobaltContext) : IncrementalTaskInfo { + val allArchivers = packages.filter { it.project.name == project.name } + + if (false) { + // Work in progress + val allIncludedFiles = arrayListOf() + val zipToFiles = hashMapOf>() + allArchivers.forEach { packageConfig -> + listOf(packageConfig.jars, packageConfig.wars, packageConfig.zips).forEach { archives -> + archives.forEach { + val files = jarGenerator.findIncludedFiles(packageConfig.project, context, it) + allIncludedFiles.addAll(files) + zipToFiles[it.name] = files + } + } + } + val allFiles = allIncludedFiles.fold(arrayListOf()) { files, includedFile: IncludedFile -> + val foundFiles = includedFile.allFromFiles(project.directory) + val absFiles = foundFiles.map { + File(KFiles.joinDir(project.directory, includedFile.from, it.path)) + } + files.addAll(absFiles) + files + } + + val md5 = Md5.toMd5Directories(allFiles) + println("MD5 is: " + md5) + } + return IncrementalTaskInfo( { null }, { null }, @@ -75,7 +105,7 @@ class PackagingPlugin @Inject constructor(val dependencyManager : DependencyMana try { project.projectProperties.put(Archives.JAR_NAME, context.variant.archiveName(project, null, ".jar")) - packages.filter { it.project.name == project.name }.forEach { packageConfig -> + allArchivers.forEach { packageConfig -> packageConfig.jars.forEach { jarGenerator.generateJar(packageConfig.project, context, it) } packageConfig.wars.forEach { warGenerator.generateWar(packageConfig.project, context, it) } packageConfig.zips.forEach { zipGenerator.generateZip(packageConfig.project, context, it) } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/WarGenerator.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/WarGenerator.kt index 8ecafab1..1bce23eb 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/WarGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/WarGenerator.kt @@ -7,6 +7,7 @@ import com.beust.kobalt.api.KobaltContext import com.beust.kobalt.api.Project import com.beust.kobalt.archive.Archives import com.beust.kobalt.archive.War +import com.beust.kobalt.archive.Zip import com.beust.kobalt.internal.ParallelLogger import com.beust.kobalt.maven.DependencyManager import com.beust.kobalt.misc.From @@ -19,7 +20,8 @@ import java.io.OutputStream import java.nio.file.Paths import java.util.jar.JarOutputStream -class WarGenerator @Inject constructor(val dependencyManager: DependencyManager, val kobaltLog: ParallelLogger) { +class WarGenerator @Inject constructor(val dependencyManager: DependencyManager, val kobaltLog: ParallelLogger) + : ArchiveFileFinder { companion object { val WEB_INF = "WEB-INF" @@ -27,7 +29,7 @@ class WarGenerator @Inject constructor(val dependencyManager: DependencyManager, val LIB = "$WEB_INF/lib" } - fun findIncludedFiles(project: Project, context: KobaltContext, war: War) : List { + override fun findIncludedFiles(project: Project, context: KobaltContext, war: Zip) : List { // // src/main/web app and classes // diff --git a/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt b/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt index fed784a0..4427892b 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/packaging/ZipGenerator.kt @@ -7,11 +7,17 @@ import com.beust.kobalt.archive.Archives import com.beust.kobalt.archive.Zip import com.beust.kobalt.internal.ParallelLogger import com.beust.kobalt.maven.DependencyManager +import com.beust.kobalt.misc.IncludedFile import com.google.inject.Inject -class ZipGenerator @Inject constructor(val dependencyManager: DependencyManager, val kobaltLog: ParallelLogger) { +class ZipGenerator @Inject constructor(val dependencyManager: DependencyManager, val kobaltLog: ParallelLogger) + : ArchiveFileFinder { + override fun findIncludedFiles(project: Project, context: KobaltContext, zip: Zip): List { + return JarGenerator.findIncludedFiles(project.directory, zip.includedFiles, zip.excludes) + } + fun generateZip(project: Project, context: KobaltContext, zip: Zip) { - val allFiles = JarGenerator.findIncludedFiles(project.directory, zip.includedFiles, zip.excludes) + val allFiles = findIncludedFiles(project, context, zip) Archives.generateArchive(project, context, zip.name, ".zip", allFiles) } }