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

plugins { id 'org.apache.beam.vendor-java' }

description = "Apache Beam :: Vendored Dependencies :: Calcite 1.26.0"

group = "org.apache.beam"
version = "0.1"

def calcite_version = "1.26.0"
def avatica_version = "1.17.0"
def prefix = "org.apache.beam.vendor.calcite.v1_26_0"

List<String> packagesToRelocate = [
        "com.esri",
        "com.fasterxml",
        "com.google.common",
        "com.google.protobuf",
        "com.google.thirdparty",
        "com.google.uzaygezen",
        "com.jayway",
        "com.yahoo",
        "net.minidev",
        "org.apache.calcite",
        "org.apache.commons",
        "org.apache.http",
        "org.apiguardian.api",
        "org.codehaus",
        "org.objectweb",
        "org.pentaho",
        "org.yaml",
]

vendorJava(
        dependencies: [
                "org.apache.calcite:calcite-core:$calcite_version",
                "org.apache.calcite:calcite-linq4j:$calcite_version",
                "org.apache.calcite.avatica:avatica-core:$avatica_version",
        ],
        runtimeDependencies: [
                library.java.slf4j_api,
        ],
        relocations: packagesToRelocate.collectEntries {
            [ (it): "${prefix}.${it}" ] + [ "jdbc:calcite:": "jdbc:beam-vendor-calcite:"]
        },
        exclusions: [
                // Code quality / Building annotations
                "com/google/errorprone/**",
                "com/google/j2objc/annotations/**",
                "javax/annotation/**",
                "org/checkerframework/**",
                "org/jmlspecs/**",

                // Runtime logging interface
                "org/slf4j/**",
                "org/apache/log4j/**",
                "org/apache/logging/log4j/**",
                "META-INF/versions/9/org/apache/logging/log4j/**",

                // Optional loggers
                "org/apache/commons/logging/impl/AvalonLogger*",
                "org/apache/commons/logging/impl/LogKitLogger*",

                // Optional JSON providers
                "com/jayway/jsonpath/spi/json/GsonJsonProvider*",
                "com/jayway/jsonpath/spi/json/JettisonProvider*",
                "com/jayway/jsonpath/spi/json/JsonOrgJsonProvider*",
                "com/jayway/jsonpath/spi/json/TapestryJsonProvider*",
                "com/jayway/jsonpath/spi/mapper/GsonMappingProvider*",
                "com/jayway/jsonpath/spi/mapper/JsonOrgMappingProvider*",
                "com/jayway/jsonpath/spi/mapper/TapestryMappingProvider*",

                // Unused broken code
                "org/apache/commons/dbcp2/managed/**",
                "org/apache/commons/pool2/proxy/**",
                "org/codehaus/janino/AntCompilerAdapter*",

                "**/module-info.class",
        ],
        groupId: group,
        artifactId: "beam-vendor-calcite-1_26_0",
        version: version,
)
