/*
 * Copyright 2012, Google Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the
 * distribution.
 *     * Neither the name of Google Inc. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

ext.testAccessorOutputDir = file("${buildDir}/generated-src/accessorTest/java")
ext.testAccessorOutputFile = file("${testAccessorOutputDir}/org/jf/dexlib2/AccessorTypes.java")

sourceSets {
    accessorTest {
        java {
            srcDir testAccessorOutputDir
        }
    }
}

configurations {
    accessorTestGenerator
    dx
}

dependencies {
    compile project(':util')
    compile depends.findbugs
    compile depends.guava

    testCompile depends.junit
    testCompile depends.mockito

    accessorTestGenerator project('accessorTestGenerator')

    dx depends.dx
}

// You must manually execute this task to regenerate SyntheticAccessorFSM.java, after modifying the ragel file
// e.g. ./gradlew ragel
task ragel(type:Exec) {
    workingDir = 'src/main/ragel'

    commandLine 'ragel', '-J', '-o', file('src/main/java/org/jf/dexlib2/util/SyntheticAccessorFSM.java'),
            'SyntheticAccessorFSM.rl'
}

task generateAccessorTestSource(type: JavaExec) {
    file(testAccessorOutputFile.parent).mkdirs()
    outputs.dir file(testAccessorOutputDir)

    classpath = configurations.accessorTestGenerator
    main = 'org.jf.dexlib2.AccessorTestGenerator'
    args testAccessorOutputFile
}
compileAccessorTestJava.dependsOn(generateAccessorTestSource)

// You must manually execute this task to regenerate src/test/resources/accessorTest.dex
task generateAccessorTestDex(type: JavaExec, dependsOn: compileAccessorTestJava) {
    def outputDex = file('src/test/resources/accessorTest.dex')
    file(outputDex.parent).mkdirs()

    inputs.dir(project.sourceSets.accessorTest.output.classesDir)
    outputs.file outputDex

    main 'com.android.dx.command.Main'
    classpath = configurations.dx

    args '--dex'
    args '--no-strict'
    args "--output=${outputDex}"
    args sourceSets.accessorTest.output.classesDir
}

uploadArchives {
    repositories.mavenDeployer {
        pom.project {
            description 'dexlib2 is a library for reading/modifying/writing Android dex files'
            scm {
                url 'https://github.com/JesusFreke/smali/tree/master/dexlib2'
            }
        }
    }
}