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

// Configures JAR manifest entries

allprojects {
    // Declare these inline for now. Don't know if it makes sense to declare them
    // per-project.
    def title;
    def implementationTitle;
    def legaleseDir;
    if (project.path.startsWith(":lucene")) {
        implementationTitle = "org.apache.lucene"
        title = "Lucene Search Engine: ${project.name}"
        legaleseDir = project(":lucene").projectDir
    } else {
        implementationTitle = "org.apache.solr"
        title = "Apache Solr Search Server: ${project.name}"
        legaleseDir = project(":solr").projectDir
    }

    // Apply the manifest to any JAR or WAR file created by any project,
    // excluding those explicitly listed.
    tasks.withType(Jar)
            .matching { t -> !["sourcesJar", "javadocJar"].contains(t.name) }
            .configureEach { task ->
                // Compute git status once on the root project prior to assembling manifest.
                dependsOn ":gitStatus"

                // Because git status is a task we must defer computing this
                // until status has been computed. We do this with a provider.
                def implementationVersion = provider {
                    // LUCENE-9310: gitRev should always be there but IntelliJ does something
                    // awkward on import and resolves provider properties even though task dependencies
                    // have not been run yet?
                    def gitRev = rootProject.hasProperty("gitRev") ? rootProject.gitRev : ""

                    // For snapshot builds just include the project version and gitRev so that
                    // JARs don't need to be recompiled just because the manifest has changed.
                    if (snapshotBuild) {
                      return "${project.version} ${gitRev} [snapshot build, details omitted]"
                    } else {
                      return "${project.version} ${gitRev} - ${System.properties['user.name']} - ${buildDate} ${buildTime}"
                    }
                }

                manifest {
                    attributes([
                            "Extension-Name"        : implementationTitle,

                            "Implementation-Vendor" : "The Apache Software Foundation",
                            "Implementation-Title"  : implementationTitle,
                            "Implementation-Version": implementationVersion,

                            "Specification-Vendor"  : "The Apache Software Foundation",
                            "Specification-Version" : project.baseVersion,
                            "Specification-Title"   : title,

                            "X-Compile-Source-JDK"  : "${project.sourceCompatibility}",
                            "X-Compile-Target-JDK"  : "${project.targetCompatibility}",

                            "X-Build-JDK"           : "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})",
                            "X-Build-OS"            : "${System.properties['os.name']} ${System.properties['os.arch']} ${System.properties['os.version']}"
                    ])
                }

                // Copy legalese into META-INF.
                metaInf {
                    from(legaleseDir, {
                      include "LICENSE.txt"
                      include "NOTICE.txt"
                    })
                }
            }
}