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

// See build_rules.gradle for documentation on default build tasks
// and properties that are enabled in addition to natures
// that can be applied to configure a project for certain common
// tasks.

apply from: project(":").file("build_rules.gradle")

// These versions are defined here because they represent
// a dependency version which should match across multiple
// Maven artifacts.
def google_cloud_bigdataoss_version = "1.4.5"
def bigtable_version = "1.0.0"
def bigtable_proto_version = "1.0.0-pre3"
def google_clients_version = "1.22.0"
def google_auth_version = "0.7.1"
def grpc_version = "1.2.0"
def protobuf_version = "3.2.0"
def guava_version = "20.0"
def netty_version = "4.1.8.Final"
def grpc_google_common_protos = "0.1.9"
def hamcrest_version = "1.3"
def hadoop_version = "2.7.3"
def jackson_version = "2.8.9"
def spark_version = "2.2.1"
def pubsub_grpc_version = "0.1.18"
def apex_core_version = "3.6.0"
def apex_malhar_version = "3.4.0"
def postgres_version = "9.4.1212.jre7"

// A map of maps containing common libraries used per language. To use:
// dependencies {
//   shadow library.java.slf4j_api
// }
ext.library = [
  java: [
    activemq_amqp: "org.apache.activemq:activemq-amqp:5.13.1",
    activemq_broker: "org.apache.activemq:activemq-broker:5.13.1",
    activemq_client: "org.apache.activemq:activemq-client:5.13.1",
    activemq_jaas: "org.apache.activemq:activemq-jaas:5.13.1",
    activemq_junit: "org.apache.activemq.tooling:activemq-junit:5.13.1",
    activemq_kahadb_store: "org.apache.activemq:activemq-kahadb-store:5.13.1",
    activemq_mqtt: "org.apache.activemq:activemq-mqtt:5.13.1",
    apex_common: "org.apache.apex:apex-common:$apex_core_version",
    apex_engine: "org.apache.apex:apex-engine:$apex_core_version",
    args4j: "args4j:args4j:2.33",
    avro: "org.apache.avro:avro:1.8.2",
    bigdataoss_gcsio: "com.google.cloud.bigdataoss:gcsio:$google_cloud_bigdataoss_version",
    bigdataoss_util: "com.google.cloud.bigdataoss:util:$google_cloud_bigdataoss_version",
    bigtable_client_core: "com.google.cloud.bigtable:bigtable-client-core:$bigtable_version",
    bigtable_protos: "com.google.cloud.bigtable:bigtable-protos:$bigtable_proto_version",
    byte_buddy: "net.bytebuddy:byte-buddy:1.7.10",
    commons_compress: "org.apache.commons:commons-compress:1.14",
    commons_csv: "org.apache.commons:commons-csv:1.4",
    commons_io_1x: "commons-io:commons-io:1.3.2",
    commons_io_2x: "commons-io:commons-io:2.5",
    commons_lang3: "org.apache.commons:commons-lang3:3.6",
    commons_text: "org.apache.commons:commons-text:1.1",
    datastore_v1_proto_client: "com.google.cloud.datastore:datastore-v1-proto-client:1.4.0",
    datastore_v1_protos: "com.google.cloud.datastore:datastore-v1-protos:1.3.0",
    error_prone_annotations: "com.google.errorprone:error_prone_annotations:2.0.15",
    findbugs_annotations: "com.github.stephenc.findbugs:findbugs-annotations:1.3.9-1",
    findbugs_jsr305: "com.google.code.findbugs:jsr305:3.0.1",
    gax_grpc: "com.google.api:gax-grpc:0.20.0",
    google_api_client: "com.google.api-client:google-api-client:$google_clients_version",
    google_api_client_jackson2: "com.google.api-client:google-api-client-jackson2:$google_clients_version",
    google_api_client_java6: "com.google.api-client:google-api-client-java6:$google_clients_version",
    google_api_common: "com.google.api:api-common:1.0.0-rc2",
    google_api_services_bigquery: "com.google.apis:google-api-services-bigquery:v2-rev374-$google_clients_version",
    google_api_services_clouddebugger: "com.google.apis:google-api-services-clouddebugger:v2-rev8-$google_clients_version",
    google_api_services_cloudresourcemanager: "com.google.apis:google-api-services-cloudresourcemanager:v1-rev6-$google_clients_version",
    google_api_services_dataflow: "com.google.apis:google-api-services-dataflow:v1b3-rev221-$google_clients_version",
    google_api_services_pubsub: "com.google.apis:google-api-services-pubsub:v1-rev10-$google_clients_version",
    google_api_services_storage: "com.google.apis:google-api-services-storage:v1-rev71-$google_clients_version",
    google_auth_library_credentials: "com.google.auth:google-auth-library-credentials:$google_auth_version",
    google_auth_library_oauth2_http: "com.google.auth:google-auth-library-oauth2-http:$google_auth_version",
    google_cloud_core: "com.google.cloud:google-cloud-core:1.0.2",
    google_cloud_core_grpc: "com.google.cloud:google-cloud-core-grpc:$grpc_version",
    google_cloud_dataflow_java_proto_library_all: "com.google.cloud.dataflow:google-cloud-dataflow-java-proto-library-all:0.5.160304",
    google_cloud_spanner: "com.google.cloud:google-cloud-spanner:0.20.0b-beta",
    google_http_client: "com.google.http-client:google-http-client:$google_clients_version",
    google_http_client_jackson: "com.google.http-client:google-http-client-jackson:$google_clients_version",
    google_http_client_jackson2: "com.google.http-client:google-http-client-jackson2:$google_clients_version",
    google_http_client_protobuf: "com.google.http-client:google-http-client-protobuf:$google_clients_version",
    google_oauth_client: "com.google.oauth-client:google-oauth-client:$google_clients_version",
    google_oauth_client_java6: "com.google.oauth-client:google-oauth-client-java6:$google_clients_version",
    grpc_all: "io.grpc:grpc-all:$grpc_version",
    grpc_auth: "io.grpc:grpc-auth:$grpc_version",
    grpc_core: "io.grpc:grpc-core:$grpc_version",
    grpc_google_cloud_pubsub_v1: "com.google.api.grpc:grpc-google-cloud-pubsub-v1:$pubsub_grpc_version",
    grpc_protobuf: "io.grpc:grpc-protobuf:$grpc_version",
    grpc_protobuf_lite: "io.grpc:grpc-protobuf-lite:$grpc_version",
    grpc_netty: "io.grpc:grpc-netty:$grpc_version",
    grpc_stub: "io.grpc:grpc-stub:$grpc_version",
    guava: "com.google.guava:guava:$guava_version",
    guava_testlib: "com.google.guava:guava-testlib:$guava_version",
    hadoop_client: "org.apache.hadoop:hadoop-client:$hadoop_version",
    hadoop_common: "org.apache.hadoop:hadoop-common:$hadoop_version",
    hadoop_mapreduce_client_core: "org.apache.hadoop:hadoop-mapreduce-client-core:$hadoop_version",
    hadoop_minicluster: "org.apache.hadoop:hadoop-minicluster:$hadoop_version",
    hadoop_hdfs: "org.apache.hadoop:hadoop-hdfs:$hadoop_version",
    hadoop_hdfs_tests: "org.apache.hadoop:hadoop-hdfs:$hadoop_version:tests",
    hamcrest_core: "org.hamcrest:hamcrest-core:$hamcrest_version",
    hamcrest_library: "org.hamcrest:hamcrest-library:$hamcrest_version",
    jackson_annotations: "com.fasterxml.jackson.core:jackson-annotations:$jackson_version",
    jackson_core: "com.fasterxml.jackson.core:jackson-core:$jackson_version",
    jackson_databind: "com.fasterxml.jackson.core:jackson-databind:$jackson_version",
    jackson_dataformat_cbor: "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:$jackson_version",
    jackson_dataformat_yaml: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jackson_version",
    jackson_module_scala: "com.fasterxml.jackson.module:jackson-module-scala_2.11:$jackson_version",
    joda_time: "joda-time:joda-time:2.4",
    junit: "junit:junit:4.12",
    kafka_clients: "org.apache.kafka:kafka-clients:1.0.0",
    malhar_library: "org.apache.apex:malhar-library:$apex_malhar_version",
    mockito_core: "org.mockito:mockito-core:1.9.5",
    netty_handler: "io.netty:netty-handler:$netty_version",
    netty_tcnative_boringssl_static: "io.netty:netty-tcnative-boringssl-static:1.1.33.Fork26",
    netty_transport_native_epoll: "io.netty:netty-transport-native-epoll:$netty_version",
    postgres: "org.postgresql:postgresql:$postgres_version",
    protobuf_java: "com.google.protobuf:protobuf-java:$protobuf_version",
    protobuf_java_util: "com.google.protobuf:protobuf-java-util:$protobuf_version",
    proto_google_cloud_pubsub_v1: "com.google.api.grpc:proto-google-cloud-pubsub-v1:$pubsub_grpc_version",
    proto_google_cloud_spanner_admin_database_v1: "com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:$grpc_google_common_protos",
    proto_google_common_protos: "com.google.api.grpc:proto-google-common-protos:$grpc_google_common_protos",
    slf4j_api: "org.slf4j:slf4j-api:1.7.25",
    slf4j_simple: "org.slf4j:slf4j-simple:1.7.25",
    slf4j_jdk14: "org.slf4j:slf4j-jdk14:1.7.25",
    slf4j_log4j12: "org.slf4j:slf4j-log4j12:1.7.25",
    snappy_java: "org.xerial.snappy:snappy-java:1.1.4",
    spark_core: "org.apache.spark:spark-core_2.11:$spark_version",
    spark_network_common: "org.apache.spark:spark-network-common_2.11:$spark_version",
    spark_streaming: "org.apache.spark:spark-streaming_2.11:$spark_version",
    stax2_api: "org.codehaus.woodstox:stax2-api:3.1.4",
    woodstox_core_asl: "org.codehaus.woodstox:woodstox-core-asl:4.4.1",
  ],
]

