/*
 * 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.
 */

evaluationDependsOn(':geode-core')

apply from: "${rootDir}/${scriptDir}/standard-subproject-configuration.gradle"
apply plugin: 'war'

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

jar.enabled = true

dependencies {
  compile(platform(project(':boms:geode-all-bom')))
  compileOnly(platform(project(':boms:geode-all-bom')))
  providedCompile(platform(project(':boms:geode-all-bom')))

  compile('org.springframework.security:spring-security-core')
  compile('javax.servlet:javax.servlet-api')
  compile('mx4j:mx4j') {
    ext.optional = true
  }
  compile('mx4j:mx4j-remote') {
    ext.optional = true
  }
  integrationTestCompile('junit:junit')
  uiTestCompile('junit:junit')
  integrationTestCompile('org.hamcrest:hamcrest-core')
  integrationTestCompile('org.hamcrest:hamcrest-library')
  integrationTestCompile('org.hamcrest:hamcrest-all')
  uiTestCompile('org.apache.httpcomponents:httpcore')
  uiTestCompile('org.seleniumhq.selenium:selenium-api')
  uiTestCompile('org.assertj:assertj-core')
  uiTestCompile('org.apache.httpcomponents:httpclient')
  uiTestCompile('org.seleniumhq.selenium:selenium-support')
  compile('org.springframework:spring-beans')

  // Needed to fully use log4j instead of commons-logging.
  compile('org.apache.logging.log4j:log4j-jcl')
  compile('org.apache.logging.log4j:log4j-api')
//  compile('org.apache.logging.log4j:log4j-core')

  compile('commons-beanutils:commons-beanutils')
  compile('commons-collections:commons-collections')
  compile('commons-digester:commons-digester')
  compile('org.apache.commons:commons-lang3')
  compile('org.springframework.ldap:spring-ldap-core')

  compile('org.springframework.security:spring-security-config') {
    exclude module: 'aopalliance'
    exclude module: 'spring-expression'
  }
  compile('org.springframework.security:spring-security-ldap') {
    exclude module: 'aopalliance'
    exclude module: 'spring-asm'
    exclude module: 'spring-expression'
    exclude module: 'spring-jdbc'
  }
  compile('org.springframework.security:spring-security-web') {
    exclude module: 'aopalliance'
    exclude module: 'spring-asm'
    exclude module: 'spring-expression'
    exclude module: 'spring-jdbc'
  }
  compile('org.springframework:spring-context')
  compile('org.springframework:spring-web')
  runtimeOnly('org.springframework:spring-webmvc') {
    exclude module: 'aopalliance'
    exclude module: 'aspectjweaver'
  }
  compile('org.springframework:spring-tx')
  compile('com.fasterxml.jackson.core:jackson-annotations')
  compile('com.fasterxml.jackson.core:jackson-core')
  compile('com.fasterxml.jackson.core:jackson-databind')

  compileOnly('org.mortbay.jetty:servlet-api')

  runtimeOnly('org.springframework:spring-expression')

  // added only to ensure common version with other geode modules
  runtimeOnly('org.slf4j:slf4j-api')

  providedCompile('commons-logging:commons-logging')


  testCompile(project(':geode-core'))
  testCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  testImplementation(project(':geode-log4j')) {
    exclude module: 'geode-core'
  }
  testCompile('org.springframework:spring-test')
  testCompile('org.powermock:powermock-core')
  testCompile('org.powermock:powermock-module-junit4')
  testCompile('org.powermock:powermock-api-mockito2')


  integrationTestCompile(project(':geode-core'))
  integrationTestCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  integrationTestImplementation(project(':geode-log4j')) {
    exclude module: 'geode-core'
  }
  integrationTestCompile(project(':geode-pulse:geode-pulse-test'))
  integrationTestCompile('org.powermock:powermock-core')
  integrationTestCompile('org.powermock:powermock-module-junit4')
  integrationTestCompile('org.powermock:powermock-api-mockito2')
  integrationTestCompile('org.springframework:spring-test')


  uiTestRuntime(project(':geode-core'))
  uiTestCompile(project(':geode-junit')) {
    exclude module: 'geode-core'
  }
  uiTestImplementation(project(':geode-log4j')) {
    exclude module: 'geode-core'
  }
  uiTestCompile(project(':geode-pulse:geode-pulse-test'))
  uiTestCompile('org.seleniumhq.selenium:selenium-remote-driver')
}

def generatedResources = "$buildDir/generated-resources/main"

sourceSets {
  main {
    output.dir(generatedResources, builtBy: 'copyGemFireVersionFile')
  }

  integrationTest {
    resources {
      srcDir 'src/main/webapp/WEB-INF'
    }
  }
}

task copyGemFireVersionFile(type: Copy) {
  from project(':geode-core').createVersionPropertiesFile
  into generatedResources
}

eclipse.classpath.file {
  whenMerged { classpath ->
    classpath.entries.removeAll { entry -> entry.path.contains('geode-core/build')}
  }
}
idea.module.iml {
  whenMerged {module ->
    module.dependencies.removeAll { entry -> entry.toString().contains('geode-core/build')}
  }
}

artifacts {
  archives war
}

war {
  enabled = true
  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
  classpath configurations.runtimeClasspath
}
uiTest.dependsOn war
uiTest.finalizedBy rootProject.combineReports
rootProject.combineReports.mustRunAfter uiTest
