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

project.ext.set("libraries", "")
ext.dw_version = "0.6.2";
ext.spring_version = "3.2.2.RELEASE";
ext.jackson_version = "2.5.1";

project.libraries = [
        dropwizard: "com.yammer.dropwizard:dropwizard-core:$dw_version",
        dropwizard_client: "com.yammer.dropwizard:dropwizard-client:$dw_version",
        dropwizrd_views: "com.yammer.dropwizard:dropwizard-views:$dw_version",
        guava: 'com.google.guava:guava:13.0.1',
        jersey_core: 'com.sun.jersey:jersey-core:1.1.4.1',

        //Spring
        springCore: "org.springframework:spring-core:$spring_version",
        springContext: "org.springframework:spring-context:$spring_version",
        springContextSupport: "org.springframework:spring-context-support:$spring_version",
        springExpression: "org.springframework:spring-expression:$spring_version",
        springTransaction: "org.springframework:spring-tx:$spring_version",
        springBeans: "org.springframework:spring-beans:$spring_version",
        springJersey: "com.sun.jersey.contribs:jersey-spring:1.7",

        // Security
        // Spring and Spring Security support for dropwizard
        fallwizard: "com.berico:fallwizard:1.1.1",
        // adheres to fallwizard version of spring security
        springSecurityCore: "org.springframework.security:spring-security-core:3.1.4.RELEASE",
        dropwizardAuth: "com.yammer.dropwizard:dropwizard-auth:$dw_version",

        // Spring test
        springTest: "org.springframework:spring-test:$spring_version",

        //Test libs
        dropwizard_testing: "com.yammer.dropwizard:dropwizard-testing:$dw_version",
        junit: 'junit:junit-dep:4.11',
        mockito: 'org.mockito:mockito-core:1.9.0',
        hamcrest: 'org.hamcrest:hamcrest-library:1.3',
        selenium_java: 'org.seleniumhq.selenium:selenium-java:2.41.0',
        jersey_client: 'com.sun.jersey:jersey-client:1.17.1',
        jersey_grrizle: 'com.sun.jersey.jersey-test-framework:jersey-test-framework-grizzly:1.17',

        // Others
        freemarker: 'org.freemarker:freemarker:2.3.24-incubating',
        jackson_databind: "com.fasterxml.jackson.core:jackson-databind:$jackson_version",
        commonLangs: "org.apache.commons:commons-lang3:3.3.2",
        findBugs: "com.google.code.findbugs:annotations:3.0.0"

]