package net.pterodactylus.sone.database.memory; import static java.util.logging.Level.WARNING; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; /** * Helper class for interacting with a {@link Configuration}. * * @author David ‘Bombe’ Roden */ public class ConfigurationLoader { private static final Logger logger = Logger.getLogger(ConfigurationLoader.class.getName()); private final Configuration configuration; public ConfigurationLoader(Configuration configuration) { this.configuration = configuration; } public synchronized Set loadFriends(String localSoneId) { return loadIds("Sone/" + localSoneId + "/Friends"); } public void saveFriends(String soneId, Collection friends) { saveIds("Sone/" + soneId + "/Friends", friends); } public synchronized Set loadKnownPosts() { return loadIds("KnownPosts"); } public synchronized Set loadKnownPostReplies() { return loadIds("KnownReplies"); } public synchronized Set loadBookmarkedPosts() { return loadIds("Bookmarks/Post"); } @Nullable public synchronized Long getSoneFollowingTime(@Nonnull String soneId) { return loadSoneFollowingTimes().get(soneId); } public synchronized void removeSoneFollowingTime(@Nonnull String soneId) { Map soneFollowingTimes = loadSoneFollowingTimes(); soneFollowingTimes.remove(soneId); storeSoneFollowingTimes(soneFollowingTimes); } public synchronized void setSoneFollowingTime(@Nonnull String soneId, long time) { Map soneFollowingTimes = loadSoneFollowingTimes(); soneFollowingTimes.put(soneId, time); storeSoneFollowingTimes(soneFollowingTimes); } private synchronized Map loadSoneFollowingTimes() { Map soneFollowingTimes = new HashMap<>(); int soneCounter = 0; while (true) { String soneId = configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").getValue(null); if (soneId == null) { break; } soneFollowingTimes.put(soneId, configuration.getLongValue("SoneFollowingTimes/" + soneCounter++ + "/Time").getValue(null)); } return soneFollowingTimes; } private synchronized void storeSoneFollowingTimes(Map soneFollowingTimes) { int soneCounter = 0; try { for (Entry soneFollowingTime : soneFollowingTimes.entrySet()) { configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(soneFollowingTime.getKey()); configuration.getLongValue("SoneFollowingTimes/" + soneCounter + "/Time").setValue(soneFollowingTime.getValue()); ++soneCounter; } configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(null); } catch (ConfigurationException ce1) { logger.log(WARNING, "Could not save Sone following times!", ce1); } } private Set loadIds(String prefix) { Set ids = new HashSet(); int idCounter = 0; while (true) { String id = configuration .getStringValue(prefix + "/" + idCounter++ + "/ID") .getValue(null); if (id == null) { break; } ids.add(id); } return ids; } public synchronized void saveBookmarkedPosts( Set bookmarkedPosts) { saveIds("Bookmarks/Post", bookmarkedPosts); } private void saveIds(String prefix, Collection ids) { try { int idCounter = 0; for (String id : ids) { configuration .getStringValue(prefix + "/" + idCounter++ + "/ID") .setValue(id); } configuration .getStringValue(prefix + "/" + idCounter + "/ID") .setValue(null); } catch (ConfigurationException ce1) { logger.log(WARNING, "Could not save bookmarked posts!", ce1); } } }