//
// This Gradle build file illustrates how to process ProGuard
// (including its main application, its GUI, its Ant task, and its WTK plugin),
// and the ReTrace tool, all in one go.
// Configuration files for typical applications will be very similar.
// Usage:
//     gradle -b proguardall.gradle proguard
//

// Tell Gradle where to find the ProGuard task.

buildscript {
    repositories {
        flatDir dirs: '../../lib'
    }
    dependencies {
        classpath ':proguard'
    }
}

// Define a ProGuard task.

task proguard(type: proguard.gradle.ProGuardTask) {

    // You should probably import a more compact ProGuard-style configuration
    // file for all static settings, but we're specifying them all here, for
    // the sake of the example.
    //configuration 'configuration.pro'

    // Specify the input jars, output jars, and library jars.
    // We'll read all jars from the lib directory, process them, and write the
    // processed jars to a new out directory.

    injars  '../../lib'
    outjars 'out'

    // You may have to adapt the paths below.

    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    libraryjars '/usr/local/java/ant/lib/ant.jar'
    libraryjars '/usr/local/java/gradle-2.1/lib/plugins/gradle-plugins-2.1.jar'
    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-2.1.jar'
    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-groovy-2.1.jar'
    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-core-2.1.jar'
    libraryjars '/usr/local/java/gradle-2.1/lib/groovy-all-2.3.6.jar'
    libraryjars '/usr/local/java/wtk2.5.2/wtklib/kenv.zip'

    // Allow methods with the same signature, except for the return type,
    // to get the same obfuscation name.

    overloadaggressively

    // Put all obfuscated classes into the nameless root package.

    repackageclasses ''

    // Adapt the names and contents of the resource files.

    adaptresourcefilenames    '**.properties,**.gif,**.jpg'
    adaptresourcefilecontents 'proguard/ant/task.properties'

    // The main entry points.

    keep 'public class proguard.ProGuard { \
        public static void main(java.lang.String[]); \
    }'

    keep 'public class proguard.gui.ProGuardGUI { \
        public static void main(java.lang.String[]); \
    }'

    keep 'public class proguard.retrace.ReTrace { \
        public static void main(java.lang.String[]); \
    }'

    // If we have ant.jar, we can properly process the Ant task.

    keep allowobfuscation: true, 'class proguard.ant.*'
    keepclassmembers 'public class proguard.ant.* { \
        <init>(org.apache.tools.ant.Project); \
        public void set*(***); \
        public void add*(***); \
    }'

    // If we have the Gradle jars, we can properly process the Gradle task.

    keep 'public class proguard.gradle.* { \
        public *; \
    }'

    // If we have kenv.zip, we can process the J2ME WTK plugin.

    keep 'public class proguard.wtk.ProGuardObfuscator'
}
