description = "OpenCensus All"

def subprojects = [
        project(':opencensus-api'),
        project(':opencensus-impl-core'),
        project(':opencensus-impl'),
        project(':opencensus-impl-lite'),
        project(':opencensus-testing'),
        project(':opencensus-contrib-agent'),
        project(':opencensus-contrib-appengine-standard-util'),
        project(':opencensus-contrib-exemplar-util'),
        project(':opencensus-contrib-grpc-util'),
        project(':opencensus-contrib-grpc-metrics'),
        project(':opencensus-contrib-http-util'),
        project(':opencensus-contrib-log-correlation-log4j2'),
        project(':opencensus-contrib-log-correlation-stackdriver'),
        project(':opencensus-contrib-monitored-resource-util'),
        project(':opencensus-contrib-spring'),
        project(':opencensus-contrib-spring-sleuth-v1x'),
        project(':opencensus-contrib-zpages'),
        project(':opencensus-exporter-trace-logging'),
        project(':opencensus-exporter-trace-stackdriver'),
        project(':opencensus-exporter-trace-zipkin'),
        project(':opencensus-exporter-trace-jaeger'),
        project(':opencensus-exporter-stats-signalfx'),
        project(':opencensus-exporter-stats-stackdriver'),
        project(':opencensus-exporter-stats-prometheus'),
]

// A subset of subprojects for which we want to publish javadoc.
def subprojects_javadoc = [
        project(':opencensus-api'),
        project(':opencensus-testing'),
        project(':opencensus-contrib-agent'),
        project(':opencensus-contrib-appengine-standard-util'),
        project(':opencensus-contrib-exemplar-util'),
        project(':opencensus-contrib-grpc-util'),
        project(':opencensus-contrib-grpc-metrics'),
        project(':opencensus-contrib-http-util'),
        project(':opencensus-contrib-log-correlation-log4j2'),
        project(':opencensus-contrib-log-correlation-stackdriver'),
        project(':opencensus-contrib-monitored-resource-util'),
        project(':opencensus-contrib-spring'),
        project(':opencensus-contrib-spring-sleuth-v1x'),
        project(':opencensus-contrib-zpages'),
        project(':opencensus-exporter-trace-logging'),
        project(':opencensus-exporter-trace-stackdriver'),
        project(':opencensus-exporter-trace-zipkin'),
        project(':opencensus-exporter-trace-jaeger'),
        project(':opencensus-exporter-stats-signalfx'),
        project(':opencensus-exporter-stats-stackdriver'),
        project(':opencensus-exporter-stats-prometheus'),
]

for (subproject in rootProject.subprojects) {
    if (subproject == project) {
        continue
    }
    evaluationDependsOn(subproject.path)
}

dependencies {
    compile subprojects
}

javadoc {
    classpath = files(subprojects_javadoc.collect { subproject ->
        subproject.javadoc.classpath
    })
    for (subproject in subprojects_javadoc) {
        if (subproject == project) {
            continue;
        }
        source subproject.javadoc.source
        options.links subproject.javadoc.options.links.toArray(new String[0])
    }
    exclude 'io/opencensus/internal/**'
}

task jacocoMerge(type: JacocoMerge) {
    dependsOn(subprojects.jacocoTestReport.dependsOn)
    mustRunAfter(subprojects.jacocoTestReport.mustRunAfter)
    destinationFile = file("${buildDir}/jacoco/test.exec")
    executionData = files(subprojects.jacocoTestReport.executionData)
            .filter { f -> f.exists() }
}

jacocoTestReport {
    dependsOn(jacocoMerge)
    reports {
        xml.enabled = true
        html.enabled = true
    }

    additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
    sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
    classDirectories = files(subprojects.sourceSets.main.output)
    classDirectories = files(classDirectories.files.collect {
        fileTree(dir: it)
    })
}
