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

io.sentry.android.gradle.autoinstall.AbstractInstallStrategy.kt Maven / Gradle / Ivy

package io.sentry.android.gradle.autoinstall

import io.sentry.android.gradle.util.SemVer
import io.sentry.android.gradle.util.debug
import io.sentry.android.gradle.util.info
import io.sentry.android.gradle.util.warn
import org.gradle.api.artifacts.ComponentMetadataContext
import org.gradle.api.artifacts.ComponentMetadataRule
import org.slf4j.Logger

abstract class AbstractInstallStrategy : ComponentMetadataRule {

    protected lateinit var logger: Logger

    protected abstract val sentryModuleId: String

    protected open val minSupportedThirdPartyVersion: SemVer? = null

    protected open val maxSupportedThirdPartyVersion: SemVer? = null

    protected open val minSupportedSentryVersion: SemVer = SemVer(0, 0, 0)

    protected open val maxSupportedSentryVersion: SemVer = SemVer(0, 0, 0)

    override fun execute(context: ComponentMetadataContext) {
        val autoInstallState = AutoInstallState.getInstance()
        if (!autoInstallState.enabled) {
            logger.info {
                "$sentryModuleId won't be installed because autoInstallation is disabled"
            }
            return
        }
        minSupportedThirdPartyVersion?.let {
            parseVersion(context.details.id.version)?.let { thirdPartySemVersion ->
                if (thirdPartySemVersion < it) {
                    logger.info {
                        "$sentryModuleId won't be installed because the current version is " +
                            "lower than the minimum supported version ($it)"
                    }
                    return
                }
            } ?: return
        }
        maxSupportedThirdPartyVersion?.let {
            parseVersion(context.details.id.version)?.let { thirdPartySemVersion ->
                if (thirdPartySemVersion > it) {
                    logger.info {
                        "$sentryModuleId won't be installed because the current version is " +
                            "higher than the maximum supported version ($it)"
                    }
                    return
                }
            } ?: return
        }

        if (minSupportedSentryVersion.major > 0) {
            try {
                val sentrySemVersion = SemVer.parse(autoInstallState.sentryVersion)
                if (sentrySemVersion < minSupportedSentryVersion) {
                    logger.warn {
                        "$sentryModuleId won't be installed because the current sentry version " +
                            "is lower than the minimum supported sentry version " +
                            "($minSupportedSentryVersion)"
                    }
                    return
                }
            } catch (ex: IllegalArgumentException) {
                logger.warn {
                    "$sentryModuleId won't be installed because the provided " +
                        "sentry version(${autoInstallState.sentryVersion}) could not be " +
                        "processed as a semantic version."
                }
                return
            }
        }

        if (maxSupportedSentryVersion.major > 0) {
            try {
                val sentrySemVersion = SemVer.parse(autoInstallState.sentryVersion)
                if (sentrySemVersion > maxSupportedSentryVersion) {
                    logger.debug {
                        "$sentryModuleId won't be installed because the current sentry version " +
                            "is higher than the maximum supported sentry version " +
                            "($maxSupportedSentryVersion)"
                    }
                    return
                }
            } catch (ex: IllegalArgumentException) {
                logger.warn {
                    "$sentryModuleId won't be installed because the provided " +
                        "sentry version(${autoInstallState.sentryVersion}) could not be " +
                        "processed as a semantic version."
                }
                return
            }
        }

        context.details.allVariants { metadata ->
            metadata.withDependencies { dependencies ->
                val sentryVersion = autoInstallState.sentryVersion
                dependencies.add("$SENTRY_GROUP:$sentryModuleId:$sentryVersion")

                logger.info {
                    "$sentryModuleId was successfully installed with version: $sentryVersion"
                }
            }
        }
    }

    private fun parseVersion(version: String): SemVer? {
        // older Spring versions ended in .RELEASE
        return parseVersionSafely(version.removeSuffix(".RELEASE"))
    }

    private fun parseVersionSafely(version: String): SemVer? {
        try {
            return SemVer.parse(version)
        } catch (t: Throwable) {
            logger.warn { "Unable to parse version $version as a semantic version." }
            return null
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy