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

sourceSets {
  jca {
    compileClasspath += configurations.compile
    runtimeClasspath += configurations.runtime
  }
}

configurations {
  //declaring new configuration that will be used to associate with artifacts
  archives
}

dependencies {
   // Source Dependencies
  // External 
  provided files("${System.getProperty('java.home')}/../lib/tools.jar")
  compile 'com.github.stephenc.findbugs:findbugs-annotations:' + project.'stephenc-findbugs.version'
  compile 'org.jgroups:jgroups:' + project.'jgroups.version'
  compile 'antlr:antlr:' + project.'antlr.version'
  compile 'com.fasterxml.jackson.core:jackson-databind:' + project.'jackson.version'
  compile 'commons-io:commons-io:' + project.'commons-io.version'
  compile 'commons-lang:commons-lang:' + project.'commons-lang.version'
  compile ('commons-modeler:commons-modeler:' + project.'commons-modeler.version') {
    exclude module: 'commons-digester'
    exclude module: 'commons-logging-api'
    exclude module: 'mx4j-jmx'
    exclude module: 'xml-apis'
    ext.optional = true
  }
  compile ('io.netty:netty-all:' + project.'netty-all.version') {
    ext.optional = true
  }
  compile 'it.unimi.dsi:fastutil:' + project.'fastutil.version'
  compile ('javax.mail:javax.mail-api:' + project.'javax.mail-api.version') {
    ext.optional = true;
  }
  compile 'javax.resource:javax.resource-api:' + project.'javax.resource-api.version'
  compile ('mx4j:mx4j:' + project.'mx4j.version') {
    ext.optional = true;
  }
  compile ('mx4j:mx4j-remote:' + project.'mx4j.version') {
    ext.optional = true;
  }
  compile ('mx4j:mx4j-tools:' + project.'mx4j.version') {
    ext.optional = true;
  }
  compile ('net.java.dev.jna:jna:' + project.'jna.version')

  compile ('net.sf.jopt-simple:jopt-simple:' + project.'jopt-simple.version')

  compile 'org.apache.logging.log4j:log4j-api:' + project.'log4j.version'
  compile 'org.apache.logging.log4j:log4j-core:' + project.'log4j.version'
  runtime ('org.fusesource.jansi:jansi:' + project.'jansi.version') {
    ext.optional = true
  }
  runtime ('org.apache.logging.log4j:log4j-slf4j-impl:' + project.'log4j.version') {
    ext.optional = true
  }
  runtime ('org.apache.logging.log4j:log4j-jcl:' + project.'log4j.version') {
    ext.optional = true
  }
  runtime ('org.apache.logging.log4j:log4j-jul:' + project.'log4j.version') {
    ext.optional = true
  }
  compile ('org.eclipse.jetty:jetty-webapp:' + project.'jetty.version') {
    ext.optional = true
  }
  provided ('org.springframework:spring-webmvc:' + project.'springframework.version') {
    exclude module: 'aopalliance'
    exclude module: 'spring-aop'
    ext.optional = true
  }
  compile ('org.springframework:spring-core:' + project.'springframework.version') {
    ext.optional = true
  }
  compile ('org.springframework.shell:spring-shell:' + project.'spring-shell.version') {
    exclude module: 'aopalliance'
    exclude module: 'asm'
    exclude module: 'cglib'
    exclude module: 'guava'
    exclude module: 'spring-aop'
    exclude module: 'spring-context-support'
    ext.optional = true
  }
  compile ('org.iq80.snappy:snappy:' + project.'snappy-java.version') {
    ext.optional = true
  } 

  compile 'org.apache.shiro:shiro-core:' + project.'shiro.version'
 
  compile project(':geode-common')
  compile project(':geode-json')
  
  jcaCompile sourceSets.main.output

  testCompile project(':geode-junit')

  // Test Dependencies
  // External
  testCompile 'org.apache.bcel:bcel:' + project.'bcel.version'
  testRuntime 'org.apache.derby:derby:' + project.'derby.version'
  testCompile 'org.mockito:mockito-core:' + project.'mockito-core.version'
  testRuntime 'commons-collections:commons-collections:' + project.'commons-collections.version'
  testRuntime 'commons-configuration:commons-configuration:' + project.'commons-configuration.version'
  testRuntime 'commons-io:commons-io:' + project.'commons-io.version'
  testCompile 'net.spy:spymemcached:' + project.'spymemcached.version'
  testCompile 'redis.clients:jedis:' + project.'jedis.version'

  testCompile 'org.powermock:powermock-core:' + project.'powermock.version'
  testCompile 'org.powermock:powermock-module-junit4:' + project.'powermock.version'
  testCompile 'org.powermock:powermock-api-mockito:' + project.'powermock.version'
}

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

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

// Creates the version properties file and writes it to the classes dir
task createVersionPropertiesFile {
  def propertiesFile = file(generatedResources + "/org/apache/geode/internal/GemFireVersion.properties");
  outputs.file propertiesFile
  inputs.dir compileJava.destinationDir

  doLast {
    def props = [
      "Product-Name"      : productName,
      "Product-Version"   : version,
      "Build-Id"          : "${System.env.USER} ${buildId}".toString(),
      "Build-Date"        : new Date().format('yyyy-MM-dd HH:mm:ss Z'),
      "Build-Platform"    : "${System.properties['os.name']} ${System.properties['os.version']} ${System.properties['os.arch']}".toString(),
      "Build-Java-Version": System.properties['java.version']
    ] as Properties
    props.putAll(readScmInfo())

    propertiesFile.getParentFile().mkdirs();
    new FileOutputStream(propertiesFile).withStream { fos ->
      props.store(fos, '')
    }
  }
}

jar {

  from sourceSets.main.output
  from sourceSets.jca.output
  
  exclude 'org/apache/geode/management/internal/web/**'
  exclude 'org/apache/geode/internal/i18n/StringIdResourceBundle_ja.txt'
  exclude 'org/apache/geode/admin/doc-files/ds4_0.dtd'
}

task webJar (type: Jar, dependsOn: classes) {
  description 'Assembles the jar archive containing the gemfire management web classes.'
  from sourceSets.main.output
  baseName 'geode-web'
  include 'org/apache/geode/management/internal/web/**'
}

task raJar (type: Jar, dependsOn: classes) {
  description 'Assembles the jar archive that contains the JCA classes'
  from sourceSets.jca.output
  exclude 'org/apache/geode/ra/**'
  archiveName 'ra.jar'
}

task jcaJar (type: Jar, dependsOn: raJar) {
  description 'Assembles the jar archive that contains the JCA bundle'
  baseName 'geode-jca'
  extension 'rar'
  metaInf { from 'src/jca/ra.xml' }
  from raJar.archivePath
}

configurations {
  classesOutput {
    extendsFrom compile
    description  'a dependency that exposes the compiled classes'
  }
}

dependencies {
  classesOutput sourceSets.main.output
}
