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-dropwizard'),
        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-ocagent'),
        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-dropwizard'),
        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-ocagent'),
        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)
    })
}
