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


apply plugin: 'java-library'

description = 'Apache Solr Core'

dependencies {
  if (skipLucene) {
    api "org.apache.lucene:lucene-core"
    api "org.apache.lucene:lucene-analysis-common"
    api "org.apache.lucene:lucene-analysis-kuromoji"
    api "org.apache.lucene:lucene-analysis-nori"
    api "org.apache.lucene:lucene-analysis-phonetic"
    api "org.apache.lucene:lucene-backward-codecs"
    api "org.apache.lucene:lucene-classification"
    api "org.apache.lucene:lucene-codecs"
    api "org.apache.lucene:lucene-expressions"
    api "org.apache.lucene:lucene-grouping"
    api "org.apache.lucene:lucene-highlighter"
    api "org.apache.lucene:lucene-join"
    api "org.apache.lucene:lucene-misc"
    api "org.apache.lucene:lucene-queries"
    api "org.apache.lucene:lucene-queryparser"
    api "org.apache.lucene:lucene-sandbox"
    api "org.apache.lucene:lucene-spatial-extras"
    api "org.apache.lucene:lucene-suggest"
  } else {
    api project(':lucene:core')
    api project(':lucene:analysis:common')
    api project(':lucene:analysis:kuromoji')
    api project(':lucene:analysis:nori')
    api project(':lucene:analysis:phonetic')
    api project(':lucene:backward-codecs')
    api project(':lucene:classification')
    api project(':lucene:codecs')
    api project(':lucene:expressions')
    api project(':lucene:grouping')
    api project(':lucene:highlighter')
    api project(':lucene:join')
    api project(':lucene:misc')
    api project(':lucene:queries')
    api project(':lucene:queryparser')
    api project(':lucene:sandbox')
    api project(':lucene:spatial-extras')
    api project(':lucene:suggest')
  }

  // Export these dependencies so that they're imported transitively by
  // other modules.
  api ('com.google.guava:guava', {
    exclude group: "org.codehaus.mojo", module: "animal-sniffer-annotations"
    exclude group: "com.google.j2objc", module: "j2objc-annotations"
    exclude group: "com.google.errorprone", module: "error_prone_annotations"
    exclude group: "org.checkerframework", module: "checker-qual"
    exclude group: "com.google.code.findbugs", module: "jsr305"
  })

  api project(':solr:solrj')
  api project(':solr:server')

  api 'org.apache.commons:commons-lang3'
  api 'com.carrotsearch:hppc'
  api 'com.fasterxml.jackson.core:jackson-databind'
  api 'commons-cli:commons-cli'
  api 'commons-codec:commons-codec'
  api 'commons-collections:commons-collections'
  api 'org.apache.commons:commons-collections4'

  implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-smile'

  implementation('com.github.ben-manes.caffeine:caffeine', {
    exclude group: "org.checkerframework", module: "checker-qual"
    exclude group: "com.google.errorprone", module: "error_prone_annotations"
  })

  implementation 'com.github.zafarkhaja:java-semver'
  implementation 'com.google.re2j:re2j'

  implementation('com.jayway.jsonpath:json-path', {
    exclude group: "net.minidev", module: "json-smart"
  })

  implementation 'com.tdunning:t-digest'

  implementation 'io.opentracing:opentracing-api'
  implementation 'io.opentracing:opentracing-noop'
  implementation 'io.opentracing:opentracing-util'
  implementation 'org.apache.commons:commons-exec'
  implementation 'org.apache.commons:commons-text'
  implementation("org.apache.commons:commons-configuration2", {
    exclude group: "commons-logging", module: "commons-logging"
  })
  implementation 'org.apache.htrace:htrace-core4'

  implementation 'org.apache.logging.log4j:log4j-api'
  implementation 'org.apache.logging.log4j:log4j-core'
  implementation 'org.apache.logging.log4j:log4j-slf4j-impl'

  api 'org.bitbucket.b_c:jose4j'
  implementation 'org.codehaus.janino:commons-compiler'
  implementation 'org.codehaus.janino:janino'

  implementation 'org.rrd4j:rrd4j'

  // For faster XML processing than the JDK
  implementation ('org.codehaus.woodstox:woodstox-core-asl', {
    exclude group: "javax.xml.stream", module: "stax-api"
  })

  implementation ('org.apache.calcite.avatica:avatica-core') { transitive = false }
  implementation ('org.apache.calcite:calcite-core') { transitive = false }
  implementation ('org.apache.calcite:calcite-linq4j') { transitive = false }
  implementation ('org.apache.curator:curator-client') { transitive = false }
  implementation ('org.apache.curator:curator-framework') { transitive = false }
  implementation ('org.apache.hadoop:hadoop-annotations') { transitive = false }
  implementation ('org.apache.hadoop:hadoop-auth') { transitive = false }
  implementation ('org.apache.hadoop:hadoop-common') { transitive = false }
  implementation ('org.apache.hadoop:hadoop-hdfs-client') { transitive = false }
  testImplementation 'org.apache.commons:commons-compress' // required for customized hadoop classes

  implementation ('net.hydromatic:eigenbase-properties') { transitive = false }

  runtimeOnly ('org.apache.curator:curator-recipes') { transitive = false }
  runtimeOnly ('org.apache.kerby:kerb-core')
  runtimeOnly ('org.apache.kerby:kerb-util')
  runtimeOnly ('org.apache.kerby:kerby-asn1')
  runtimeOnly ('org.apache.kerby:kerby-pkix')
  runtimeOnly ('com.google.protobuf:protobuf-java')

  if (skipLucene) {
    testImplementation "org.apache.lucene:lucene-analysis-icu"
  } else {
    testImplementation project(':lucene:analysis:icu')
  }

  testImplementation project(':solr:contrib:analysis-extras')
  testImplementation project(':solr:test-framework')

  testImplementation ('org.apache.hadoop:hadoop-common::tests') { transitive = false }
  testImplementation ('org.apache.hadoop:hadoop-hdfs') { transitive = false }
  testImplementation ('org.apache.hadoop:hadoop-hdfs::tests') { transitive = false }
  testImplementation ('org.apache.hadoop:hadoop-minikdc') { transitive = false }
  testImplementation 'org.apache.logging.log4j:log4j-1.2-api'

  testImplementation ('org.apache.kerby:kerb-client') { transitive = false }
  testImplementation ('org.apache.kerby:kerb-common') { transitive = false }
  testImplementation ('org.apache.kerby:kerb-identity') { transitive = false }
  testImplementation ('org.apache.kerby:kerb-server') { transitive = false }
  testImplementation ('org.apache.kerby:kerb-simplekdc') { transitive = false }
  testImplementation ('org.apache.kerby:kerb-admin') { transitive = false }
  testImplementation ('org.apache.kerby:kerby-kdc') { transitive = false }

  testImplementation ('com.sun.jersey:jersey-servlet') { transitive = false }

  // required for instantiating a Zookeeper server in tests or embedded
  runtimeOnly ('org.xerial.snappy:snappy-java')
  
  testImplementation 'com.google.protobuf:protobuf-java'
  testImplementation 'commons-logging:commons-logging'
  testImplementation('org.mockito:mockito-core', {
    exclude group: "net.bytebuddy", module: "byte-buddy-agent"
  })
}

