/*
 * 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/publish-war.gradle"


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-junit')) {
    exclude module: 'geode-core'
  }
  testCompile(project(':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-junit')) {
    exclude module: 'geode-core'
  }
  integrationTestCompile(project(':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')


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

  uiTestRuntime(project(':geode-core'))
}

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 {
  duplicatesStrategy = DuplicatesStrategy.EXCLUDE
  classpath configurations.runtimeClasspath
  classpath project(':geode-core').webJar.archivePath
}
war.dependsOn(':geode-core:webJar')
uiTest.dependsOn war
uiTest.finalizedBy rootProject.combineReports
rootProject.combineReports.mustRunAfter uiTest
