Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 811ea8fe authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé Committed by GitHub
Browse files

Merge pull request #8820 from wmontwe/change-filehelper-to-kotlin

Change FileHelper to Kotlin
parents 90767b1d 6304da29
Loading
Loading
Loading
Loading
+0 −147
Original line number Diff line number Diff line
package com.fsck.k9.helper;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import timber.log.Timber;

import org.apache.commons.io.IOUtils;


public class FileHelper {
    public static void touchFile(final File parentDir, final String name) {
        final File file = new File(parentDir, name);
        try {
            if (!file.exists()) {
                if (!file.createNewFile()) {
                    Timber.d("Unable to create file: %s", file.getAbsolutePath());
                }
            } else {
                if (!file.setLastModified(System.currentTimeMillis())) {
                    Timber.d("Unable to change last modification date: %s", file.getAbsolutePath());
                }
            }
        } catch (Exception e) {
            Timber.d(e, "Unable to touch file: %s", file.getAbsolutePath());
        }
    }

    private static void copyFile(File from, File to) throws IOException {
        FileInputStream in = new FileInputStream(from);
        FileOutputStream out = new FileOutputStream(to);
        try {
            byte[] buffer = new byte[1024];
            int count;
            while ((count = in.read(buffer)) > 0) {
                out.write(buffer, 0, count);
            }
            out.close();
        } finally {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(out);
        }
    }

    public static void renameOrMoveByCopying(File from, File to) throws IOException {
        deleteFileIfExists(to);

        boolean renameFailed = !from.renameTo(to);
        if (renameFailed) {
            copyFile(from, to);

            boolean deleteFromFailed = !from.delete();
            if (deleteFromFailed) {
                Timber.e("Unable to delete source file after copying to destination!");
            }
        }
    }

    private static void deleteFileIfExists(File to) throws IOException {
        boolean fileDoesNotExist = !to.exists();
        if (fileDoesNotExist) {
            return;
        }

        boolean deleteOk = to.delete();
        if (deleteOk) {
            return;
        }

        throw new IOException("Unable to delete file: " + to.getAbsolutePath());
    }

    public static boolean move(final File from, final File to) {
        if (to.exists()) {
            if (!to.delete()) {
                Timber.d("Unable to delete file: %s", to.getAbsolutePath());
            }
        }

        if (!to.getParentFile().mkdirs()) {
            Timber.d("Unable to make directories: %s", to.getParentFile().getAbsolutePath());
        }

        try {
            copyFile(from, to);

            boolean deleteFromFailed = !from.delete();
            if (deleteFromFailed) {
                Timber.e("Unable to delete source file after copying to destination!");
            }
            return true;
        } catch (Exception e) {
            Timber.w(e, "cannot move %s to %s", from.getAbsolutePath(), to.getAbsolutePath());
            return false;
        }
    }

    public static void moveRecursive(final File fromDir, final File toDir) {
        if (!fromDir.exists()) {
            return;
        }
        if (!fromDir.isDirectory()) {
            if (toDir.exists()) {
                if (!toDir.delete()) {
                    Timber.w("cannot delete already existing file/directory %s", toDir.getAbsolutePath());
                }
            }
            if (!fromDir.renameTo(toDir)) {
                Timber.w("cannot rename %s to %s - moving instead", fromDir.getAbsolutePath(), toDir.getAbsolutePath());
                move(fromDir, toDir);
            }
            return;
        }
        if (!toDir.exists() || !toDir.isDirectory()) {
            if (toDir.exists()) {
                if (!toDir.delete()) {
                    Timber.d("Unable to delete file: %s", toDir.getAbsolutePath());
                }
            }
            if (!toDir.mkdirs()) {
                Timber.w("cannot create directory %s", toDir.getAbsolutePath());
            }
        }
        File[] files = fromDir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                moveRecursive(file, new File(toDir, file.getName()));
                if (!file.delete()) {
                    Timber.d("Unable to delete file: %s", toDir.getAbsolutePath());
                }
            } else {
                File target = new File(toDir, file.getName());
                if (!file.renameTo(target)) {
                    Timber.w("cannot rename %s to %s - moving instead",
                            file.getAbsolutePath(), target.getAbsolutePath());
                    move(file, target);
                }
            }
        }
        if (!fromDir.delete()) {
            Timber.w("cannot delete %s", fromDir.getAbsolutePath());
        }
    }
}
+73 −0
Original line number Diff line number Diff line
package com.fsck.k9.helper

