/*
 * 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 'war'
  id 'geode-publish-war'
  id 'warnings'
}

jar.enabled = false

configurations {
  war {}
}

dependencies {
  api(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'
  }

  implementation('org.springdoc:springdoc-openapi-ui') {
    exclude module: 'slf4j-api'
    exclude module: 'jackson-annotations'
  }

  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
}
