/*
 * 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: 'gae'
apply plugin: 'eclipse'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.gradle.api.plugins:gradle-gae-plugin:0.8'
    }
}

repositories {
    mavenCentral()
}


dependencies {
    def gaeVersion = '1.8.1'
    gaeSdk "com.google.appengine:appengine-java-sdk:$gaeVersion"
    compile "com.google.appengine:appengine-api-1.0-sdk:$gaeVersion"
    compile "com.google.appengine:appengine-api-labs:$gaeVersion"
    compile "com.googlecode.objectify:objectify:4.0b2"
    compile "com.googlecode.json-simple:json-simple:1.1.1"
    compile "javax.persistence:persistence-api:1.0"
    compile "javax.servlet:servlet-api:2.5"
    compile fileTree('lib')
}


gae {
    httpPort = 8080
    optimizeWar = true
    downloadSdk = true

    appcfg {
        passIn = true
        oauth2 = true

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

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