All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.pixee.maven.operator.CheckParentPackaging.kt Maven / Gradle / Ivy

package io.github.pixee.maven.operator

import io.github.pixee.maven.operator.Util.selectXPathNodes
import org.dom4j.Element
import org.dom4j.Text

/**
 * Guard Command Singleton use to validate required parameters
 */
val CheckParentPackaging = object : AbstractCommand() {
    fun packagingTypePredicate(d: POMDocument, packagingType: String): Boolean {
        val elementText =
            d.pomDocument.rootElement.selectXPathNodes("/m:project/m:packaging/text()")
                .firstOrNull()

        if (elementText is Text) {
            return elementText.text.equals(packagingType)
        }

        return false
    }

    override fun execute(pm: ProjectModel): Boolean {
        val wrongParentPoms = pm.parentPomFiles.filterNot { packagingTypePredicate(it, "pom") }

        if (wrongParentPoms.isNotEmpty()) {
            throw WrongDependencyTypeException("wrong packaging type for parentPom")
        }

        if (pm.parentPomFiles.isNotEmpty()) {
            // check main pom file has a inheritance to one of the members listed
            if (!hasValidParentAndPackaging(pm.pomFile)) {
                throw WrongDependencyTypeException("invalid parent/packaging combo for main pomfile")
            }
        }

        // todo: test a->b->c

        return false
    }

    private fun hasValidParentAndPackaging(pomFile: POMDocument): Boolean {
        val parentNode = pomFile.pomDocument.rootElement.selectXPathNodes("/m:project/m:parent")
            .firstOrNull() as Element? ?: return false

        val packagingText =
            (pomFile.pomDocument.rootElement.selectXPathNodes("/m:project/m:packaging/text()")
                .firstOrNull() as Text?)?.text ?: "jar"

        @Suppress("UnnecessaryVariable") val validPackagingType = packagingText.endsWith("ar")

        return validPackagingType
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy