/**
 * 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.
 */


def generatedSourceDir = "${buildDir}/generated-src/java"
def diezelSrcDir = "${projectDir}/src/main/diezel";

dependencies {
    compile project(":s4-base")
    compile project(":s4-comm")
    compile project(":s4-core")
    testCompile project(path: ':s4-comm', configuration: 'tests')
    testRuntime libraries.zkclient
    testRuntime libraries.netty
    testRuntime libraries.asm
}


sourceSets {
    generated {
        java { srcDir generatedSourceDir }
    }
}

buildscript {
    repositories {
        mavenCentral()

        maven {
            url "http://oss.sonatype.org/content/repositories/snapshots"
        }
        maven {
            url "http://oss.sonatype.org/content/repositories/releases"
        }
    }
    dependencies {
        classpath libraries.diezel
    }
}
task generateSources << {
    outputs.dir generatedSourceDir
    def mojo = new net.ericaro.diezel.plugin.DiezelMojo()
    mojo.sourceDirectory = new File(diezelSrcDir);
    mojo.outputDirectory = new File(generatedSourceDir);
    mojo.staleMillis = 0;
    mojo.project = new org.apache.maven.project.MavenProject();
    org.apache.maven.model.Build build = new org.apache.maven.model.Build();
    build.setDirectory(mojo.sourceDirectory.getAbsolutePath());
    mojo.project.setBuild(build);
    mojo.execute();
}

compileJava.source generateSources.outputs.files, sourceSets.main.java

eclipseClasspath.dependsOn generateSources

