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


// Maven publications and configuration.
//
// the 'published' list contains an explicit list of all projects
// which should be published to Maven repositories.

configure(rootProject) {
  ext {
    published = [
        ":lucene:analysis:common",
        ":lucene:analysis:icu",
        ":lucene:analysis:kuromoji",
        ":lucene:analysis:morfologik",
        ":lucene:analysis:nori",
        ":lucene:analysis:opennlp",
        ":lucene:analysis:phonetic",
        ":lucene:analysis:smartcn",
        ":lucene:analysis:stempel",
        ":lucene:backward-codecs",
        ":lucene:benchmark",
        ":lucene:classification",
        ":lucene:codecs",
        ":lucene:core",
        ":lucene:demo",
        ":lucene:expressions",
        ":lucene:facet",
        ":lucene:grouping",
        ":lucene:highlighter",
        ":lucene:join",
        ":lucene:luke",
        ":lucene:memory",
        ":lucene:misc",
        ":lucene:monitor",
        ":lucene:queries",
        ":lucene:queryparser",
        ":lucene:replicator",
        ":lucene:sandbox",
        ":lucene:spatial-extras",
        ":lucene:spatial3d",
        ":lucene:suggest",
        ":lucene:test-framework",

        ":solr:core",
        ":solr:solrj",
        ":solr:contrib:analysis-extras",
        ":solr:contrib:analytics",
        ":solr:contrib:clustering",
        ":solr:contrib:extraction",
        ":solr:contrib:langid",
        ":solr:contrib:jaegertracer-configurator",
        ":solr:contrib:prometheus-exporter",
        ":solr:contrib:scripting",
        ":solr:test-framework",
    ]

    apacheNexusSnapshots = "https://repository.apache.org/content/repositories/snapshots"
  }
}

configure(subprojects.findAll { it.path in rootProject.published }) { prj ->
  apply plugin: 'maven-publish'
  apply plugin: 'signing'

  publishing {
    repositories {
      maven {
        name = "ApacheSnapshots"
        url = apacheNexusSnapshots

        credentials {
          def nexusUserName = rootProject.propertyOrDefault('asfNexusUsername', null)
          def nexusPwd = rootProject.propertyOrDefault('asfNexusPassword', null)
          if (nexusUserName && nexusPwd) {
            username nexusUserName
            password nexusPwd
          }
        }
      }
    }
  }

  // Do not generate gradle metadata files.
  tasks.withType(GenerateModuleMetadata) {
    enabled = false
  }

  plugins.withType(JavaPlugin) {
    task sourcesJar(type: Jar, dependsOn: classes) {
      archiveClassifier = 'sources'
      from sourceSets.main.allJava
    }

    task javadocJar(type: Jar, dependsOn: javadoc) {
      archiveClassifier = 'javadoc'
      from javadoc.destinationDir
    }

    // This moves publishing configuration after all the scripts of all projects
    // have been evaluated. This is required because we set artifact groups
    // and archivesBaseName in other scripts (artifact-naming.gradle) and
    // maven pom does not accept lazy property providers (so everything must
    // be in its final form).
    //
    // In theory project.afterEvaluate closure should also work but for some reason
    // it fired earlier than artifact-naming.gradle; don't know whether it's a bug
    // in gradle or just complex relationships between lazy collection hooks.
    gradle.projectsEvaluated {
      publishing {
        def configurePom;
        if (project.path.startsWith(":lucene")) {
          configurePom = {
            name = "Apache Lucene (module: ${project.name})"
            description = name
            url = 'https://lucene.apache.org/'

            licenses {
              license {
                name = 'Apache 2'
                url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
              }
            }

            inceptionYear = "2000"

            issueManagement {
              system = "JIRA"
              url = "https://issues.apache.org/jira/browse/LUCENE"
            }

            ciManagement {
              system = "Jenkins"
              url = "https://builds.apache.org/job/Lucene/"
            }

            mailingLists {
              mailingList {
                name = "General List"
                subscribe = "general-subscribe@lucene.apache.org"
                unsubscribe = "general-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-general/"
              }

              mailingList {
                name = "Java User List"
                subscribe = "java-user-subscribe@lucene.apache.org"
                unsubscribe = "java-user-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-java-user/"
              }

              mailingList {
                name = "Java Developer List"
                subscribe = "dev-subscribe@lucene.apache.org"
                unsubscribe = "dev-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-dev/"
              }

              mailingList {
                name = "Java Commits List"
                subscribe = "commits-subscribe@lucene.apache.org"
                unsubscribe = "commits-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-java-commits/"
              }
            }

            scm {
              connection = 'scm:git:https://gitbox.apache.org/repos/asf/lucene-solr.git'
              developerConnection = 'scm:git:https://gitbox.apache.org/repos/asf/lucene-solr.git'
              url = 'https://gitbox.apache.org/repos/asf?p=lucene-solr.git'
            }
          }
        } else {
          configurePom = {
            name = "Apache Solr (module: ${project.name})"
            description = name
            url = 'https://lucene.apache.org/solr/'

            licenses {
              license {
                name = 'Apache 2'
                url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
              }
            }

            inceptionYear = "2006"

            issueManagement {
              system = "JIRA"
              url = "https://issues.apache.org/jira/browse/SOLR"
            }

            ciManagement {
              system = "Jenkins"
              url = "https://builds.apache.org/job/Lucene/"
            }

            mailingLists {
              mailingList {
                name = "Solr User List"
                subscribe = "solr-user-subscribe@lucene.apache.org"
                unsubscribe = "solr-user-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/solr-user/"
              }

              mailingList {
                name = "Java Developer List"
                subscribe = "dev-subscribe@lucene.apache.org"
                unsubscribe = "dev-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-dev/"
              }

              mailingList {
                name = "Java Commits List"
                subscribe = "commits-subscribe@lucene.apache.org"
                unsubscribe = "commits-unsubscribe@lucene.apache.org"
                archive = "https://mail-archives.apache.org/mod_mbox/lucene-java-commits/"
              }
            }

            scm {
              connection = 'scm:git:https://gitbox.apache.org/repos/asf/lucene-solr.git'
              developerConnection = 'scm:git:https://gitbox.apache.org/repos/asf/lucene-solr.git'
              url = 'https://gitbox.apache.org/repos/asf?p=lucene-solr.git'
            }
          }
        }

        publications {
          jars(MavenPublication) {
            from components.java
            groupId = project.group
            artifactId = project.archivesBaseName

            artifact sourcesJar
            artifact javadocJar

            pom(configurePom)

            pom({
              // LUCENE-9561:
              // Remove dependencyManagement section created by a combination of
              // Palantir and the publishing plugin.
              //
              // https://github.com/palantir/gradle-consistent-versions/issues/550
              withXml {
                asNode().dependencyManagement.replaceNode {}
              }
            })
          }
        }
      }

      // Add aliases of convention tasks with shorter names.
      task mavenToApacheSnapshots() {
        group "Publishing"
        description "Publish Maven JARs and POMs to Apache Snapshots repository: ${apacheNexusSnapshots}"

        dependsOn "publishJarsPublicationToApacheSnapshotsRepository"
      }

      signing {
        required { !version.endsWith("SNAPSHOT") }
        sign publishing.publications.jars
      }
    }
  }
}
