import java.util.jar.JarEntry
import java.util.jar.JarOutputStream
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import java.util.zip.ZipOutputStream

dependencies {
    sourceBundle group: 'org.springframework', name: 'spring-test', version: "${springframeworkVersion}"
}

task rewriteJar(dependsOn: 'bundlor') {
    String jarFileName = file(buildDir.path + "/org.springframework.test-${springframeworkVersion}.jar").path
    doLast() {
        ZipFile jarFile = new ZipFile(jarFileName)
        println "------------"
        println "Cloning content of jar file ${jarFileName}:"
        println "------------"
        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
        println "------------"
        String cloneFileName = new File(jarFileName).path + "-clone"
        FileOutputStream fos = new FileOutputStream(cloneFileName)

        String manifest
        jarFile.entries().findAll { it.name == "META-INF/MANIFEST.MF" }.each {
            manifest = jarFile.getInputStream(it).text
        }
        println "------------"
        println manifest
        println "------------"

        JarOutputStream jarOutputStream = new JarOutputStream(fos,
                new java.util.jar.Manifest(new ByteArrayInputStream(manifest.getBytes(java.nio.charset.Charset.forName("UTF-8")))))

        println "------------"
        byte[] readBuffer = new byte[2156]
        jarFile.entries().findAll { !it.directory && !(it.name == "META-INF/MANIFEST.MF") && !(it.name.contains("TransactionalTestExecutionListener")) }.each {
            println "adding ${it.name} to ${cloneFileName}"
            jarOutputStream.putNextEntry(new JarEntry(it.name))
            jarOutputStream << jarFile.getInputStream(it)
        }
        jarOutputStream.finish()
        println "finished writing ${cloneFileName}"
        println "------------"

        println "from ${cloneFileName} to ${jarFileName}"
        println "within ${file(cloneFileName).parentFile.path} is ${file(cloneFileName).name}"
        println "rename ${file(cloneFileName).name} -> ${file(jarFileName).name}"

        delete file(jarFileName)
        copy {
            from file(file(cloneFileName).parentFile.path)
            into file(file(cloneFileName).parentFile.path)
            rename { String fileName ->
                fileName.replace(file(cloneFileName).name, file(jarFileName).name)
            }
        }
        delete file(cloneFileName)
        println "------------"
        println "Removed 'TransactionalTestExecutionListener' from content of jar file ${jarFileName}:"
        println "------------"
        new ZipFile(jarFileName).entries().findAll{ !it.directory }.each { println it.name }
        println "------------"
    }
}
