//package com.gh.gamecenter.plugin
//
//import com.android.build.api.transform.*
//import com.android.build.gradle.internal.pipeline.TransformManager
//import com.gh.gamecenter.plugin.transform.DiskLruCacheTransformer
//import com.gh.gamecenter.plugin.transform.ExoSourceManagerTransformer.kt
//import com.gh.gamecenter.plugin.transform.ThreadPoolShrinkTransformer
//import javassist.ClassPool
//import org.apache.commons.codec.digest.DigestUtils
//import org.apache.commons.io.FileUtils
//import org.apache.commons.io.IOUtils
//import org.gradle.api.Project
//
//import java.util.jar.JarEntry
//import java.util.jar.JarFile
//import java.util.jar.JarOutputStream
//
//class GhTransform extends Transform {
//
//    Project project
//    private ClassPool classPool = ClassPool.getDefault()
//    private GhTransformHelper transformHelper
//
//    GhTransform(Project project) {
//        this.project = project
//        transformHelper = new GhTransformHelper()
//        transformHelper.addTransformer(new ExoSourceManagerTransformer.kt())
//        transformHelper.addTransformer(new DiskLruCacheTransformer())
////        transformHelper.addTransformer(new ThreadPoolShrinkTransformer())
//    }
//
//    @Override
//    String getName() {
//        return "GhTransform"
//    }
//    /**
//      * 需要处理的数据类型，目前 ContentType有六种枚举类型，通常我们使用比较频繁的有前两种：
//      * 1、CONTENT_CLASS：表示需要处理 java 的 class 文件。
//      * 2、CONTENT_JARS：表示需要处理 java 的 class 与 资源文件。
//      * 3、CONTENT_RESOURCES：表示需要处理 java 的资源文件。
//      * 4、CONTENT_NATIVE_LIBS：表示需要处理 native 库的代码。
//      * 5、CONTENT_DEX：表示需要处理 DEX 文件。
//      * 6、CONTENT_DEX_WITH_RESOURCES：表示需要处理 DEX 与 java 的资源文件。 
//     */
//    @Override
//    Set<QualifiedContent.ContentType> getInputTypes() {
//        return TransformManager.CONTENT_CLASS
//    }
//
//    /**
//      * Transform 要操作的内容范围，目前 Scope 有五种基本类型：
//      * 1、PROJECT：只有项目内容
//      * 2、SUB_PROJECTS：只有子项目
//      * 3、EXTERNAL_LIBRARIES：只有外部库
//      * 4、TESTED_CODE：由当前变体（包括依赖项）所测试的代码
//      * 5、PROVIDED_ONLY：只提供本地或远程依赖项
//      * SCOPE_FULL_PROJECT 是一个Scope集合，包含Scope.PROJECT,Scope.SUB_PROJECTS,Scope.EXTERNAL_LIBRARIES 这三项，即当前Transform的作用域包括当前项目、子项目以及外部的依赖库
//     */
//    @Override
//    Set<? super QualifiedContent.Scope> getScopes() {
//        //通常我们使用 SCOPE_FULL_PROJECT
//        return TransformManager.SCOPE_FULL_PROJECT
//    }
//
//    /**
//     * 是否需要增量编译
//     */
//    @Override
//    boolean isIncremental() {
//        return false
//    }
//
//    @Override
//    void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
//        super.transform(transformInvocation)
//        //添加加android.jar目录
//        classPool.appendClassPath(project.android.bootClasspath[0].toString())
//        def outputProvider = transformInvocation.outputProvider
//        // 删除之前的输出
//        if (outputProvider != null) {
//            outputProvider.deleteAll()
//        }
//        transformInvocation.inputs.each { input ->
//            input.directoryInputs.each { dirInput ->
//                handleDirectory(dirInput.file)
//
//                def dest = outputProvider.getContentLocation(dirInput.name, dirInput.contentTypes, dirInput.scopes, Format.DIRECTORY)
//                // 将input的目录复制到output指定目录
//                FileUtils.copyDirectory(dirInput.file, dest)
//            }
//
//        }
//        transformInvocation.inputs.each { input ->
//            input.jarInputs.each { jarInput ->
//                if (jarInput.file.exists()) {
//                    def srcFile = handleJar(jarInput.file)
//
//                    //必须给jar重新命名，否则会冲突
//                    def jarName = jarInput.name
//                    def md5 = DigestUtils.md5Hex(jarInput.file.absolutePath)
//                    if (jarName.endsWith(".jar")) {
//                        jarName = jarName.substring(0, jarName.length() - 4)
//                    }
//                    def dest = outputProvider.getContentLocation(md5 + jarName, jarInput.contentTypes, jarInput.scopes, Format.JAR)
//                    FileUtils.copyFile(srcFile, dest)
//                }
//            }
//        }
//
//    }
//
//    void handleDirectory(File dir) {
//        //将类路径添加到classPool中
//        classPool.insertClassPath(dir.absolutePath)
//        if (dir.isDirectory()) {
//            dir.eachFileRecurse { file ->
//                def filePath = file.absolutePath
//                classPool.insertClassPath(filePath)
//                if (shouldModify(filePath)) {
//                    def inputStream = new FileInputStream(file)
//                    transformHelper.proceedModifyDir(filePath, inputStream)
//                }
//            }
//        }
//    }
//
//    /**
//     * 主要步骤：
//     * 1.遍历所有jar文件
//     * 2.解压jar然后遍历所有的class
//     * 3.读取class的输入流并使用javassit修改，然后保存到新的jar文件中
//     */
//    File handleJar(File jarFile) {
//        classPool.appendClassPath(jarFile.absolutePath)
//        def inputJarFile = new JarFile(jarFile)
//        def entries = inputJarFile.entries()
//        //创建一个新的文件
//        def outputJarFile = new File(jarFile.parentFile, "temp_" + jarFile.name)
//        if (outputJarFile.exists()) outputJarFile.delete()
//        def jarOutputStream = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(outputJarFile)))
//        while (entries.hasMoreElements()) {
//            def jarInputEntry = entries.nextElement()
//            def jarInputEntryName = jarInputEntry.name
//
//            def outputJarEntry = new JarEntry(jarInputEntryName)
//            jarOutputStream.putNextEntry(outputJarEntry)
//
//            def inputStream = inputJarFile.getInputStream(jarInputEntry)
//            if (!shouldModify(jarInputEntryName)) {
//                jarOutputStream.write(IOUtils.toByteArray(inputStream))
//                inputStream.close()
//                continue
//            }
//            transformHelper.proceedModifyJar(jarInputEntryName, jarOutputStream, inputStream)
//        }
//        inputJarFile.close()
//        jarOutputStream.closeEntry()
//        jarOutputStream.flush()
//        jarOutputStream.close()
//        return outputJarFile
//    }
//
//    static boolean shouldModify(String filePath) {
//        return filePath.endsWith(".class") &&
//                !filePath.contains("R.class") &&
//                !filePath.contains('$') &&
//                !filePath.contains('R$') &&
//                !filePath.contains("BuildConfig.class")
//    }
//}