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

allprojects {
  apply plugin: 'base'

  group "org.apache"

  // Repositories to fetch dependencies from.
  repositories {
    mavenCentral()
    maven {
      url "https://maven.restlet.com"
    }
  }

  // Artifacts will have names after full gradle project path
  // so :solr:core will have solr-core.jar, etc.
  project.archivesBaseName = project.path.replaceAll("^:", "").replace(':', '-')

  ext {
    // Utility method to support passing overrides via -P or -D.
    propertyOrDefault = { propName, defValue ->
      def result
      if (project.hasProperty(propName)) {
        result = project.getProperty(propName)
      } else if (System.properties.containsKey(propName)) {
        result = System.properties.get(propName)
      } else if (defValue instanceof Closure) {
        result = defValue.call()
      } else {
        result = defValue
      }
      return result
    }

    // System environment variable or default.
    envOrDefault = { envName, defValue ->
      return Objects.requireNonNullElse(System.getenv(envName), defValue);
    }

    // Either a project, system property, environment variable or default value.
    propertyOrEnvOrDefault = { propName, envName, defValue ->
      return propertyOrDefault(propName, envOrDefault(envName, defValue));
    }

    // Locate script-relative resource folder. This is context-sensitive so pass
    // the right buildscript (top-level).
    scriptResources = { buildscript ->
      return file(buildscript.sourceFile.absolutePath.replaceAll('.gradle$', ""))
    }

    // LUCENE-9505: utility function that sets up dummy outputs for a task so that
    // clean[TaskName] works and allows selective re-runs.
    setupDummyOutputs = { Task task ->
      File dummyOutput = file("${task.project.buildDir}/tasks/${task.name}/dummy-output.txt")
      task.outputs.file(dummyOutput)
      task.doLast {
        if (!dummyOutput.exists()) {
          dummyOutput.createNewFile()
        }
      }
    }
  }
}
