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

plugins {
  id 'org.apache.beam.module'
  id 'com.github.jk1.dependency-license-report' version '1.16'
}

applyGoNature()
applyPythonNature()

evaluationDependsOn(":sdks:java:harness")
evaluationDependsOn(":sdks:java:io:jdbc")

description = "Apache Beam :: SDKs :: Java :: Container"

configurations {
  dockerDependency
  javaHarnessLauncher
}

dependencies {
  dockerDependency library.java.slf4j_api
  dockerDependency library.java.slf4j_jdk14
  dockerDependency library.java.jcl_over_slf4j
  dockerDependency library.java.log4j_over_slf4j
  dockerDependency library.java.log4j2_to_slf4j
  dockerDependency project(path: ":sdks:java:harness", configuration: "shadow")
  dockerDependency library.java.jamm
}

goBuild {
  goTargets = '*.go' // only build the immediate directory.
  outputLocation = './build/target/${GOOS}_${GOARCH}/boot'
}

// command: ./gradlew generateLicenseReport
import com.github.jk1.license.render.*
licenseReport {
  projects = [project,
              project.rootProject.findProject(':sdks:java:harness')]
  excludeOwnGroup = true
  excludeGroups = ["beam.*"] // project dependencies do not match their maven coords
  configurations = ALL
  renderers = [new JsonReportRenderer()]
}

task pullLicenses(type: Exec) {
  dependsOn generateLicenseReport
  generateLicenseReport.outputs.cacheIf { false }

  commandLine './license_scripts/license_script.sh', "python${project.ext.pythonVersion}"
  outputs.dir('build/target/third_party_licenses')
  outputs.dir('build/target/java_third_party_licenses')
}

task downloadCloudProfilerAgent(type: Exec) {
  executable "sh"
  args "-c", "curl https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz | tar xzv -C build/target/profiler/"
  outputs.dir('build/target/profiler')
}

artifacts {
  javaHarnessLauncher file: file('./build/target'), builtBy: goBuild
}

task pushAll {
  dependsOn ":sdks:java:container:java11:docker"
  dependsOn ":sdks:java:container:java17:docker"
  dependsOn ":sdks:java:container:java21:docker"
  dependsOn ":sdks:java:container:java25:docker"
  dependsOn ":sdks:java:container:distroless:pushAll"
}