import java.io.File
import java.io.IOException
import timber.log.Timber

object FileHelper {

    @JvmStatic
    @Suppress("TooGenericExceptionCaught")
    fun touchFile(parentDir: File, name: String) {
        val file = File(parentDir, name)
        try {
            if (!file.exists()) {
                if (!file.createNewFile()) {
                    Timber.d("Unable to create file: %s", file.absolutePath)
                }
            } else {
                if (!file.setLastModified(System.currentTimeMillis())) {
                    Timber.d("Unable to change last modification date: %s", file.absolutePath)
                }
            }
        } catch (e: Exception) {
            Timber.d(e, "Unable to touch file: %s", file.absolutePath)
        }
    }

    @JvmStatic
    @Throws(IOException::class)
    fun renameOrMoveByCopying(from: File, to: File) {
        deleteFileIfExists(to)
        val renameFailed = !from.renameTo(to)
        if (renameFailed) {
            from.copyTo(target = to, overwrite = true)
            val deleteFromFailed = !from.delete()
            if (deleteFromFailed) {
                Timber.e("Unable to delete source file after copying to destination!")
            }
        }
    }

    @Throws(IOException::class)
    private fun deleteFileIfExists(file: File) {
        if (file.exists() && !file.delete()) {
            throw IOException("Unable to delete file: ${file.absolutePath}")
        }
    }

    @Suppress("TooGenericExceptionCaught")
    fun move(from: File, to: File): Boolean {
        if (to.exists()) {
            if (!to.delete()) {
                Timber.d("Unable to delete file: %s", to.absolutePath)
            }
        }

        val parent = to.parentFile
        if (parent != null && !parent.mkdirs()) {
            Timber.d("Unable to make directories: %s", parent.absolutePath)
        }
        return try {
            from.copyTo(target = to, overwrite = true)
            val deleteFromFailed = !from.delete()
            if (deleteFromFailed) {
                Timber.e("Unable to delete source file after copying to destination!")
            }
            true
        } catch (e: Exception) {
            Timber.w(e, "cannot move %s to %s", from.absolutePath, to.absolutePath)
            false
        }
    }
}
+68 −0
Original line number Diff line number Diff line
package com.fsck.k9.helper

import assertk.assertThat
import assertk.assertions.isEqualTo
import assertk.assertions.isFalse
import assertk.assertions.isNotEqualTo
import assertk.assertions.isTrue
import java.io.File
import kotlin.test.Test
import org.junit.Rule
import org.junit.rules.TemporaryFolder

class FileHelperTest {

    @Rule
    @JvmField
    val tempFolder = TemporaryFolder()

    @Test
    fun `touchFile should create file`() {
        val parent = tempFolder.newFolder("parent")

        FileHelper.touchFile(parent, "FileName")

        assertThat(File(parent, "FileName").exists()).isTrue()
    }

    @Test
    fun `touchFile should change file modification time`() {
        val parent = tempFolder.newFolder("parent")
        val lastModified = 12345L
        val file = File(parent, "FileName")
        file.createNewFile()
        file.setLastModified(lastModified)

        FileHelper.touchFile(parent, "FileName")

        assertThat(file.lastModified()).isNotEqualTo(lastModified)
    }

    @Test
    fun `renameOrMoveByCopying should move file when destination does not exist`() {
        val source = tempFolder.newFile("source")
        val destination = File(tempFolder.root, "destination")
        val sourceContent = "content"
        source.writeText(sourceContent)

        FileHelper.renameOrMoveByCopying(source, destination)

        assertThat(source.exists()).isFalse()
        assertThat(destination.exists()).isTrue()
        assertThat(destination.readText()).isEqualTo(sourceContent)
    }

    @Test
    fun `renameOrMoveByCopying should move file when destination exists`() {
        val source = tempFolder.newFile("source")
        val destination = tempFolder.newFile("destination")
        val sourceContent = "content"
        source.writeText(sourceContent)

        FileHelper.renameOrMoveByCopying(source, destination)

        assertThat(source.exists()).isFalse()
        assertThat(destination.exists()).isTrue()
        assertThat(destination.readText()).isEqualTo(sourceContent)
    }
}