/*
 * 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 'standard-subproject-configuration'
  id 'geode-publish-java'
  id 'warnings'
}

dependencies {
  api(platform(project(':boms:geode-all-bom')))

  api(project(':geode-core'))
  api(project(':geode-common'))

  implementation(project(':geode-logging'))
  implementation(project(':geode-membership'))
  implementation(project(':geode-serialization'))
  implementation(project(':geode-unsafe'))
  implementation('org.springframework:spring-web') {
    exclude module: 'spring-core'
    exclude module: 'commons-logging'
  }
  implementation('org.apache.commons:commons-lang3')
  implementation('com.healthmarketscience.rmiio:rmiio')
  implementation('com.fasterxml.jackson.core:jackson-databind')
  implementation('io.swagger.core.v3:swagger-annotations')

  //    //Find bugs is used in multiple places in the code to suppress findbugs warnings
  testImplementation('com.github.stephenc.findbugs:findbugs-annotations')
  testImplementation('org.springframework:spring-test')
  testImplementation(project(':geode-junit'))
  testImplementation('pl.pragmatists:JUnitParams')

  integrationTestImplementation(project(':geode-dunit'))
  integrationTestImplementation('pl.pragmatists:JUnitParams')
  integrationTestRuntimeOnly('org.apache.derby:derby')
  integrationTestImplementation('org.junit.jupiter:junit-jupiter-migrationsupport')

  distributedTestImplementation(project(':geode-dunit'))
  distributedTestImplementation('pl.pragmatists:JUnitParams')
  distributedTestRuntimeOnly('org.apache.derby:derby')

  testCompileOnly(platform(project(':boms:geode-all-bom')))

  upgradeTestImplementation(project(':geode-junit'))
  upgradeTestImplementation(project(':geode-dunit'))

  upgradeTestImplementation('org.awaitility:awaitility')
  upgradeTestImplementation('org.assertj:assertj-core')
  upgradeTestImplementation('junit:junit')
  upgradeTestImplementation('xml-apis:xml-apis')
  upgradeTestRuntimeOnly(project(path: ':geode-old-versions', configuration: 'classpathsOutput'))

  implementation('net.sf.jopt-simple:jopt-simple')

  //Log4j is used everywhere
  implementation('org.apache.logging.log4j:log4j-api')

  //Spring core is used by the the gfsh cli
  implementation('org.springframework:spring-core') {
    ext.optional = true
  }

  //Spring shell is used by the gfsh cli. It's unclear why we can exclude
  //So many transitive dependencies - are these really optional?
  //GfshCommand is a public API class that depends on spring shell
  api('org.springframework.shell:spring-shell') {
    exclude module: 'aopalliance'
    exclude module: 'asm'
    exclude module: 'cglib'
    exclude module: 'guava'
    exclude module: 'spring-aop'
    exclude module: 'spring-context-support'
    exclude module: 'spring-core'
  }


  acceptanceTestImplementation(project(':geode-junit'))
  acceptanceTestRuntimeOnly(project(':geode-log4j'))

}

configure([
  acceptanceTest,
  repeatAcceptanceTest
]) {
  environment 'GEODE_HOME', "$buildDir/../../geode-assembly/build/install/apache-geode"
  dependsOn(':geode-assembly:installDist')
}
