/*
 * 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 "base"
    id "io.spring.dependency-management" version "1.0.10.RELEASE"
}

allprojects  {
  group = 'org.apache.mnemonic'
  version = '0.14.0-SNAPSHOT'
}

subprojects {
  apply plugin: 'java-library'
  apply plugin: 'io.spring.dependency-management'

  dependencyManagement {
    dependencies {
      dependency 'org.apache.commons:commons-lang3:3.4'
      dependency 'org.testng:testng:6.8.17'
      dependency 'org.flowcomputing.commons:commons-resgc:0.8.17.1'
      dependency 'org.flowcomputing.commons:commons-primitives:0.6.1'
      dependency 'commons-cli:commons-cli:1.3.1'
      dependency 'com.squareup:javapoet:1.11.1'
      dependency 'org.slf4j:slf4j-api:1.7.21'
      dependency 'org.slf4j:slf4j-log4j12:1.7.21'
      dependency 'org.slf4j:jul-to-slf4j:1.7.21'
      dependency 'org.slf4j:jcl-over-slf4j:1.7.21'
      dependency 'log4j:log4j:1.2.17'
      dependency 'ch.qos.logback:logback-classic:1.1.7'
      dependency 'ch.qos.logback:logback-core:1.1.7'
    }
  }

  repositories {
    maven { url "http://repo.maven.apache.org/maven2" }
    mavenCentral()
  }

  sourceCompatibility = 1.8
  targetCompatibility = 1.8
  tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
  }

  configurations.all {
  }
}

build.doFirst {
   throw new GradleException('The Gradle is not functional yet.')
}