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

// Versions of Dependencies;
def asmVersion = '5.0.4'
def bonecpVersion = '0.8.0.RELEASE'
def bouncyVersion = '1.52'
def commonsDbcpVersion = '1.4' // Should be moved to commons-dbcp2
def commonsLangVersion = '2.6' // Should be moved to commons-lang3
def derbyVersion = '10.11.1.1'
def dnsJavaVersion = '2.1.7'
def ehcacheVersion = '2.10.0'
def elasticsearchVersion = '1.6.0'
def freemarkerVersion = '2.3.22'
def groovyVersion = '2.4.3'
def h2Version = '1.4.187'
def hazelcastVersion = '3.5'
def httpClientVersion = '4.2.2' // 4.3.4 exists
def jacksonVersion = '2.5.4'
def javascriptVersion = '1.7.7'
def javasqlgeneratorVersion = '0.3.2'
def jcloudsVersion = '1.9.0'
def jdbmVersion = '2.4'
def jedisVersion = '2.7.2'
def jettyVersion = '9.2.11.v20150529' // 9.3.x Tests fail!
def jgoodiesLooksVersion = '2.5.3'
def jodaMoneyVersion = '0.10.0'
def jodaTimeVersion = '2.8.1'
def jtaVersion = '1.1'
def leveldbVersion = '0.7'
def leveldbJniVersion = '1.8'
def liquibaseVersion = '3.4.0'
def logbackVersion = '1.1.3'
def mongodbVersion = '2.13.2' // 3.0.x Fails to compile!
def mysqlVersion = '5.1.35'
def orgJsonVersion = '20130213'
def osgiVersion = '4.2.0' // 4.3.0 Fails to compile! - 5.0.0 exists
def pdfboxVersion = '1.8.5'
def postgresqlVersion = '9.4-1201-jdbc41'
def prefuseVersion = '0.21'
def restletVersion = '2.3.4'
def rdfVersion = '2.7.9'
def riakVersion = '1.4.4' // 2.0.x Fails to compile!
def scalaVersion = '2.11.6'
def servletVersion = '3.1.0'
def shiroVersion = '1.2.3'
def skedVersion = '2.1'
def slf4jVersion = '1.7.12'
def solrVersion = "1.4.1" // 4.8.1 Fails to compile!
def springVersion = '4.1.7.RELEASE'
def spymemcachedVersion = '2.12.0'
def sqliteVersion = '3.8.10.1'
def velocityVersion = '1.7'
def wicketVersion = '1.5.8' // 6.15.0 Samples fails to compile!
def wicketStatelessVersion = '1.5.0'
def woodstoxVersion = '4.4.1'
def yammerMetricsVersion = '2.2.0'

def antVersion = '1.9.5'
def awaitilityVersion = '1.6.3'
def easyMockVersion = '3.3.1'
def jmockVersion = '2.8.1'
def junitVersion = '4.11'
def mockitoVersion = '1.10.19'
def testNgVersion = '6.9.4'
def restAssuredVersion= '2.4.1'
def xmlunitVersion = '1.6'

// build a map of the dependency artifacts to use.  Allows centralized definition of the version of artifacts to
// use.  In that respect it serves a role similar to <dependencyManagement> in Maven

