/*
 * 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.0.15' // 2.2.1 Fails to compile!
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
        }
        // 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'
        }
      }
    }
  }
}
