| 33 | import java.util.Map; |
| 34 | |
| 35 | public class SaveManager { |
| 36 | |
| 37 | private static final File SAVE_FILE = new File(ViaProxy.getCwd(), "saves.json"); |
| 38 | private static final Gson GSON = new Gson(); |
| 39 | |
| 40 | public final AccountsSave accountsSave = new AccountsSave(); |
| 41 | public final UISave uiSave = new UISave(); |
| 42 | |
| 43 | private final Map<String, JsonElement> unknownSaves = new HashMap<>(); |
| 44 | |
| 45 | public SaveManager() { |
| 46 | try { |
| 47 | if (!SAVE_FILE.exists()) { |
| 48 | SAVE_FILE.createNewFile(); |
| 49 | this.save(); |
| 50 | } |
| 51 | |
| 52 | final FileReader reader = new FileReader(SAVE_FILE); |
| 53 | final JsonObject saveObject = GSON.fromJson(reader, JsonObject.class); |
| 54 | reader.close(); |
| 55 | |
| 56 | SaveMigrator.migrate(saveObject); |
| 57 | |
| 58 | RStream |
| 59 | .of(this) |
| 60 | .fields() |
| 61 | .filter(field -> AbstractSave.class.isAssignableFrom(field.type())) |
| 62 | .forEach(field -> { |
| 63 | final AbstractSave save = field.get(); |
| 64 | try { |
| 65 | if (saveObject.has(save.getName())) { |
| 66 | save.load(saveObject.remove(save.getName())); |
| 67 | } |
| 68 | } catch (Throwable e) { |
| 69 | Logger.LOGGER.error("Failed to load save " + save.getName(), e); |
| 70 | } |
| 71 | }); |
| 72 | |
| 73 | for (Map.Entry<String, JsonElement> entry : saveObject.entrySet()) { |
| 74 | this.unknownSaves.put(entry.getKey(), entry.getValue()); |
| 75 | } |
| 76 | |
| 77 | this.save(); |
| 78 | } catch (Throwable e) { |
| 79 | throw new RuntimeException("Failed to initialize SaveManager", e); |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | public synchronized void save() { |
| 84 | try { |
| 85 | final JsonObject saveObject = new JsonObject(); |
| 86 | this.unknownSaves.forEach(saveObject::add); |
| 87 | RStream |
| 88 | .of(this) |
| 89 | .fields() |
| 90 | .filter(field -> AbstractSave.class.isAssignableFrom(field.type())) |
| 91 | .forEach(field -> { |
| 92 | final AbstractSave save = field.get(); |