rootProject.ext {
  libraries = [
          // Ant
          ant: "org.apache.ant:ant:$antVersion",
          ant_junit: "org.apache.ant:ant-junit:$antVersion",

          // ASM
          asm: "org.ow2.asm:asm:$asmVersion",
          asm_util: "org.ow2.asm:asm-util:$asmVersion",
          asm_commons: "org.ow2.asm:asm-commons:$asmVersion",

          // OSGi
          osgi_core: "org.osgi:org.osgi.core:$osgiVersion",
          osgi_compendium: "org.osgi:org.osgi.compendium:$osgiVersion",
          osgi_enterprise: "org.osgi:org.osgi.enterprise:$osgiVersion",

          // logging
          slf4j_api: "org.slf4j:slf4j-api:$slf4jVersion",
          slf4j_simple: "org.slf4j:slf4j-simple:$slf4jVersion",
          logback: 'ch.qos.logback:logback-classic:' + logbackVersion,
          jcl_slf4j: "org.slf4j:jcl-over-slf4j:$slf4jVersion",
          jcl_api: 'commons-logging:commons-logging-api:99.0-does-not-exist',  //ensure it is never used.
          jcl: 'commons-logging:commons-logging:99.0-does-not-exist',  // ensure it is never used.

          // org.json
          org_json: "org.codeartisans:org.json:$orgJsonVersion",

          // Restlet
          restlet: [
                  "org.restlet.jee:org.restlet:$restletVersion",
//                  "org.restlet.jee:org.restlet.ext.ssl:$restletVersion",
                  "org.restlet.jee:org.restlet.ext.atom:$restletVersion",
                  "org.restlet.jee:org.restlet.ext.servlet:$restletVersion",
                  "org.restlet.jee:org.restlet.ext.slf4j:$restletVersion"
          ],

          // Scala
          scala:  "org.scala-lang:scala-library:$scalaVersion",

          // Spring
          spring_core: [
                  "org.springframework:spring-beans:$springVersion",
                  "org.springframework:spring-context:$springVersion"
          ],

          spring_testsupport: [
                  "org.springframework:spring-test:$springVersion"
          ],

          // RDF
          sesame: [ "org.openrdf.sesame:sesame-model:$rdfVersion",
                  "org.openrdf.sesame:sesame-queryparser-sparql:$rdfVersion",
                  "org.openrdf.sesame:sesame-repository-dataset:$rdfVersion",
                  "org.openrdf.sesame:sesame-repository-http:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-api:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-n3:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-ntriples:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-rdfxml:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-trig:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-trix:$rdfVersion",
                  "org.openrdf.sesame:sesame-rio-turtle:$rdfVersion",
                  "org.openrdf.sesame:sesame-sail-api:$rdfVersion",
                  "org.openrdf.sesame:sesame-sail-memory:$rdfVersion",
                  "org.openrdf.sesame:sesame-sail-nativerdf:$rdfVersion",
                  "org.openrdf.sesame:sesame-sail-rdbms:$rdfVersion"
          ],
          sparql: [
                  "org.openrdf.sesame:sesame-queryresultio-sparqlxml:$rdfVersion",
                  "org.openrdf.sesame:sesame-queryresultio-sparqljson:$rdfVersion"
          ],

          // SOLR
          solr: [ "org.apache.solr:solr-core:$solrVersion",
                  "org.apache.solr:solr-solrj:$solrVersion"
          ],

          // Jetty
          jetty_server: "org.eclipse.jetty:jetty-server:$jettyVersion",
          jetty_webapp: "org.eclipse.jetty:jetty-webapp:$jettyVersion",
          jetty_servlet: "org.eclipse.jetty:jetty-servlet:$jettyVersion",
          jetty_http: "org.eclipse.jetty:jetty-http:$jettyVersion",
          jetty_io: "org.eclipse.jetty:jetty-io:$jettyVersion",
          jetty_jmx: "org.eclipse.jetty:jetty-jmx:$jettyVersion",
          jetty_security: "org.eclipse.jetty:jetty-security:$jettyVersion",
          jetty_jsp: "org.eclipse.jetty:jetty-jsp:$jettyVersion",
          jetty_util: "org.eclipse.jetty:jetty-util:$jettyVersion",
          jetty_continuation: "org.eclipse.jetty:jetty-continuation:$jettyVersion",
          jetty_client: "org.eclipse.jetty:jetty-client:$jettyVersion",
          jetty_xml: "org.eclipse.jetty:jetty-xml:$jettyVersion",

          // Scripting
          groovy: "org.codehaus.groovy:groovy-all:$groovyVersion",

          javascript: "org.mozilla:rhino:$javascriptVersion",

          // Wicket
          wicket: [ "org.apache.wicket:wicket-core:$wicketVersion",
                  "org.apache.wicket:wicket-datetime:$wicketVersion",
                  "org.apache.wicket:wicket-extensions:$wicketVersion"
          ],
          wicket_devutils: "org.apache.wicket:wicket-devutils:$wicketVersion",
          wicket_stateless: "com.jolira:wicket-stateless:$wicketStatelessVersion",

          // Library & Extension dependencies
          jackson_mapper: "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion",
          jodamoney: "org.joda:joda-money:$jodaMoneyVersion",
          jodatime: "joda-time:joda-time:$jodaTimeVersion",
          ehcache: "net.sf.ehcache:ehcache:$ehcacheVersion",
          elasticsearch: "org.elasticsearch:elasticsearch:$elasticsearchVersion",
          h2: "com.h2database:h2:$h2Version",
          hazelcast: "com.hazelcast:hazelcast:$hazelcastVersion",
          jclouds_core: "org.apache.jclouds:jclouds-core:$jcloudsVersion",
          jclouds_blobstore: "org.apache.jclouds:jclouds-allblobstore:$jcloudsVersion",
          jclouds_filesystem: "org.apache.jclouds.api:filesystem:$jcloudsVersion",
          jdbm: "jdbm:jdbm:$jdbmVersion",
          jedis: "redis.clients:jedis:$jedisVersion",
          jgoodies_looks: "com.jgoodies:jgoodies-looks:$jgoodiesLooksVersion",
          leveldb_api: "org.iq80.leveldb:leveldb-api:$leveldbVersion",
          leveldb_java: "org.iq80.leveldb:leveldb:$leveldbVersion",
          leveldb_jni_all: "org.fusesource.leveldbjni:leveldbjni-all:$leveldbJniVersion",
          mongodb: "org.mongodb:mongo-java-driver:$mongodbVersion",
          riak: "com.basho.riak:riak-client:$riakVersion",
          jta: "javax.transaction:jta:$jtaVersion",
          javaSqlGenerator: "org.java-sql-generator:org.java-sql-generator.api:$javasqlgeneratorVersion",
          javaSqlGeneratorImpl: "org.java-sql-generator:org.java-sql-generator.implementation:$javasqlgeneratorVersion",
          velocity: "org.apache.velocity:velocity:$velocityVersion",
          commons_dbcp: "commons-dbcp:commons-dbcp:$commonsDbcpVersion",
          commons_lang: "commons-lang:commons-lang:$commonsLangVersion",
          servlet_api: "javax.servlet:javax.servlet-api:$servletVersion",
          http_client: "org.apache.httpcomponents:httpclient:$httpClientVersion",
          woodstox: "org.codehaus.woodstox:woodstox-core-asl:$woodstoxVersion",
          restlet_xml: "org.restlet.jee:org.restlet.ext.xml:$restletVersion",
          bouncy_castle: "org.bouncycastle:bcprov-jdk15on:$bouncyVersion",
          dnsjava: "dnsjava:dnsjava:$dnsJavaVersion",
          freemarker: "org.freemarker:freemarker:$freemarkerVersion",
          shiro: "org.apache.shiro:shiro-core:$shiroVersion",
          shiro_web: "org.apache.shiro:shiro-web:$shiroVersion",
          bonecp: "com.jolbox:bonecp:$bonecpVersion",
          liquibase: "org.liquibase:liquibase-core:$liquibaseVersion",
          sked: "org.codeartisans:sked:$skedVersion",
          yammer_metrics: "com.yammer.metrics:metrics-core:$yammerMetricsVersion",
          pdfbox: "org.apache.pdfbox:pdfbox:$pdfboxVersion",
          prefuse: "de.sciss:prefuse-core:$prefuseVersion",
          spymemcached: "net.spy:spymemcached:$spymemcachedVersion",

          // Testing
          junit: "junit:junit:$junitVersion",
          awaitility: "com.jayway.awaitility:awaitility:$awaitilityVersion",
          easymock: "org.easymock:easymock:$easyMockVersion",
          jmock: "org.jmock:jmock:$jmockVersion",
          mockito: "org.mockito:mockito-core:$mockitoVersion",
          rest_assured: "com.jayway.restassured:rest-assured:$restAssuredVersion",
          testng: "org.testng:testng:$testNgVersion",
          xmlunit: "xmlunit:xmlunit:$xmlunitVersion",
          
          // Tests dependencies
          derby: "org.apache.derby:derby:$derbyVersion",
          derbyclient: "org.apache.derby:derbyclient:$derbyVersion",
          derbynet: "org.apache.derby:derbynet:$derbyVersion",
          postgres: "org.postgresql:postgresql:$postgresqlVersion",
          mysql_connector: "mysql:mysql-connector-java:$mysqlVersion",
          sqlite: "org.xerial:sqlite-jdbc:$sqliteVersion",
  ]
}

