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

subprojects {

    apply plugin:'java'

    repositories {
        mavenLocal()
        maven {
            url "https://repository.apache.org/content/repositories/snapshots/"
        }
        mavenCentral()
    }

    dependencies {
        testCompile project(":utils")
        compile "org.apache.geode:geode-core:$geodeVersion"
        testCompile "junit:junit:$junitVersion"
        testCompile "org.mockito:mockito-core:$mockitocoreVersion"
        compile "org.apache.commons:commons-exec:$commonsExecVersion"
        compile "com.jayway.awaitility:awaitility:$awaitilityVersion"
    }

    task run(type: JavaExec) {
        description = 'Run example'
        def mainClass = rootProject.hasProperty('main') ? "${rootProject.getProperty('main')}" : 'Main'
        main = "org.apache.geode.examples.${project.name}.$mainClass"
        classpath = sourceSets.main.runtimeClasspath
        standardInput = System.in
        systemProperties = System.getProperties()
        if (rootProject.hasProperty('args')) {
            args = ["${rootProject.getProperty('args')}"]
        }
    }

    test {
      def geodeHome = System.getenv('GEODE_HOME');
      geodeHome = geodeHome != null ? geodeHome : file('../../geode-assembly/build/install/apache-geode/').absolutePath
      environment 'GEODE_HOME': geodeHome
    }


}

