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

plugins {
	id 'java'
	id 'idea'
	id 'propdeps' version '0.0.9.RELEASE'
	id 'propdeps-maven' version '0.0.9.RELEASE'
	id 'propdeps-idea' version '0.0.9.RELEASE'
	id 'propdeps-eclipse' version '0.0.9.RELEASE'
	id 'org.springframework.boot' version '1.5.9.RELEASE'
	id 'org.unbroken-dome.test-sets' version '1.4.2'
	id 'net.researchgate.release' version '2.6.0'
}

repositories {
	mavenCentral()
	maven {
	mavenLocal()
		url "https://artifacts.unidata.ucar.edu/content/repositories/unidata-releases/"
	}
}

ext{
	nexusprotoVersion = "1.0.0"
	protobufUtilVersion = "3.5.1"
	netcdfJavaVersion = '4.6.9'
	guavaVersion = "23.2-jre"
}

testSets {
	testJobs
}

dependencyManagement {
	imports {
		mavenBom 'com.amazonaws:aws-java-sdk-bom:1.10.77+'
	}
}

dependencies {
	optional "org.springframework.boot:spring-boot-configuration-processor"

	compile("org.springframework.boot:spring-boot-starter-batch")
	compile("org.springframework:spring-web")
	compile("org.springframework.data:spring-data-cassandra")
	compile("org.springframework.data:spring-data-solr")

	compile("com.h2database:h2")
	compile("mysql:mysql-connector-java")
	compile("org.apache.sdap:nexusproto:$nexusprotoVersion")
	compile("com.google.protobuf:protobuf-java-util:$protobufUtilVersion")

	compile("edu.ucar:cdm:${netcdfJavaVersion}")
    compile("com.google.guava:guava")

	compile("com.amazonaws:aws-java-sdk-s3")
	compile("com.amazonaws:aws-java-sdk-dynamodb")

	testCompile('org.springframework.boot:spring-boot-starter-test')
	testCompile('org.springframework.batch:spring-batch-test')

	testJobsCompile sourceSets.test.output
}

compileJava.dependsOn(processResources)