/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed 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(':sched') {

  apply plugin: 'java'
  apply plugin: "org.inferred.processors"
  apply from: "$rootDir/gradle-script/checkstyle.gradle"
  apply from: "$rootDir/gradle-script/findbugs.gradle"

  sourceCompatibility = 1.8
  targetCompatibility = 1.8

  sourceSets {
      main {
          java {
              srcDirs = ['src']
          }
          resources {
              srcDirs = ['rsc']
          }
      }

      test {
          java {
              srcDirs = ['tests']
          }
      }
  }

  dependencies {
    testCompile libs.junit
    testCompileOnly libs.jsr305
    compileOnly libs.java_allocation_intrumenter
    compileOnly libs.jsr305
    compile libs.guava
    compile libs.freemarker
    compile libs.maths
    compile (libs.watchmaker) {
      // Avoid duplication and use com.google.guava version instead.
      exclude group: 'com.google.collections', module: 'google-collections'
      exclude group: 'org.uncommons.maths', module: 'uncommons-maths'
    }
    processor project(':sched:sched-ap')
    // testProcessor  project(':sched:sched-ap')
  }
}

javadoc {
  failOnError false
  destinationDir = file("${rootDir}/gradle-dist/doc/jack/jack-internal/sched")
}

project(':sched:schedtests') {

  apply plugin: 'java'
  apply plugin: "org.inferred.processors"

  sourceSets {
      main {
          java {
              srcDirs = ['../tests']
          }
      }
  }
    dependencies {
    compile project(':sched')
    compile libs.junit
    compileOnly libs.jsr305
    compile libs.guava
    processor project(':sched:sched-ap')
  }
}

project(':sched:sched-ap') {
  apply plugin: 'java'

  sourceCompatibility = 1.6
  targetCompatibility = 1.6

  sourceSets {
      main {
          java {
              srcDirs = ['../src']
              include 'com/android/sched/build/*'
              include 'com/android/sched/util/findbugs/*'
          }
          resources {
              srcDir '../rsc-ap'
          }
      }
  }

  dependencies {
    compileOnly libs.jsr305
  }

  jar {
      manifest {
          from '../etc/manifest.txt'
      }
  }

  // Until something better is found
  task deployToJack (type: Copy) {
    from jar.archivePath
    into "${rootDir}/jack/tools/"
  }
  task deployToSched (type: Copy) {
    from jar.archivePath
    into "${rootDir}/sched/tools/"
  }

  assemble.dependsOn deployToJack
  assemble.dependsOn deployToSched

}
