/*
 * 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.
 */

try {
        
node('ubuntu') {
        def JAVA_JDK_14=tool name: 'JDK 14 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_14"
        def JAVA_JDK_13=tool name: 'JDK 13 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_13"
        def JAVA_JDK_12=tool name: 'JDK 12 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_12"
        def JAVA_JDK_11=tool name: 'JDK 11 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_11"      
        def JAVA_JDK_9=tool name: 'JDK 1.9 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_9"
        def JAVA_JDK_8=tool name: 'JDK 1.8 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_8"
        def JAVA_JDK_7=tool name: 'JDK 1.7 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_7"
        def JAVA_JDK_6=tool name: 'JDK 1.6 (latest)', type: 'hudson.model.JDK'
        echo "Testing with Java $JAVA_JDK_6"
        def MAVEN_3_LATEST=tool name: 'Maven 3 (latest)', type: 'hudson.tasks.Maven$MavenInstallation'
        echo "Testing with Maven $MAVEN_3_LATEST"
        def MAVEN_2_LATEST=tool name: 'Maven 2 (latest)', type: 'hudson.tasks.Maven$MavenInstallation'
        echo "Testing with Maven $MAVEN_2_LATEST"
        def ANT_LATEST=tool name: 'Ant (latest)', type: 'hudson.tasks.Ant$AntInstallation'
        echo "Testing with Ant $ANT_LATEST"
   
           stage('JAVA 14 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_14/bin","JAVA_HOME=$JAVA_JDK_14"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 14
        
        stage('JAVA 13 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_13/bin","JAVA_HOME=$JAVA_JDK_13"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 13
        
        stage('JAVA 12 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_12/bin","JAVA_HOME=$JAVA_JDK_12"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 12
        
        stage('JAVA 11 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_11/bin","JAVA_HOME=$JAVA_JDK_11"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 11
        
        stage('JAVA 1.9 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_9/bin","JAVA_HOME=$JAVA_JDK_9"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 1.9
        
        stage('JAVA 1.8 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_8/bin","JAVA_HOME=$JAVA_JDK_8"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 1.8
        
        stage('JAVA 1.7 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_7/bin","JAVA_HOME=$JAVA_JDK_7"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 1.7
        
        stage('JAVA 1.6 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_6/bin","JAVA_HOME=$JAVA_JDK_6"]) {
                sh "java -version"
                sh "javac -version"
                }
        } //end stage JAVA 1.6
        
        stage('MAVEN 3 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_8/bin","Path+MAVEN=$MAVEN_3_LATEST/bin","JAVA_HOME=$JAVA_JDK_8"]) {
                sh "mvn -version"
                }
        } //end stage MAVEN 3
        
                stage('MAVEN 2 (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_8/bin","Path+MAVEN=$MAVEN_2_LATEST/bin","JAVA_HOME=$JAVA_JDK_8"]) {
                sh "mvn -version"
                }
        } //end stage MAVEN 2
        
        stage('Ant (Latest) on Ubuntu'){
        withEnv(["Path+JDK=$JAVA_JDK_8/bin","Path+MAVEN=$MAVEN_3_LATEST/bin",
                 "Path+ANT=$ANT_LATEST/bin","JAVA_HOME=$JAVA_JDK_8","ANT_HOME=$ANT_LATEST"]) {
                sh "ant -version"
                }
        } //end stage ANT
        
    } // end node ubuntu
        
} // end try

catch (e) {
        echo 'Something went wrong'
        throw e
} // end catch

finally {
    node('ubuntu') {
        emailext body: "See ${env.BUILD_URL}", recipientProviders: [[$class: 'CulpritsRecipientProvider'], [$class: 'FailingTestSuspectsRecipientProvider'], [$class: 'FirstFailingBuildSuspectsRecipientProvider']], replyTo: 'users@infra.apache.org', subject: "${env.JOB_NAME} - build ${env.BUILD_DISPLAY_NAME} - ${currentBuild.result}", to: 'gmcdonald@apache.org'
    }
}
