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);
}
}
}