// Copyright 2019 The Nomulus Authors. All Rights Reserved.
//
// Licensed 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.

ext {
    // Direct dependencies and compile-time transitive dependencies (i.e.,
    // those flagged as undeclared-dependency by Nebula-lint).
    dependencyList = [
      // Pinned dependencies (those cannot use dynamic version) should be listed
      // first. There are several reasons why a dependency has to be pinned.
      // 1. The resolved dynamic version introduces breaking API changes that
      //    cause compilation errors.
      // 2. The resolved version has behavior changes that break some tests.
      // 3. Pinned by legacy software. E.g., the closure compiler and stylesheet
      //    jars must be pinned to work with the final version of gwt-user.
      // 4. The resolved version is a pin-breaker, i.e., it forcefully upgrades
      //    a pinned dependency to a newer version.
      // 5. Inconsistent group resolutions: the resolved versions of modules in
      //    a dependency group can not work together. For example, the three
      //    bouncycastle jars need to be hardcoded with the same version string
      //    as of April, 2022.
      // 6. Dependency constraints violation: e.g., as of April 2022, Hibernate
      //    6.0 has a dependency that is not Java-8-compatible.
      // 7. Maven mirroring error. Gradle expects that a dependency with dynamic
      //    version be available on both repo.maven and repo2.maven. The
      //    resolved version of xpp3 is not on repo.maven. This may be due to
      //    the fact that xpp3 has been renamed to org.ogce.xpp3.

      // Note that since Gradle 7, for version labels to be strict, we need to
      // append '!!' to the end. Otherwise they may still be forced to upgrade.

      // Breaking changes causing compilation error.
      'com.beust:jcommander:1.60',
      'com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0',
      'com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0',
      'com.google.apis:google-api-services-drive:v2-rev393-1.25.0',
      'com.google.apis:google-api-services-gmail:v1-rev20220404-2.0.0',
      'com.thoughtworks.qdox:qdox:1.12.1',
      'jline:jline:1.0',

      // Breaking change causing soy template parsing error.
      'com.google.template:soy:2021-02-01',

      // Our .xjb files are not compatible with newer binding specs: some
      // xml elements' names have changed.
      'com.sun.xml.bind:jaxb-xjc:2.3.3',

      // appengine-api-1.0-sdk has breaking changes.
      'com.google.appengine:appengine-api-1.0-sdk:1.9.86',
      // Pin-breakers for appengine-api-1.0-sdk
      'com.google.appengine:appengine-testing:1.9.86',

      // Pinned for gwt-user.
      'com.google.javascript:closure-compiler:v20210505',
      'com.google.closure-stylesheets:closure-stylesheets:1.5.0',

      // 5.6.12.Final is buggy wrt immutable CompositeUserTypes.
      // 6.0+ requires Java 11.
      'org.hibernate:hibernate-core:[5.6.14.Final, 6.0)',
      'org.hibernate:hibernate-hikaricp:[5.6.14.Final, 6.0)',
      // Latest version of the following are Java11-only
      'com.zaxxer:HikariCP:3.4.5',
      'com.github.ben-manes.caffeine:caffeine:[2.9.3,3.0)',

      // Broken by asymmetric mirroring on Maven. Note that this should be
      // upgraded to org.ogce.xpp3
      'xpp3:xpp3:1.1.4c',

      // Dependency groups with inconsistent version resolutions start here
      'io.netty:netty-buffer:4.1.59.Final',
      'io.netty:netty-codec-http:4.1.59.Final',
      'io.netty:netty-codec:4.1.59.Final',
      'io.netty:netty-common:4.1.59.Final',
      'io.netty:netty-handler:4.1.59.Final',
      'io.netty:netty-transport:4.1.59.Final',
      'org.apache.sshd:sshd-core:2.0.0',
      'org.apache.sshd:sshd-scp:2.0.0',
      'org.apache.sshd:sshd-sftp:2.0.0',
      'org.bouncycastle:bcpg-jdk15on:1.67',
      'org.bouncycastle:bcpkix-jdk15on:1.67',
      'org.bouncycastle:bcprov-jdk15on:1.67',
      'org.seleniumhq.selenium:selenium-api:3.141.59',
      'org.seleniumhq.selenium:selenium-chrome-driver:3.141.59',
      'org.seleniumhq.selenium:selenium-java:3.141.59',
      'org.seleniumhq.selenium:selenium-remote-driver:3.141.59',
      'us.fatehi:schemacrawler:16.10.1',
      'us.fatehi:schemacrawler-api:16.10.1',
      'us.fatehi:schemacrawler-diagram:16.10.1',
      'us.fatehi:schemacrawler-tools:16.10.1',

      // Dependencies with dynamic versions start from here.
      'args4j:args4j:[2.0.26,)',
      'com.google.api:gax:[1.66.0,)',
      'com.google.api.grpc:proto-google-cloud-secretmanager-v1:[1.4.0,)',
      'com.google.api.grpc:proto-google-cloud-tasks-v2:[1.33.2,)',
      'com.google.api.grpc:proto-google-common-protos:[2.1.0,)',

      // Excluding versions 2.0 from google-api-client because they're
      // runtime incompatible with version 1.25 of admin directory API.
      // TODO: see if we can upgrade to a newer version of the latter.
      'com.google.api-client:google-api-client-java6:[1.31.3,2.0)!!',
      'com.google.api-client:google-api-client:[1.31.3,2.0)!!',
      'com.google.api-client:google-api-client-appengine:[1.31.3,2.0)',
      'com.google.api-client:google-api-client-servlet:[1.31.3,2.0)',
      'com.google.apis:google-api-services-appengine:[v1-rev130-1.25.0,)',
      'com.google.apis:google-api-services-bigquery:[v2-rev459-1.25.0,)',
      'com.google.apis:google-api-services-cloudkms:[v1-rev108-1.25.0,)',
      'com.google.apis:google-api-services-dataflow:[v1b3-rev302-1.25.0,)',
      'com.google.apis:google-api-services-groupssettings:[v1-rev82-1.25.0,)',
      'com.google.apis:google-api-services-monitoring:[v3-rev540-1.25.0,)',
      'com.google.apis:google-api-services-sheets:[v4-rev612-1.25.0,)',
      'com.google.apis:google-api-services-storage:[v1-rev20210127-1.31.0,)',
      'com.google.appengine:appengine-api-stubs:[1.9.86,)',
      'com.google.auth:google-auth-library-credentials:[0.24.1,)',
      'com.google.auth:google-auth-library-oauth2-http:[0.24.1,)',
      'com.google.auto.service:auto-service-annotations:[1.0-rc7,)',
      'com.google.auto.service:auto-service:[1.0-rc7,)',
      'com.google.auto.value:auto-value-annotations:[1.7.4,)',
      'com.google.auto.value:auto-value:[1.7.4,)',
      'com.google.cloud.bigdataoss:util:2.2.6',
      'com.google.cloud.sql:jdbc-socket-factory-core:[1.2.1,)',
      'com.google.cloud.sql:postgres-socket-factory:[1.2.1,)',
      'com.google.cloud:google-cloud-core:[1.94.3,)',
      'com.google.cloud:google-cloud-core-http:[1.94.3,)',
      'com.google.cloud:google-cloud-secretmanager:[1.4.0,)',
      'com.google.cloud:google-cloud-storage:[1.113.12, 2.22.6]!!',
      'com.google.cloud:google-cloud-nio:[0.123.4, 0.126.19]!!',
      'com.google.cloud:google-cloud-tasks:[1.33.2,)',
      'com.google.code.findbugs:jsr305:[3.0.2,)',
      'com.google.code.gson:gson:[2.8.6,)',
      'com.google.dagger:dagger-compiler:[2.33,)',
      'com.google.dagger:dagger:[2.33,)',
      'com.google.errorprone:error_prone_annotations:[2.7.1,)',
      'com.google.flogger:flogger-system-backend:[0.7.4,)',
      'com.google.flogger:flogger:[0.7.4,)',
      'com.google.guava:guava-testlib:[32.1.1-jre,)',
      'com.google.guava:guava:[32.1.1-jre,)',
      'com.google.gwt:gwt-user:[2.9.0,)',
      'com.google.http-client:google-http-client-appengine:[1.39.0,)',
      'com.google.http-client:google-http-client-jackson2:[1.39.0,)',
      'com.google.http-client:google-http-client:[1.39.0,)',
      'com.google.inject:guice:[5.0.1,)',
      'com.google.monitoring-client:contrib:[1.0.7,)',
      'com.google.monitoring-client:metrics:[1.0.7,)',
      'com.google.monitoring-client:stackdriver:[1.0.7,)',
      'com.google.oauth-client:google-oauth-client:[1.31.4,)',
      'com.google.oauth-client:google-oauth-client-appengine:[1.31.4,)',
      'com.google.oauth-client:google-oauth-client-java6:[1.31.4,)',
      'com.google.oauth-client:google-oauth-client-jetty:[1.31.4,)',
      'com.google.oauth-client:google-oauth-client-servlet:[1.31.4,)',
      'com.google.protobuf:protobuf-java:[3.13.0,)',
      'com.google.protobuf:protobuf-java-util:[3.17.3,)',
      'com.google.re2j:re2j:[1.6,)',
      'com.google.truth.extensions:truth-java8-extension:[1.1.2,)',
      'com.google.truth:truth:[1.1.2,)',
      'com.googlecode.json-simple:json-simple:[1.1.1,)',
      'com.ibm.icu:icu4j:[68.2,)',
      'com.jcraft:jsch:[0.1.55,)',
      'commons-codec:commons-codec:[1.15,)',
      'com.squareup:javapoet:[1.13.0,)',
      'com.sun.activation:javax.activation:[1.2.0,)',
      'com.sun.xml.bind:jaxb-impl:[2.3.3,)',
      'com.sun.xml.bind:jaxb-osgi:[2.3.3,)',
      'dnsjava:dnsjava:[3.3.1,)',
      'guru.nidi:graphviz-java-all-j2v8:[0.17.0,)',
      'io.github.classgraph:classgraph:[4.8.102,)',
      'io.github.java-diff-utils:java-diff-utils:[4.9,)',
      'io.netty:netty-tcnative-boringssl-static:[2.0.36.Final,)',
      'javax.annotation:javax.annotation-api:[1.3.2,)',
      'javax.annotation:jsr250-api:[1.0,)',
      'javax.inject:javax.inject:[1,)',
      'javax.mail:mail:[1.4,)',
      'javax.persistence:javax.persistence-api:[2.2,)',
      'javax.servlet:servlet-api:[2.5,)',
      'javax.xml.bind:jaxb-api:[2.3.0,)',
      'joda-time:joda-time:[2.9.2,)',
      'junit:junit:[4.13,)',
      'org.checkerframework:checker-qual:[3.9.1,)',
      'org.checkerframework:checker-compat-qual:[2.5.5,)',
      'org.junit.jupiter:junit-jupiter-api:[5.6.2,)',
      'org.junit.jupiter:junit-jupiter-engine:[5.6.2,)',
      'org.junit.jupiter:junit-jupiter-migrationsupport:[5.6.2,)',
      'org.junit.jupiter:junit-jupiter-params:[5.6.2,)',
      'org.junit.platform:junit-platform-runner:[1.6.2,)',
      'org.junit.platform:junit-platform-suite-api:[1.6.2,)',
      'org.junit-pioneer:junit-pioneer:[0.7.0,)',
      'org.apache.avro:avro:[1.8.2,)',
      'org.apache.beam:beam-runners-core-construction-java:[2.37.0,)',
      'org.apache.beam:beam-runners-direct-java:[2.37.0,)',
      'org.apache.beam:beam-runners-google-cloud-dataflow-java:[2.37.0,)',
      'org.apache.beam:beam-sdks-java-core:[2.37.0,)',
      'org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:[2.37.0,)',
      'org.apache.beam:beam-sdks-java-io-google-cloud-platform:[2.37.0,)',
      'org.apache.commons:commons-csv:[1.9.0,)',
      'org.apache.commons:commons-lang3:[3.8.1,)',
      'org.apache.commons:commons-text:[1.6,)',
      'org.apache.ftpserver:ftplet-api:[1.0.6,)',
      'org.apache.ftpserver:ftpserver-core:[1.0.6,)',
      'org.apache.httpcomponents:httpclient:[4.5.11,)',
      'org.apache.httpcomponents:httpcore:[4.4.13,)',
      'org.apache.tomcat:tomcat-annotations-api:[8.0.5,)',
      'com.fasterxml.jackson.core:jackson-databind:[2.11.2,)',
      'org.flywaydb:flyway-core:[5.2.4,)',
      'org.glassfish.jaxb:jaxb-runtime:[2.3.0,)',
      'org.hamcrest:hamcrest:[2.2,)',
      'org.hamcrest:hamcrest-core:[2.2,)',
      'org.hamcrest:hamcrest-library:[2.2,)',
      'org.joda:joda-money:[1.0.1,)',
      'org.json:json:[20160810,)',
      'org.jsoup:jsoup:[1.13.1,)',
      'org.mockito:mockito-core:[3.7.7,)',
      'org.mockito:mockito-junit-jupiter:[3.7.7,)',
      'org.mortbay.jetty:jetty:[6.1.26,)',
      'org.postgresql:postgresql:[42.2.18,)',
      'org.eclipse.jetty:jetty-server:[9.4.49.v20220914,)',
      'org.eclipse.jetty:jetty-servlet:[9.4.49.v20220914,)',
      'org.slf4j:slf4j-jdk14:[1.7.28,)',
      'org.testcontainers:jdbc:[1.15.2,)',
      'org.testcontainers:junit-jupiter:[1.15.2,)',
      'org.testcontainers:postgresql:[1.15.2,)',
      'org.testcontainers:selenium:[1.15.2,)',
      'org.testcontainers:testcontainers:[1.15.2,)',
      'org.yaml:snakeyaml:[1.17,)',
      'xerces:xmlParserAPIs:[2.6.2,)',
    ]

    dependencyMap = dependencyList.collectEntries {
      def fields = it.split(':')
      def key = fields[0] + ':' + fields[1]
      [key, it]
    }
}
