/*
 * 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(automaticModuleName: 'org.apache.beam.runners.apex')

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(":sdks:java:core")

configurations {
  validatesRunner
}

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

// 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(":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'
    // TODO[BEAM-8304]: Support multiple side inputs with different coders.
    excludeCategories 'org.apache.beam.sdk.testing.UsesSideInputsWithDifferentCoders'
  }

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

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

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