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

Unverified Commit a933d177 authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #8096 from thunderbird/combined_upgrader

Add support for settings upgrader with access to all account settings
parents 6e3b9143 836e8703
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ import static com.fsck.k9.preferences.upgrader.AccountSettingsUpgraderTo53.FOLDE

class AccountSettingsDescriptions {
    static final Map<String, TreeMap<Integer, SettingsDescription<?>>> SETTINGS;
    private static final Map<Integer, SettingsUpgrader> UPGRADERS;
    static final Map<Integer, SettingsUpgrader> UPGRADERS;

    static {
        Map<String, TreeMap<Integer, SettingsDescription<?>>> s = new LinkedHashMap<>();
@@ -302,10 +302,6 @@ class AccountSettingsDescriptions {
        return Settings.validate(version, SETTINGS, importedSettings, useDefaultValues);
    }

    public static Map<String, Object> upgrade(int version, Map<String, Object> validatedSettings) {
        return SettingsUpgradeHelper.upgrade(version, UPGRADERS, SETTINGS, validatedSettings);
    }

    public static Map<String, String> convert(Map<String, Object> settings) {
        return Settings.convert(settings, SETTINGS);
    }
+58 −12
Original line number Diff line number Diff line
package com.fsck.k9.preferences

internal class AccountSettingsUpgrader {
    private val identitySettingsUpgrader = IdentitySettingsUpgrader()
    private val folderSettingsUpgrader = FolderSettingsUpgrader()
    private val serverSettingsUpgrader = ServerSettingsUpgrader()
internal class AccountSettingsUpgrader(
    private val identitySettingsUpgrader: IdentitySettingsUpgrader,
    private val folderSettingsUpgrader: FolderSettingsUpgrader,
    private val serverSettingsUpgrader: ServerSettingsUpgrader,
    private val latestVersion: Int = Settings.VERSION,
    private val settingsDescriptions: SettingsDescriptions = AccountSettingsDescriptions.SETTINGS,
    private val upgraders: Map<Int, SettingsUpgrader> = AccountSettingsDescriptions.UPGRADERS,
    private val combinedUpgraders: Map<Int, CombinedSettingsUpgraderFactory> = CombinedSettingsUpgraders.UPGRADERS,
) {

    fun upgrade(contentVersion: Int, account: ValidatedSettings.Account): ValidatedSettings.Account {
        if (contentVersion == Settings.VERSION) {
        if (contentVersion == latestVersion) {
            return account
        }

        val relevantCombinedUpgraderVersions = combinedUpgraders.keys.asSequence()
            .filter { it > contentVersion }
            .toSortedSet()

        var currentAccount = account
        var currentVersion = contentVersion
        for (version in relevantCombinedUpgraderVersions) {
            val toVersion = version - 1
            currentAccount = upgradeToVersion(toVersion, currentVersion, currentAccount)

            val combinedUpgrader = combinedUpgraders[version]!!.invoke()
            currentAccount = combinedUpgrader.upgrade(currentAccount)

            currentAccount = upgradeToVersion(version, toVersion, currentAccount)
            currentVersion = version
        }

        return upgradeToVersion(toVersion = latestVersion, contentVersion = currentVersion, currentAccount)
    }

    private fun upgradeToVersion(
        toVersion: Int,
        contentVersion: Int,
        account: ValidatedSettings.Account,
    ): ValidatedSettings.Account {
        return account.copy(
            settings = AccountSettingsDescriptions.upgrade(contentVersion, account.settings),
            incoming = serverSettingsUpgrader.upgrade(contentVersion, account.incoming),
            outgoing = serverSettingsUpgrader.upgrade(contentVersion, account.outgoing),
            identities = upgradeIdentities(contentVersion, account.identities),
            folders = upgradeFolders(contentVersion, account.folders),
            settings = upgradeAccountSettings(toVersion, contentVersion, account.settings),
            incoming = serverSettingsUpgrader.upgrade(toVersion, contentVersion, account.incoming),
            outgoing = serverSettingsUpgrader.upgrade(toVersion, contentVersion, account.outgoing),
            identities = upgradeIdentities(toVersion, contentVersion, account.identities),
            folders = upgradeFolders(toVersion, contentVersion, account.folders),
        )
    }

    private fun upgradeAccountSettings(
        toVersion: Int,
        contentVersion: Int,
        settings: InternalSettingsMap,
    ): InternalSettingsMap {
        return SettingsUpgradeHelper.upgradeToVersion(
            toVersion,
            contentVersion,
            upgraders,
            settingsDescriptions,
            settings,
        )
    }

    private fun upgradeIdentities(
        toVersion: Int,
        contentVersion: Int,
        identities: List<ValidatedSettings.Identity>,
    ): List<ValidatedSettings.Identity> {
        return identities.map { identity ->
            identitySettingsUpgrader.upgrade(contentVersion, identity)
            identitySettingsUpgrader.upgrade(toVersion, contentVersion, identity)
        }
    }

    private fun upgradeFolders(
        toVersion: Int,
        contentVersion: Int,
        folders: List<ValidatedSettings.Folder>,
    ): List<ValidatedSettings.Folder> {
        return folders.map { folder ->
            folderSettingsUpgrader.upgrade(contentVersion, folder)
            folderSettingsUpgrader.upgrade(toVersion, contentVersion, folder)
        }
    }
}
+5 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences

fun interface CombinedSettingsUpgrader {
    fun upgrade(account: ValidatedSettings.Account): ValidatedSettings.Account
}
+7 −0
Original line number Diff line number Diff line
package com.fsck.k9.preferences

internal typealias CombinedSettingsUpgraderFactory = () -> CombinedSettingsUpgrader

internal object CombinedSettingsUpgraders {
    val UPGRADERS = emptyMap<Int, CombinedSettingsUpgraderFactory>()
}
+1 −5
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ import com.fsck.k9.preferences.Settings.V;

class FolderSettingsDescriptions {
    static final Map<String, TreeMap<Integer, SettingsDescription<?>>> SETTINGS;
    private static final Map<Integer, SettingsUpgrader> UPGRADERS;
    static final Map<Integer, SettingsUpgrader> UPGRADERS;

    static {
        Map<String, TreeMap<Integer, SettingsDescription<?>>> s = new LinkedHashMap<>();
@@ -57,10 +57,6 @@ class FolderSettingsDescriptions {
        return Settings.validate(version, SETTINGS, importedSettings, useDefaultValues);
    }

    public static Map<String, Object> upgrade(int version, Map<String, Object> validatedSettings) {
        return SettingsUpgradeHelper.upgrade(version, UPGRADERS, SETTINGS, validatedSettings);
    }

    public static Map<String, String> convert(Map<String, Object> settings) {
        return Settings.convert(settings, SETTINGS);
    }
Loading