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-dropwizard5'),
        project(':opencensus-contrib-exemplar-util'),
        project(':opencensus-contrib-grpc-metrics'),
        project(':opencensus-contrib-grpc-util'),
        project(':opencensus-contrib-http-jaxrs'),
        project(':opencensus-contrib-http-jetty-client'),
        project(':opencensus-contrib-http-servlet'),
        project(':opencensus-contrib-http-util'),
        project(':opencensus-contrib-log-correlation-stackdriver'),
        project(':opencensus-contrib-observability-ready-util'),
        project(':opencensus-contrib-resource-util'),
        project(':opencensus-contrib-spring'),
        project(':opencensus-contrib-spring-sleuth-v1x'),
        project(':opencensus-contrib-spring-starter'),
        project(':opencensus-contrib-zpages'),
        project(':opencensus-exporter-metrics-ocagent'),
        project(':opencensus-exporter-metrics-util'),
        project(':opencensus-exporter-trace-logging'),
        project(':opencensus-exporter-trace-elasticsearch'),
        project(':opencensus-exporter-trace-ocagent'),
        project(':opencensus-exporter-trace-stackdriver'),
        project(':opencensus-exporter-trace-zipkin'),
        project(':opencensus-exporter-trace-jaeger'),
        project(':opencensus-exporter-trace-util'),
        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-metrics'),
        project(':opencensus-contrib-grpc-util'),
        project(':opencensus-contrib-http-jaxrs'),
        project(':opencensus-contrib-http-jetty-client'),
        project(':opencensus-contrib-http-servlet'),
        project(':opencensus-contrib-http-util'),
        project(':opencensus-contrib-log-correlation-stackdriver'),
        project(':opencensus-contrib-observability-ready-util'),
        project(':opencensus-contrib-resource-util'),
        project(':opencensus-contrib-spring'),
        project(':opencensus-contrib-spring-sleuth-v1x'),
        project(':opencensus-contrib-spring-starter'),
        project(':opencensus-contrib-zpages'),
        project(':opencensus-exporter-metrics-ocagent'),
        project(':opencensus-exporter-metrics-util'),
        project(':opencensus-exporter-trace-logging'),
        project(':opencensus-exporter-trace-elasticsearch'),
        project(':opencensus-exporter-trace-ocagent'),
        project(':opencensus-exporter-trace-stackdriver'),
        project(':opencensus-exporter-trace-zipkin'),
        project(':opencensus-exporter-trace-jaeger'),
        project(':opencensus-exporter-trace-util'),
        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)
    })
}
