/*
 * 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: 'java'
apply plugin: 'application'

mainClassName = 'org.apache.ignite.ci.TcHelperJettyLauncher'
applicationDefaultJvmArgs = ["-Dteamcity.helper.home=../work",
                             "-Dteamcity.bot.regionsize=16", // 16g Durable Memory region
                             "-Dhttp.maxConnections=30",
                             "-server",
                             "-Xmx16g",
                             "-XX:+AlwaysPreTouch",
                             "-XX:+UseG1GC",
                             "-XX:+ScavengeBeforeFullGC",
                             "-XX:+UseStringDeduplication",
                             "-Djava.rmi.server.hostname=app02",
                             "-Dcom.sun.management.jmxremote",
                             "-Dcom.sun.management.jmxremote.port=9010",
                             "-Dcom.sun.management.jmxremote.local.only=false",
                             "-Dcom.sun.management.jmxremote.authenticate=false",
                             "-Dcom.sun.management.jmxremote.ssl=false",

                             // Options for running on Java 11
                             "-XX:+IgnoreUnrecognizedVMOptions",
                             "--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED",
                             "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED",
                             "--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED",
                             "--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED",
                             "--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED",
                             "--illegal-access=permit"]

distributions {
    main {
        contents {
            into('war') {
                from { new File(project(':ignite-tc-helper-web').getBuildDir(), "libs/ignite-tc-helper-web.war")}

                fileMode = 0755
            }
        }
    }
}

dependencies {
    compile (project(":ignite-tc-helper-web"))  {
        transitive = false
    }

    compile group: 'org.eclipse.jetty', name: 'jetty-util', version: jettyVer
    compile group: 'org.eclipse.jetty', name: 'jetty-server', version: jettyVer
    compile group: 'org.eclipse.jetty', name: 'jetty-webapp', version: jettyVer

    compile group: 'com.google.guava', name: 'guava', version: guavaVer
}
