/*
 * 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()
  }

  // 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()
        }
      }
    }
  }
}
