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

ext.dropwizard_version = "1.3.14";
ext.jersey_version = "2.25.1"; // Keep in sync with dropwizard jersey dependency!

ext.libraries = [
        // Dropwizard:
        dropwizard: "io.dropwizard:dropwizard-core:$dropwizard_version",
        dropwizard_client: "io.dropwizard:dropwizard-client:$dropwizard_version",
        dropwizard_views: "io.dropwizard:dropwizard-views:$dropwizard_version",
        dropwizard_views_freemarker: "io.dropwizard:dropwizard-views-freemarker:$dropwizard_version",
        dropwizard_assets: "io.dropwizard:dropwizard-assets:$dropwizard_version",
        dropwizard_configurable_assets: "io.dropwizard-bundles:dropwizard-configurable-assets-bundle:1.0.5",
        dropwizard_bundles_redirect: "io.dropwizard-bundles:dropwizard-redirect-bundle:1.2.2",

        // App. specific:
        freemarker: "org.freemarker:freemarker:2.3.29",
        jersey_core: "org.glassfish.jersey.core:jersey-core:$jersey_version",

        // Commons:
        findBugs: "com.google.code.findbugs:annotations:3.0.0",
        commonLangs: "org.apache.commons:commons-lang3:3.7",
        guava: "com.google.guava:guava:24.1-jre",

        // Test:
        dropwizard_testing: "io.dropwizard:dropwizard-testing:$dropwizard_version",
        dropwizard_client: "io.dropwizard:dropwizard-client:$dropwizard_version",
        junit: "junit:junit:4.12",
        mockito: "org.mockito:mockito-core:2.16.0",
        hamcrest: "org.hamcrest:hamcrest-library:1.3",
        jersey_grrizle: "org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2:$jersey_version",
        
        // Build:
        rat: "org.apache.rat:apache-rat-tasks:0.12"
]