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

group = 'org.apache.freemarker.onlinetester'
version = "0.1-SNAPSHOT"

ext.jarName = "${project.name}-${project.version}"

apply from: "intellij.gradle"
apply from: "${rootDir}/dependencies.gradle"
apply plugin: 'maven'
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'project-report'
apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: "com.github.kt3k.coveralls"

project.sourceCompatibility = "1.8"
project.targetCompatibility = "1.8"

repositories {
    mavenCentral()
    maven {
        url "https://repository.apache.org/content/repositories/snapshots/"
    }
}

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.1"
        classpath "com.github.jengelman.gradle.plugins:shadow:1.2.4"
    }
}

configurations {
    rat
}

dependencies {
    compile libraries.dropwizard
    compile libraries.dropwizard_views
    compile libraries.dropwizard_views_freemarker
    compile libraries.dropwizard_assets
    compile libraries.dropwizard_bundles_redirect
    compile libraries.freemarker
    compile libraries.jackson_databind
    compile libraries.commonLangs
    compile libraries.findBugs

    testCompile libraries.dropwizard_testing
    testCompile libraries.junit
    testCompile libraries.mockito
    testCompile libraries.hamcrest
    testCompile libraries.jersey_grrizle
    
    rat libraries.rat
}

compileJava {
    options.compilerArgs << "-Werror"
}
compileTestJava {
    options.compilerArgs << "-Werror"
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.5'
}

jar {
    manifest {
        attributes 'Main-Class': 'org.apache.freemarker.onlinetester.dropwizard.FreeMarkerOnlineTester'
        attributes 'Implementation-Version': "$version"
    }
}

shadowJar {
    dependsOn jar
    baseName = "${jarName}"
    classifier = null
    version = null
    mergeServiceFiles()
}

// Log full exception information on failed tests, so we see it in the Travis log:
test.testLogging {
    showStackTraces true
    exceptionFormat "full"
}

jacocoTestReport {
    reports {
        xml.enabled  true
    }
}

task rat {
    doLast {
        ant.taskdef(
                name: 'ratReport', classname: 'org.apache.rat.anttasks.Report',
                classpath: configurations.rat.asPath)
        ant.ratReport(reportFile: "build/rat-report.txt") {
            fileset(dir: "", excludesfile: "rat-excludes")
        }
        project.logger.lifecycle('Rat reports were written into build/rat-report.txt')
    }
}

check.dependsOn jacocoTestReport
build.dependsOn shadowJar
