/*
 * 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 "http://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'
}
