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

import groovy.json.JsonOutput

plugins { id 'org.apache.beam.module' }
applyJavaNature()

description = "Apache Beam :: Runners :: Apex"

/*
 * We need to rely on manually specifying these evaluationDependsOn to ensure that
 * the following projects are evaluated before we evaluate this project. This is because
 * we are attempting to reference the "sourceSets.test.output" directly.
 */
evaluationDependsOn(":beam-sdks-java-core")

configurations {
  validatesRunner
}

dependencies {
  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
  shadow project(path: ":beam-sdks-java-core", configuration: "shadow")
  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
  shadow project(path: ":beam-runners-core-java", configuration: "shadow")
  shadow library.java.apex_common
  shadow library.java.malhar_library
  shadow library.java.apex_engine
  shadow library.java.commons_lang3
  shadow library.java.apex_engine
  shadowTest project(path: ":beam-sdks-java-core", configuration: "shadowTest")
  // ApexStateInternalsTest extends abstract StateInternalsTest
  shadowTest project(path: ":beam-runners-core-java", configuration: "shadowTest")
  shadowTest library.java.hamcrest_core
  shadowTest library.java.junit
  shadowTest library.java.mockito_core
  shadowTest library.java.jackson_dataformat_yaml
  validatesRunner project(path: ":beam-sdks-java-core", configuration: "shadowTest")
  validatesRunner project(path: ":beam-runners-core-java", configuration: "shadowTest")
  validatesRunner project(path: project.path, configuration: "shadow")
}

// TODO: Update this so that the generated file is added to the explicitly added instead of
// just outputting the file in the correct path.
task buildDependencyTree(type: DependencyReportTask) {
  configurations = [project.configurations.testRuntimeClasspath]
  outputFile = new File(buildDir, "classes/java/main/org/apache/beam/runners/apex/dependency-tree")
  // TODO: Migrate ApexYarnLauncher to use the Gradles dependency tree output instead of Mavens
  // so we don't have to try to replace the format of the file on the fly
  doLast {
    // Filter out lines which don't have any dependencies by looking for lines with "--- "
    ant.replaceregexp(file: outputFile, match: "^((?!--- ).)*\$", replace: "", byline: true)
    // Remove empty lines
    ant.replaceregexp(file: outputFile, match: "\\n\\n", replace: "", flags: "gm")
    // Replace strings with ":a.b.c -> x.y.z" to just be ":x.y.z" getting the used version of the dependency.
    ant.replaceregexp(file: outputFile, match: ":([^:]*) -> (.*)", replace: ":\\2", byline: true)
    // Remove a trailing " (*)" off the end to so there is nothing after the version identifier.
    ant.replaceregexp(file: outputFile, match: " \\(\\*\\)", replace: "", byline: true)
    // Add ":jar" to the maven dependency string assuming that all resource types are jars.
    ant.replaceregexp(file: outputFile, match: "[^:]*:[^:]*", replace: "\\0:jar", byline: true)
  }
}
compileJava.dependsOn buildDependencyTree

task validatesRunnerBatch(type: Test) {
  group = "Verification"
  systemProperty "beamTestPipelineOptions", JsonOutput.toJson([
          "--runner=TestApexRunner",
  ])

  classpath = configurations.validatesRunner
  testClassesDirs = files(project(":beam-sdks-java-core").sourceSets.test.output.classesDirs)
  useJUnit {
    includeCategories 'org.apache.beam.sdk.testing.ValidatesRunner'
    excludeCategories 'org.apache.beam.sdk.testing.FlattenWithHeterogeneousCoders'
    excludeCategories 'org.apache.beam.sdk.testing.UsesAttemptedMetrics'
    excludeCategories 'org.apache.beam.sdk.testing.UsesCommittedMetrics'
    excludeCategories 'org.apache.beam.sdk.testing.UsesImpulse'
    excludeCategories 'org.apache.beam.sdk.testing.UsesParDoLifecycle'
    excludeCategories 'org.apache.beam.sdk.testing.UsesTestStream'
    excludeCategories 'org.apache.beam.sdk.testing.UsesTimersInParDo'
    excludeCategories 'org.apache.beam.sdk.testing.UsesMetricsPusher'
    excludeCategories 'org.apache.beam.sdk.testing.UsesUnboundedSplittableParDo'
    excludeCategories 'org.apache.beam.sdk.testing.UsesUnboundedPCollections'
  }

  // apex runner is run in embedded mode. Increase default HeapSize
  maxHeapSize = '4g'
}

task validatesRunner {
  group = "Verification"
  description "Validates Apex runner"
  dependsOn validatesRunnerBatch
}

// Generates :beam-runners-apex:runQuickstartJavaApex
createJavaExamplesArchetypeValidationTask(type: 'Quickstart', runner:'Apex')
