/*
 * 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: 'war'

apply from: "${project.projectDir}/../gradle/geode-dependency-management.gradle"
apply from: "${project.projectDir}/../gradle/publish.gradle"


dependencies {
  compileOnly('javax.servlet:javax.servlet-api')
  compileOnly(project(path: ':geode-core', configuration: 'classesOutput'))

  runtimeOnly('org.springframework:spring-aspects') {
    exclude module: 'aspectjweaver'
    exclude module: 'aopalliance'
    exclude module: 'spring-core'
  }
  runtimeOnly('org.springframework:spring-oxm') {
    exclude module: 'commons-logging'
    exclude module: 'spring-beans'
    exclude module: 'spring-core'
  }
  runtimeOnly('org.springframework:spring-webmvc') {
    exclude module: 'aopalliance'
    exclude module: 'aspectjweaver'
    exclude module: 'spring-core'
  }
  runtimeOnly('commons-fileupload:commons-fileupload') {
    exclude module: 'commons-io'
  }
  
  testCompile(project(':geode-core'))
  testCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  // have to use output since we exclude the dependent classes from jar :(
  testCompile(project(path: ':geode-core', configuration: 'classesOutput'))
  testCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  testCompile('org.springframework:spring-test')
  testCompile('org.springframework:spring-webmvc') {
    exclude module: 'aopalliance'
    exclude module: 'spring-aop'
  }


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

  integrationTestRuntime(files(war.destinationDir))
  integrationTestRuntime('org.springframework:spring-webmvc') {
    exclude module: 'aopalliance'
    exclude module: 'spring-aop'
  }


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

  distributedTestRuntime(files(war.destinationDir))
  distributedTestRuntime('org.springframework:spring-webmvc') {
    exclude module: 'aopalliance'
    exclude module: 'spring-aop'
  }

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

//Remove the gradle output directories from the eclipse classpath. These
//are added by the classesOutput configuration, above. Unfortunately, using
//minusConfigurations does not work here, because it removes the entire
//geode-core project
eclipse.classpath.file {
  whenMerged { classpath ->
    classpath.entries.removeAll { entry -> entry.path.contains('geode-core/build') }
  }
}

distributedTest.dependsOn(war)
integrationTest.dependsOn(war)

war {
  dependsOn ':geode-core:webJar'
  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
  classpath configurations.runtimeClasspath
  classpath project(':geode-core').webJar.archivePath
}
