plugins {
    id 'java-library'
}

dependencies {
    api project(':javacutil')
    api project(':checker-qual')

    // Node implements org.plumelib.util.UniqueId, so this dependency must be "api".
    api 'org.plumelib:plume-util:1.5.3'

    // External dependencies:
    // If you add an external dependency, you must shadow its packages both in the dataflow-shaded
    // artifact (see shadowJar block below) and also in checker.jar (see the comment in
    // ../build.gradle in the shadowJar block).
}

shadowJar {
    archiveFileName = "dataflow-shaded.jar"
    // Without this line, the Maven artifact will have the classifier "all".
    archiveClassifier = ''

    relocate ('org.checkerframework', 'org.checkerframework.shaded') {
        // Shade all Checker Framework packages, except for the dataflow qualifiers.
        exclude 'org.checkerframework.dataflow.qual.*'
    }

    // Relocate external dependencies
    relocate 'org.plume', "org.checkerframework.shaded.org.plume"
}

artifacts {
    archives shadowJar
}

task liveVariableTest(dependsOn: compileTestJava, group: 'Verification') {
    description 'Test the live variable analysis test for dataflow framework.'
    inputs.file('tests/live-variable/Expected.txt')
    inputs.file('tests/live-variable/Test.java')

    outputs.file('tests/live-variable/Out.txt')
    outputs.file('tests/live-variable/Test.class')

    delete('tests/live-variable/Out.txt')
    delete('tests/live-variable/Test.class')
    doLast {
        javaexec {
            workingDir = 'tests/live-variable'
            if (!JavaVersion.current().java9Compatible) {
                jvmArgs += "-Xbootclasspath/p:${configurations.javacJar.asPath}".toString()
            }
            classpath = sourceSets.test.runtimeClasspath
            classpath += sourceSets.test.output
            main = 'livevar.LiveVariable'
        }
        exec {
            workingDir = 'tests/live-variable'
            executable 'diff'
            args = ['-u', 'Expected.txt', 'Out.txt']
        }
    }
}

task issue3447Test(dependsOn: compileTestJava, group: 'Verification') {
    description 'Test issue 3447 test case for backward analysis.'
    inputs.file('tests/issue3447/Test.java')
    delete('tests/issue3447/Out.txt')
    delete('tests/issue3447/Test.class')
    doLast {
        javaexec {
            workingDir = 'tests/issue3447'
            if (!JavaVersion.current().java9Compatible) {
                jvmArgs += "-Xbootclasspath/p:${configurations.javacJar.asPath}".toString()
            }
            classpath = sourceSets.test.runtimeClasspath
            classpath += sourceSets.test.output

            main = 'livevar.LiveVariable'
        }
    }
}

apply from: rootProject.file("gradle-mvn-push.gradle")

/** Adds information to the publication for uploading the dataflow artifacts to Maven repositories. */
final dataflowPom(publication) {
    sharedPublicationConfiguration(publication)
    publication.from components.java
    // Information that is in all pom files is configured in checker-framework/gradle-mvn-push.gradle.
    publication.pom {
        name = 'Dataflow'
        description = 'Dataflow is a dataflow framework based on the javac compiler.'
        licenses {
            license {
                name = 'GNU General Public License, version 2 (GPL2), with the classpath exception'
                url = 'http://www.gnu.org/software/classpath/license.html'
                distribution = 'repo'
            }
        }
    }
}

/** Adds information to the publication for uploading the dataflow-shaded artifacts to Maven repositories. */
final dataflowShadedPom(publication) {
    sharedPublicationConfiguration(publication)

    publication.artifactId = 'dataflow-shaded'
    publication.pom {
        name = 'Dataflow (shaded)'
        description = 'dataflow-shaded is a dataflow framework based on the javac compiler.\n' +
                '\n' +
                'It differs from the org.checkerframework:dataflow artifact in two ways.\n' +
                'First, the packages in this artifact have been renamed to org.checkerframework.shaded.*.\n' +
                'Second, unlike the dataflow artifact, this artifact contains the dependencies it requires.'
        licenses {
            license {
                name = 'GNU General Public License, version 2 (GPL2), with the classpath exception'
                url = 'http://www.gnu.org/software/classpath/license.html'
                distribution = 'repo'
            }
        }
    }
}


publishing {
    publications {
        dataflow(MavenPublication) {
            dataflowPom it
        }

        dataflowShaded(MavenPublication) {
            dataflowShadedPom it

            artifact shadowJar
            artifact sourcesJar
            artifact javadocJar
        }
    }
}
signing {
    sign publishing.publications.dataflow
    sign publishing.publications.dataflowShaded
}
