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

apply plugin: 'org.apache.beam.module'
apply plugin: 'application'
mainClassName = "org.apache.beam.sdk.expansion.service.ExpansionService"

applyJavaNature(
        automaticModuleName: 'org.apache.beam.examples.multilanguage',
        exportJavadoc: false,
        validateShadowJar: false,
        shadowClosure: {},
)
provideIntegrationTestingDependencies()

description = "Apache Beam :: Examples :: Multi Language"
ext.summary = "Java Classes for Multi-language Examples"

dependencies {
    implementation library.java.vendored_guava_32_1_2_jre
    implementation project(path: ":sdks:java:core", configuration: "shadow")
    runtimeOnly project(path: ":examples:java")
    runtimeOnly project(path: ":runners:direct-java", configuration: "shadow")
    runtimeOnly project(path: ":runners:google-cloud-dataflow-java")
    runtimeOnly project(path: ":runners:portability:java")
    implementation library.java.vendored_guava_32_1_2_jre
    implementation project(":sdks:java:expansion-service")
    permitUnusedDeclared project(":sdks:java:expansion-service") // BEAM-11761
}

task pythonDataframeWordCount(type: JavaExec) {
    description "Run the Java word count example using external Python DataframeTransform"
    mainClass = "org.apache.beam.examples.multilanguage.PythonDataframeWordCount"
    classpath = sourceSets.main.runtimeClasspath
}

task sklearnMinstClassification(type: JavaExec) {
    description "Run the Java pipeline that performns image classification on handwritten digits from the MNIST database"
    mainClass = "org.apache.beam.examples.multilanguage.SklearnMnistClassification"
    classpath = sourceSets.main.runtimeClasspath
}

