/*
 * Jakarta Validation API
 *
 * License: Apache License, Version 2.0
 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
 */

@Library('releng-pipeline') _

// Avoid running the pipeline on branch indexing
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
	print "INFO: Build skipped due to trigger being Branch Indexing"
	currentBuild.result = 'NOT_BUILT'
	return
}

Map settings() {
	switch (env.JDK_FOR_TEST) {
		case 'openjdk-jdk25-latest':
			return [
					additionalMavenArgs: ''
			]
		case 'openjdk-jdk21-latest':
			return [
					additionalMavenArgs: '',
			]
		case 'openjdk-jdk17-latest':
			return [
					additionalMavenArgs: '-Dbuild.require.jdk21=false',
			]
		default:
			return [:]
	}
}

pipeline {
	agent none
	triggers {
		cron '@midnight'
	}
	options {
		buildDiscarder logRotator(daysToKeepStr: '10', numToKeepStr: '3')
		disableConcurrentBuilds(abortPrevious: true)
		overrideIndexTriggers(false)
	}
	stages {
		stage('Test') {
			matrix {
				axes {
					axis {
						name 'JDK_FOR_TEST'
						values 'openjdk-jdk25-latest', 'openjdk-jdk21-latest', 'openjdk-jdk17-latest'
					}
					axis {
						name 'JAKARTA_VALIDATION_IMPLEMENTATION'
						values 'hibernate-validator', 'bval'
					}
				}
				stages {
					stage('Run TCK') {
						agent {
							label 'basic'
						}
						stages {
							stage('Prebuild TCK') {
								steps {
									withMaven(jdk: env.JDK_FOR_TEST, maven: 'apache-maven-3.9.11',
											mavenLocalRepo: env.WORKSPACE_TMP + '/.m2repository',
											options: [
													artifactsPublisher(disabled: true),
													junitPublisher(disabled: true)
											]) {
										script {
											def extraArgs = settings().additionalMavenArgs
											sh "./mvnw clean install -DskipTests -Denforcer.skip=true -Psnapshots ${extraArgs}"
										}
									}
								}
							}
							stage('TCK Standalone') {
								steps {
									withMaven(jdk: env.JDK_FOR_TEST, maven: 'apache-maven-3.9.11',
											mavenLocalRepo: env.WORKSPACE_TMP + '/.m2repository',
											options: [
													artifactsPublisher(disabled: true),
													junitPublisher(disabled: true)
											]) {
										script {
											def extraArgs = settings().additionalMavenArgs
											def tckVersion = sh(script: "./mvnw org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -q -DforceStdout ${extraArgs}", returnStdout: true).trim()
											sh "./mvnw clean verify -f setup-examples/maven/pom-local.xml -Dtck.version=${tckVersion} -P${env.JAKARTA_VALIDATION_IMPLEMENTATION} -Psnapshots ${extraArgs}"
										}
									}
								}
							}
							stage('TCK In Container') {
								when {
									expression {
										return env.JAKARTA_VALIDATION_IMPLEMENTATION == "hibernate-validator"
									}
								}
								steps {
									withMaven(jdk: env.JDK_FOR_TEST, maven: 'apache-maven-3.9.11',
											mavenLocalRepo: env.WORKSPACE_TMP + '/.m2repository',
											options: [
													artifactsPublisher(disabled: true),
													junitPublisher(disabled: true)
											]) {
										script {
											def extraArgs = settings().additionalMavenArgs
											def tckVersion = sh(script: "./mvnw org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -q -DforceStdout ${extraArgs}", returnStdout: true).trim()
											echo "Preparing the WildFly server as a container..."
											sh "./mvnw clean package -f setup-examples/maven/pom.xml -Dtck.version=${tckVersion} -Pprepare-server -Psnapshots ${extraArgs}"

											def serverLocation = sh(script: 'echo $(pwd)/setup-examples/maven/target/wildfly-patched/wildfly-preview-37.0.1.Final', returnStdout: true).trim()
											echo "Running in-container tests..."
											sh "./mvnw verify -f setup-examples/maven/pom.xml -Dtck.version=${tckVersion} -Pin-container-test -Psnapshots -Dcontainer.home=${serverLocation} ${extraArgs}"
										}
									}
								}
							}
							stage('TCK Sigtest') {
								steps {
									withMaven(jdk: env.JDK_FOR_TEST, maven: 'apache-maven-3.9.11',
											mavenLocalRepo: env.WORKSPACE_TMP + '/.m2repository',
											options: [
													artifactsPublisher(disabled: true),
													junitPublisher(disabled: true)
											]) {
										script {
											def extraArgs = settings().additionalMavenArgs
											def tckVersion = sh(script: "./mvnw org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version -q -DforceStdout ${extraArgs}", returnStdout: true).trim()
											def sigFileLocation = sh(script: 'echo $(pwd)/tests/target/classes/validation-api-jdk17.sig', returnStdout: true).trim()
											sh "./mvnw clean verify -f setup-examples/maven/pom-local.xml -Dtck.version=${tckVersion} -P${env.JAKARTA_VALIDATION_IMPLEMENTATION} -Psigtest -Psnapshots -Dsigfile-location=$sigFileLocation ${extraArgs}"
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
