From 9e2cb25d015c4383448da2f1f22d8393f939cba9 Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Tue, 14 Aug 2018 00:08:35 +0800 Subject: [PATCH] Convert old offline account setings --- .../org/jackhuang/hmcl/setting/Accounts.java | 17 ++-- .../jackhuang/hmcl/setting/ConfigHolder.java | 21 +---- .../hmcl/setting/ConfigUpgrader.java | 90 +++++++++++++++++++ .../auth/offline/OfflineAccountFactory.java | 4 + 4 files changed, 103 insertions(+), 29 deletions(-) create mode 100644 HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index 5ac018d9c..134b8cd0c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -87,7 +87,7 @@ public final class Accounts { return type2factory.get(accountType(account)); } - private static String accountId(Account account) { + static String accountId(Account account) { return account.getUsername() + ":" + account.getCharacter(); } @@ -138,20 +138,19 @@ public final class Accounts { accounts.addListener(onInvalidating(Accounts::updateAccountStorages)); } + static Map getAccountStorage(Account account) { + Map storage = account.toStorage(); + storage.put("type", accountType(account)); + return storage; + } + private static void updateAccountStorages() { // don't update the underlying storage before data loading is completed // otherwise it might cause data loss if (!initialized) return; // update storage - config().getAccountStorages().setAll( - accounts.stream() - .map(account -> { - Map storage = account.toStorage(); - storage.put("type", accountType(account)); - return storage; - }) - .collect(toList())); + config().getAccountStorages().setAll(accounts.stream().map(Accounts::getAccountStorage).collect(toList())); } /** diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 3ce7f016c..ae04bf89a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -31,7 +31,6 @@ import com.google.gson.Gson; import com.google.gson.JsonParseException; import org.jackhuang.hmcl.util.OperatingSystem; -import org.jackhuang.hmcl.util.StringUtils; public final class ConfigHolder { @@ -111,7 +110,7 @@ public final class ConfigHolder { LOG.info("Config is empty"); } else { Map raw = new Gson().fromJson(content, Map.class); - upgradeConfig(deserialized, raw); + ConfigUpgrader.upgradeConfig(deserialized, raw); return deserialized; } } catch (JsonParseException e) { @@ -142,22 +141,4 @@ public final class ConfigHolder { // ignore it as it has been logged } } - - /** - * This method is for the compatibility with old HMCL 3.x as well as HMCL 2.x. - * @param deserialized deserialized config settings - * @param rawJson raw json structure of the config settings without modification - * @return {@code deserialized} - */ - private static void upgradeConfig(Config deserialized, Map rawJson) { - // Following is for the compatibility with HMCL 2.x - if (!rawJson.containsKey("commonDirType")) - deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM); - if (!rawJson.containsKey("backgroundType")) - deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT); - if (!rawJson.containsKey("hasProxy")) - deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost())); - if (!rawJson.containsKey("hasProxyAuth")) - deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser())); - } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java new file mode 100644 index 000000000..85b006662 --- /dev/null +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigUpgrader.java @@ -0,0 +1,90 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2018 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.setting; + +import org.jackhuang.hmcl.auth.offline.OfflineAccount; +import org.jackhuang.hmcl.auth.offline.OfflineAccountFactory; +import org.jackhuang.hmcl.util.StringUtils; +import org.jackhuang.hmcl.util.UUIDTypeAdapter; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static org.jackhuang.hmcl.util.Lang.tryCast; + +final class ConfigUpgrader { + private ConfigUpgrader() { + } + + /** + * This method is for the compatibility with old HMCL 3.x as well as HMCL 2.x. + * + * @param deserialized deserialized config settings + * @param rawJson raw json structure of the config settings without modification + */ + static void upgradeConfig(Config deserialized, Map rawJson) { + upgradeV2(deserialized, rawJson); + upgradeV3(deserialized, rawJson); + } + + /** + * Upgrade configuration of HMCL 2.x + * + * @param deserialized deserialized config settings + * @param rawJson raw json structure of the config settings without modification + */ + private static void upgradeV2(Config deserialized, Map rawJson) { + // Convert OfflineAccounts whose stored uuid is important. + tryCast(rawJson.get("auth"), Map.class).ifPresent(auth -> { + tryCast(auth.get("offline"), Map.class).ifPresent(offline -> { + List accounts = new LinkedList<>(); + tryCast(offline.get("uuidMap"), Map.class).ifPresent(uuidMap -> { + ((Map) uuidMap).forEach((key, value) -> { + OfflineAccount account = OfflineAccountFactory.INSTANCE.create((String) key, UUIDTypeAdapter.fromString((String) value)); + accounts.add(account); + deserialized.getAccountStorages().add(Accounts.getAccountStorage(account)); + }); + }); + + tryCast(offline.get("IAuthenticator_UserName"), String.class).ifPresent(selected -> { + if (!rawJson.containsKey("selectedAccount")) + accounts.stream().filter(account -> selected.equals(account.getUsername())).findAny().ifPresent(account -> + deserialized.setSelectedAccount(Accounts.accountId(account))); + }); + }); + }); + } + + /** + * Upgrade configuration of HMCL earlier than 3.1.70 + * + * @param deserialized deserialized config settings + * @param rawJson raw json structure of the config settings without modification + */ + private static void upgradeV3(Config deserialized, Map rawJson) { + if (!rawJson.containsKey("commonDirType")) + deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM); + if (!rawJson.containsKey("backgroundType")) + deserialized.setBackgroundImageType(StringUtils.isNotBlank(deserialized.getBackgroundImage()) ? EnumBackgroundImage.CUSTOM : EnumBackgroundImage.DEFAULT); + if (!rawJson.containsKey("hasProxy")) + deserialized.setHasProxy(StringUtils.isNotBlank(deserialized.getProxyHost())); + if (!rawJson.containsKey("hasProxyAuth")) + deserialized.setHasProxyAuth(StringUtils.isNotBlank(deserialized.getProxyUser())); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccountFactory.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccountFactory.java index 0556916fd..cd9a42971 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccountFactory.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/offline/OfflineAccountFactory.java @@ -37,6 +37,10 @@ public class OfflineAccountFactory extends AccountFactory { private OfflineAccountFactory() { } + public OfflineAccount create(String username, UUID uuid) { + return new OfflineAccount(username, uuid); + } + @Override public OfflineAccount create(CharacterSelector selector, String username, String password, Object additionalData) { return new OfflineAccount(username, getUUIDFromUserName(username));