// Define the set of repositories and dependencies required to
// fetch and enable plugins.
buildscript {
  repositories {
    maven { url offlineRepositoryRoot }

    // To run gradle in offline mode, one must first invoke
    // 'updateOfflineRepository' to create an offline repo
    // inside the root project directory. See the application
    // of the offline repo plugin within build_rules.gradle
    // for further details.
    if (gradle.startParameter.isOffline()) {
      return
    }

    mavenLocal()
    mavenCentral()
    jcenter()
    maven { url "https://plugins.gradle.org/m2/" }
    maven { url "http://repo.spring.io/plugins-release" }
  }
  dependencies {
    classpath "net.ltgt.gradle:gradle-apt-plugin:0.13"                                                  // Enable a Java annotation processor
    classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.1"                                        // Enable proto code generation
    classpath "io.spring.gradle:propdeps-plugin:0.0.9.RELEASE"                                          // Enable provided and optional configurations
    classpath "gradle.plugin.org.nosphere.apache:creadur-rat-gradle:0.3.1"                              // Enable Apache license enforcement
    classpath "com.commercehub.gradle.plugin:gradle-avro-plugin:0.11.0"                                 // Enable Avro code generation
    classpath "com.diffplug.spotless:spotless-plugin-gradle:3.6.0"                                      // Enable a code formatting plugin
    classpath "gradle.plugin.com.github.blindpirate:gogradle:0.8.1"                                     // Enable Go code compilation
    classpath "gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0"                           // Enable building Docker containers
    classpath "cz.malohlava:visteg:1.0.3"                                                               // Enable generating Gradle task dependencies as ".dot" files
    classpath "com.github.jengelman.gradle.plugins:shadow:2.0.1"                                        // Enable shading Java dependencies
    classpath "ca.coglinc:javacc-gradle-plugin:2.4.0"                                                   // Enable the JavaCC parser generator
    classpath "gradle.plugin.io.pry.gradle.offline_dependencies:gradle-offline-dependencies-plugin:0.3" // Enable creating an offline repository
  }
}

