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

mainClassName = "org.apache.bigtop.bigpetstore.qstream.LoadGen"

sourceCompatibility = 1.7
version = '1.0'

manifest {
   attributes 'Main-Class': 'org.apache.bigtop.bigpetstore.qstream.LoadGen'
}
//create a single Jar with all dependencies
task fatJar(type: Jar) {
   manifest {
     attributes 'Implementation-Title': 'Gradle Jar File Example',
                'Implementation-Version': version,
                'Main-Class': mainClassName
   }
   baseName = project.name + '-all'
   from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
   with jar
}


repositories {
    mavenCentral()
    maven {
       url "https://dl.bintray.com/rnowling/bigpetstore"
   }
}

dependencies {
    compile('com.fasterxml:jackson-module-json-org:0.9.1') {
        exclude group: 'org.apache.commons', module: 'commons-io'
    }
    compile('org.apache.commons:commons-io:1.3.2') {
         exclude group: 'org.apache.commons', module: 'commons-io'
         exclude group: 'commons-io', module: 'commons-io'
    }
    compile 'org.apache.httpcomponents:httpclient:4.4'
    compile group:'org.apache.commons', name:'commons-lang3',version:'3.3.2'
    compile "com.github.rnowling.bigpetstore:bigpetstore-data-generator:0.2.1"
    testCompile group: 'junit', name: 'junit', version: '4.11'
}
