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

// This file contains common tasks and configuration for artifact generation.

// Create a configuration so that the test jar can be referenced in other modules.
configurations.create("test")

task testJar(type: Jar, dependsOn: testClasses, group: "Build") {
  description = "Assembles a jar archive containing the test classes."
  from sourceSets.test.output
  classifier = "tests"
  extension "jar"
}

task sourcesJar(type: Jar, dependsOn: classes, group: "Build") {
  description = "Assembles a jar archive containing the main source."
  from sourceSets.main.allSource
  classifier "sources"
  extension "jar"
}

task testSourcesJar(type: Jar, dependsOn: testJar, group: "Build") {
  description = "Assembles a jar archive containing the test source."
  from sourceSets.test.allSource
  classifier "test-sources"
  extension "jar"
}

task javadocJar(type: Jar, dependsOn: javadoc, group: "Build") {
  description = "Assembles a jar archive containing the javadoc."
  from javadoc.destinationDir
  classifier "javadoc"
  extension "jar"
}

tasks.withType(Jar) {
  // Configure the manifest content of the Jars.
  manifest {
    attributes "Implementation-Title": "$project.archivesBaseName"
    attributes "Implementation-Version": "$project.version"
  }
  from ("$rootDir/../NOTICE.txt") {
    into "META-INF"
  }
  from ("$rootDir/../LICENSE.txt") {
    into "META-INF"
  }
  // Prevent empty directories in the Jars.
  includeEmptyDirs = false
}

artifacts {
  test testJar
  archives testJar
  archives sourcesJar
  archives testSourcesJar
  archives javadocJar
}