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

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

jar.enabled = false

configurations {
  war {}
}

dependencies {
  compile(platform(project(':boms:geode-all-bom'))){
    exclude module: "jackson-annotations"
  }

  compileOnly(project(':geode-core'))
  compileOnly(project(':geode-logging'))
  compileOnly(project(':geode-membership'))
  compileOnly(project(':geode-serialization'))

  compileOnly('javax.servlet:javax.servlet-api')

  implementation('org.apache.commons:commons-lang3')
  implementation('commons-fileupload:commons-fileupload') {
    exclude module: 'commons-io'
  }
  // jackson-annotations must be accessed from the geode classloader and not the webapp
  compileOnly('com.fasterxml.jackson.core:jackson-annotations')
  implementation('com.fasterxml.jackson.core:jackson-core')
  implementation('com.fasterxml.jackson.core:jackson-databind'){
    exclude module: 'jackson-annotations'
  }

  compileOnly('io.swagger:swagger-annotations')

  implementation('io.springfox:springfox-swagger2') {
    exclude module: 'slf4j-api'
    exclude module: 'jackson-annotations'
    exclude module: 'swagger-annotations'
  }

  implementation('io.springfox:springfox-swagger-ui') {
    exclude module: 'slf4j-api'
  }

  implementation('org.springframework:spring-beans')
  implementation('org.springframework.security:spring-security-core')
  implementation('org.springframework.security:spring-security-web')
  implementation('org.springframework.security:spring-security-config')
  implementation('org.springframework:spring-web')
  implementation('org.springframework:spring-webmvc')
  implementation('org.springframework.hateoas:spring-hateoas') {
    exclude module: 'aopalliance'
    exclude module: 'commons-logging'
    exclude module: 'objenesis'
    exclude module: 'slf4j-api'
    exclude module: 'spring-core'
    exclude module: 'spring-plugin-core'
  }
  implementation('org.springframework:spring-aspects') {
    exclude module: 'aopalliance'
    exclude module: 'aspectjweaver'
  }
  implementation('org.springframework:spring-oxm') {
    exclude module: 'commons-logging'
    exclude module: 'spring-core'
    exclude module: 'spring-beans'
  }
  compileOnly('org.apache.logging.log4j:log4j-api')


  testImplementation(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  testImplementation(project(':geode-core'))
  testImplementation('javax.servlet:javax.servlet-api')

  integrationTestImplementation('org.springframework:spring-test')
  integrationTestImplementation('org.springframework.security:spring-security-test')

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

sourceSets {
  integrationTest {
    resources {
      srcDir "${projectDir}/src/main/webapp"
    }
  }
}

war {
  enabled = true
  rootSpec.exclude("**/*commons-logging-*.jar")
  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
  // this shouldn't be necessary but if it's not specified we're missing some of the jars
  // from the runtime classpath
  classpath configurations.runtimeClasspath
}

artifacts {
  war tasks.war
}
