/*
 * 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 from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"

apply from: "${project.projectDir}/../gradle/publish-java.gradle"


dependencies {
  compile(platform(project(':boms:geode-all-bom')))
  compile('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'
    ext.optional = true
  }

  compile('org.apache.lucene:lucene-core')
  compile('org.apache.commons:commons-lang3')
  compile('mx4j:mx4j')
  compile('org.apache.logging.log4j:log4j-api')
  testCompile('com.pholser:junit-quickcheck-core')

  distributedTestCompile('org.hamcrest:hamcrest-core')
  distributedTestCompile('org.hamcrest:hamcrest-library')

  testCompile('com.carrotsearch.randomizedtesting:randomizedtesting-runner')
  testCompile('org.powermock:powermock-core')
  testCompile('org.powermock:powermock-module-junit4')
  testCompile('org.powermock:powermock-api-mockito2')

  upgradeTestCompile('commons-io:commons-io')

  testCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  implementation(project(':geode-logging'))
  implementation(project(':geode-serialization'))
  compile(project(':geode-core'))
  compile('org.apache.lucene:lucene-analyzers-common')
  compile('org.apache.lucene:lucene-queryparser') {
    exclude module: 'lucene-sandbox'
  }

  distributedTestCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  runtimeOnly('org.apache.lucene:lucene-analyzers-phonetic')

  testCompile(project(':geode-lucene:geode-lucene-test'))
  testCompile('org.apache.lucene:lucene-test-framework')
  testCompile('com.pholser:junit-quickcheck-generators')

  testCompile('pl.pragmatists:JUnitParams')


  integrationTestCompile(project(':geode-dunit')) {
    exclude module: 'geode-core'
  }
  integrationTestCompile(project(':geode-lucene:geode-lucene-test'))
  integrationTestCompile('org.apache.lucene:lucene-analyzers-phonetic')
  integrationTestCompile('pl.pragmatists:JUnitParams')


  distributedTestCompile(project(':geode-lucene:geode-lucene-test'))
  distributedTestCompile('pl.pragmatists:JUnitParams')
  distributedTestCompile(project(':geode-dunit')){
    exclude module: 'geode-core'
  }


  upgradeTestCompile(project(':geode-dunit')) {
    exclude module: 'geode-core'
  }

  upgradeTestRuntime(project(path: ':geode-old-versions', configuration: 'testOutput'))


  performanceTestCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  performanceTestCompile(project(':geode-lucene:geode-lucene-test'))
}

//The lucene integration tests don't have any issues that requiring forking
integrationTest.forkEvery 0
