/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

buildRepo = 'https://github.com/apache/jspwiki'
buildJdk11 = 'jdk_11_latest'
buildJdk17 = 'jdk_17_latest'
buildJdk19 = 'jdk_19_latest'
buildMvn = 'maven_3_latest'
errMsg = ''

try {

    stage( 'build source' ) {
        parallel jdk11Build: {
            buildSonarAndDeployIfSnapshotWith( buildJdk11 )
        },
        jdk17Build: {
            buildWith( buildJdk17 )
        },
        jdk19Build: {
            // don't fail build if jdk-19 build doesn't succeed
            catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                buildWith( buildJdk19 )
            }
        }
    }

    if( env.BRANCH_NAME == 'master' ) {
        build wait: false, job: 'JSPWiki/site', parameters: [ text( name: 'version', value: 'master' ) ]
    }

    currentBuild.result = 'SUCCESS'

} catch( Exception err ) {
    currentBuild.result = 'FAILURE'
    echo err.message
    errMsg = '- ' + err.message
} finally {
    node( 'ubuntu' ) {
        if( currentBuild.result == null ) {
            currentBuild.result = 'ABORTED'
        }
        if( env.BRANCH_NAME == 'master' ) {
            emailext body: "See ${env.BUILD_URL} $errMsg",
                     replyTo: 'dev@jspwiki.apache.org',
                     to: 'commits@jspwiki.apache.org',
                     subject: "[${env.JOB_NAME}] build ${env.BUILD_DISPLAY_NAME} - ${currentBuild.result}"
        }
    }
}

def buildSonarAndDeployIfSnapshotWith( jdk ) {
    node( 'ubuntu' ) {
        stage( jdk ) {
            cleanWs()
            git url: buildRepo, poll: true
            withMaven( jdk: jdk, maven: buildMvn, publisherStrategy: 'EXPLICIT', options: [ jacocoPublisher(), junitPublisher() ] ) {
                sh "mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package org.jacoco:jacoco-maven-plugin:report -T 1C"
            }
            withMaven( jdk: buildJdk17, maven: buildMvn ) {
                withCredentials( [ string( credentialsId: 'sonarcloud-jspwiki', variable: 'SONAR_TOKEN' ) ] ) {
                    def sonarOptions = "-Dsonar.projectKey=jspwiki-builder -Dsonar.organization=apache -Dsonar.branch.name=${env.BRANCH_NAME} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=$SONAR_TOKEN"
                    echo 'Will use SonarQube instance at https://sonarcloud.io'
                    sh "mvn sonar:sonar $sonarOptions"
                }
            }
            def pom = readMavenPom( file: 'pom.xml' )
            if( pom.version.endsWith( '-SNAPSHOT' ) ) {
                withMaven( jdk: jdk, maven: buildMvn ) {
                    sh 'mvn deploy -Dmaven.test.skip=true'
                }
            }
        }
    }
}

def buildWith( jdk ) {
    node( 'ubuntu' ) {
        stage( jdk ) {
            cleanWs()
            git url: buildRepo, poll: true
            withMaven( jdk: jdk, maven: buildMvn, publisherStrategy: 'EXPLICIT' ) {
                sh 'mvn clean package -T 1C'
            }
        }
    }
}