@SuppressWarnings({"raw", "rawtypes"})
	private void load() {
		// Skip loading in test environments
		if (TestEnvironment.isTestEnv())
			return;

		Gson gson = gsonProvider.getGson();
		for (ConfigContainer container : containers.values()) {
			String key = container.getGroupAndId();
			Path containerPath = fileConfig.getConfigDirectory().resolve(key + ".json");
			if (!Files.exists(containerPath)) {
				if (container instanceof RestoreAwareConfigContainer listener)
					listener.onNoRestore();
				continue;
			}

			JsonObject json;
			try (JsonReader reader = gson.newJsonReader(Files.newBufferedReader(containerPath))) {
				json = Objects.requireNonNull(gson.fromJson(reader, JsonObject.class));
			} catch (Exception ex) {
				logger.error("Failed to load config container: {}", key, ex);
				continue;
			}

			for (ConfigValue value : container.getValues().values()) {
				String id = value.getId();

				// Skip loading if the file doesn't list the entry.
				if (!json.has(id))
					continue;

				try {
					loadValue(gson, value, json.get(id));
				} catch (IllegalArgumentException e) {
					logger.error("Could not find adapter for type: {}", value.getType(), e);
				} catch (Exception e) {
					logger.error("Failed to load config value: {}.{}", key, id, e);
				}
			}

			// Notify the container it has restored its config values from storage.
			if (container instanceof RestoreAwareConfigContainer listener)
				listener.onRestore();
		}
	}
Tracker for all {@link ConfigContainer} instances.

@author Matt Coley
recaf-core/src/main/java/software/coley/recaf/services/config/ConfigManager.java