/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * Licensed 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: 'eclipse'
apply plugin: 'appengine'
apply plugin: 'war'


buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.google.appengine:gradle-appengine-plugin:1.9.1'
    }
}

repositories {
    mavenCentral()
}


dependencies {
    def gaeVersion = '1.9.1'
    appengineSdk "com.google.appengine:appengine-java-sdk:$gaeVersion"
    compile "javax.servlet:servlet-api:2.5"
    compile "com.google.code.gson:gson:2.2.4"
    compile "com.google.appengine.tools:appengine-gcs-client:0.3.8"
    testCompile 'junit:junit:[4,)'
}

war {
}

appengine {
    httpPort = 8080
    downloadSdk = true

    appcfg {

        oauth2 = true

        logs {
            severity = 0
            outputFile = file('mylogs.txt')
        }

        app {
            id = 'iosched-updater-dev'
        }
    }
}
