/**
 * 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.
 */
dependencies {
        def tomcatVersion = '7.0.54'
        tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
               "org.apache.tomcat.embed:tomcat-embed-logging-log4j:${tomcatVersion}" // NOT tomcat-embed-logging-juli (http://stackoverflow.com/questions/23963049/classcircularityerror-java-util-logging-logrecord-running-gradle-webapp-with-ja)
        tomcat("org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}") {
            exclude group: 'org.eclipse.jdt.core.compiler', module: 'ecj'
        }
        tomcat "org.apache.tomcat:tomcat-dbcp:${tomcatVersion}"

    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

    providedCompile(
//              [group: 'javax.servlet', name: 'servlet-api', version: '2.5'],
            )

    compile(
                [group: 'ch.vorburger.mariaDB4j', name: 'mariaDB4j', version: '2.1.3'],

                [group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion],
                [group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: springBootVersion],
                [group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: springBootVersion],
				//[group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.0.0'],
                [group: 'org.springframework', name: 'spring-context-support', version: springVersion],
				[group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: springOauthVersion],

				[group: 'org.apache.openjpa', name:'openjpa-all', version:'2.4.1'],
                [group: 'org.apache.openjpa', name:'openjpa-maven-plugin', version:'2.4.1'],
                [group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1'],
                [group: 'com.sun.jersey', name: 'jersey-core', version: jerseyVersion],
                [group: 'com.sun.jersey', name: 'jersey-servlet', version: jerseyVersion],
                [group: 'com.sun.jersey', name: 'jersey-server', version: jerseyVersion],
                [group: 'com.sun.jersey', name: 'jersey-json', version: jerseyVersion],
                [group: 'com.sun.jersey.contribs', name: 'jersey-spring', version: jerseyVersion],
                [group: 'com.sun.jersey.contribs', name: 'jersey-multipart', version: jerseyVersion],

                [group: 'com.squareup.retrofit', name: 'retrofit', version: '1.6.1'],
                [group: 'com.squareup.okhttp', name: 'okhttp', version: '2.0.0'],
                [group: 'com.squareup.okhttp', name: 'okhttp-urlconnection', version: '2.0.0'],


                [group: 'com.google.code.gson', name: 'gson', version: '2.2.4'],
                [group: 'com.google.guava', name: 'guava', version: '15.0'],

                [group: 'joda-time', name: 'joda-time', version: '2.4'],
                //[group: 'net.sourceforge.javacsv', name: 'javacsv', version: '2.0'],
                [group: 'org.apache.commons', name: 'commons-email', version: '1.3.3'],
                [group: 'org.apache.commons', name: 'commons-lang3', version: '3.3.2'],

                // no slf4j & logback here (anymore), as spring-boot-starter-logging already brings this now, better assembled (log4j-over-slf4j was originally forgotten here)

                //[group: 'mysql', name: 'mysql-connector-java', version: '5.1.27'],
                [group: 'org.drizzle.jdbc', name: 'drizzle-jdbc', version: '1.3'],
                [group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: tomcatVersion],

               
                [group: 'org.apache.poi',name: 'poi', version: '3.9'],
                [group: 'org.apache.poi',name: 'poi-ooxml', version: '3.9'],
                [group: 'org.apache.poi',name: 'poi-ooxml-schemas', version: '3.9'],

                [group: 'com.lowagie', name: 'itext', version: '2.1.7'],
                [group: 'com.lowagie', name: 'itext-rtf', version: '2.1.7'],
                [group: 'org.mnode.ical4j', name: 'ical4j', version: '1.0.4'],
                [group: 'com.googlecode.flyway', name: 'flyway-core', version: '2.1.1'],
                [group: 'org.quartz-scheduler', name: 'quartz', version: '2.1.7'],
                [group: 'com.amazonaws', name: 'aws-java-sdk-s3', version: '1.11.80'],
                [group: 'net.sf.ehcache', name: 'ehcache', version: '2.7.2'],
                [group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.8.12'],
                [group: 'com.jayway.jsonpath', name: 'json-path', version: '0.9.1'],
                [group: 'org.apache.tika', name: 'tika-core', version :'1.9'],
                // Although fineract (at the time of writing) doesn't have any compile time dep. on this,
                // it's useful to have this for the Spring Boot TestRestTemplate http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-rest-templates-test-utility
                [group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.5'],
                // Once we've switched to Java 8 this dep can be removed.
                //[group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.0']
                [group: 'org.springframework', name:'spring-jms'],
                [group: 'org.apache.activemq', name: 'activemq-broker']
     )
     testCompile 'junit:junit:4.11',
                 'junit:junit-dep:4.11',
                 'org.mockito:mockito-core:1.9.5',
                 'com.jayway.restassured:rest-assured:2.3.3',
                 [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springBootVersion],
                 [group: 'com.mockrunner', name: 'mockrunner-jms', version: '1.0.6'],
                 [group: 'com.mockrunner', name: 'mockrunner-jdbc', version: '1.0.6']

}