// Global transitive dependencies substitution rules
// See https://docs.gradle.org/current/userguide/dependency_management.html#dependency_substitution_rules
// See https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.DependencySubstitutions.html
allprojects {
  configurations.all {
    resolutionStrategy.dependencySubstitution.all { DependencySubstitution dep ->
      if( dep.requested instanceof ModuleComponentSelector ) {
        // Always resolve SLF4J to the same version
        if( dep.requested.group == 'org.slf4j' ) {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: slf4jVersion
        }
        // Always resolve ASM to the same version
        if( dep.requested.group == 'org.ow2.asm' ) {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: asmVersion
        }
        // Always resolve OSGi to the same version
        if( dep.requested.group == 'org.osgi' ) {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: osgiVersion
        }
        // Always resolve Jackson to the same version
        if( dep.requested.group.startsWith( 'com.fasterxml.jackson' ) && dep.requested.module != 'jackson-parent' ) {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: jacksonVersion
        }
        // woodstox:wstx-asl is broken (no pom), use org.codehaus.woodstox:wstx-asl instead
        if( dep.requested.group == 'woodstox' && dep.requested.module == 'wstx-asl' ) {
          dep.useTarget group: 'org.codehaus.woodstox', name: 'wstx-asl', version: dep.requested.version
        }
        // some bad citizens have SNAPSHOT parents ...
        if( dep.requested.module == 'commons-sandbox-parent' && dep.requested.version == '3-SNAPSHOT') {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: '3'
        }
        // GSON 2.3 POM is invalid, use 2.3.1 instead .. see https://github.com/google/gson/issues/588
        if( dep.requested.group == 'com.google.code.gson' && dep.requested.module == 'gson' && dep.requested.version == '2.3' ) {
          dep.useTarget group: dep.requested.group, name: dep.requested.module, version: '2.3.1'
        }
        // Findbugs Annotation is LGPL, use https://github.com/stephenc/findbugs-annotations which is
        // Apache 2 licensed instead
        if( dep.requested.group == 'net.sourceforge.findbugs' && dep.requested.module == 'annotations' ) {
          dep.useTarget group: 'com.github.stephenc.findbugs', name: 'findbugs-annotations', version: '1.3.9-1'
        }
      }
    }
  }
}