/*************************************************************************************************/
// Configure the root project

apply plugin: "base"

// Apply one top level rat plugin to perform any required license enforcement analysis
apply plugin: "org.nosphere.apache.rat"
rat {
  plainOutput = true
  xmlOutput = false
  htmlOutput = false
  failOnError = true
  excludes = [
    // Ignore any offline repositories the user may have created.
    "**/${offlineRepositoryRoot}/**/*",

    // Exclude files generated by the Gradle build process
    "**/.gradle/**/*",
    "**/.gogradle/**/*",
    "**/gogradle.lock",
    "**/build/**/*",
    "**/vendor/**/*",
    "**/.gradletasknamecache",

    // .gitignore: Ignore files generated by the Maven build process
    "**/target/**/*",
    "**/bin/**/*",
    "**/dependency-reduced-pom.xml",

    // .gitignore: Ignore files generated by the Python build process
    "**/*.pyc",
    "**/*.pyo",
    "**/*.pyd",
    "**/*.egg-info/**/*",
    "**/.eggs/**/*",
    "**/nose-*.egg/**/*",
    "**/.tox/**/*",
    "**/dist/**/*",
    "**/distribute-*/**/*",
    "**/env/**/*",
    "sdks/python/**/*.c",
    "sdks/python/**/*.so",
    "sdks/python/**/*.egg",
    "sdks/python/LICENSE",
    "sdks/python/NOTICE",
    "sdks/python/README.md",
    "sdks/python/apache_beam/portability/api/*pb2*.*",

    // .gitignore: Ignore IntelliJ files.
    "**/.idea/**/*",
    "**/*.iml",
    "**/*.ipr",
    "**/*.iws",
    "**/out/**/*",

    // .gitignore: Ignore Eclipse files.
    "**/.classpath",
    "**/.project",
    "**/.factorypath",
    "**/.checkstyle",
    "**/.fbExcludeFilterFile",
    "**/.apt_generated/**/*",
    "**/.settings/**/*",

    // .gitignore: Ignore Visual Studio Code files.
    "**/.vscode/**/*",

    // .gitignore: Hotspot VM leaves this log in a non-target directory when java crashes
    "**/hs_err_pid*.log",

    // .gitignore: Ignore files that end with "~", since they
    //             are most likely auto-save files produced by a text editor.
    "**/*~",

    // .gitignore: Ignore MacOSX files.
    "**/.DS_Store/**/*",

    // Ignore files we track but do not distribute
    ".github/**/*",

    "**/package-list",
    "**/user.avsc",
    "**/test/resources/**/*.txt",
    "**/test/**/.placeholder",

    // Default eclipse excludes neglect subprojects

    // Proto/grpc generated wrappers
    "**/apache_beam/portability/api/*_pb2*.py",
    "**/go/pkg/beam/model/**/*.pb.go",

    // VCF test files
    "**/apache_beam/testing/data/vcf/*",
  ]
}
check.dependsOn rat

// Define root PreCommit tasks simplifying what is needed
// to be specified on the commandline when executing locally.
// This indirection also makes Jenkins use the branch of the PR
// for the test definitions.

def javaPreCommitRoots = [
  ":sdks:java:core",
  ":runners:direct-java",
  ":sdks:java:fn-execution",
]
task javaPreCommit() {
  for (String javaPreCommitRoot : javaPreCommitRoots) {
    dependsOn javaPreCommitRoot + ":buildNeeded"
    dependsOn javaPreCommitRoot + ":buildDependents"
  }
  dependsOn ":examples:java:preCommit"
}

task goPreCommit() {
  dependsOn ":sdks:go:test"
}
