/*
 * 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.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
}
uiTest.dependsOn war
uiTest.finalizedBy rootProject.combineReports
rootProject.combineReports.mustRunAfter uiTest
