+package net.pterodactylus.sone.database.memory;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import net.pterodactylus.sone.data.Sone;
+
+/**
+ * Groups {@link Sone}-related database functionality.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class MemorySoneDatabase {
+
+ private final ReadWriteLock lock = new ReentrantReadWriteLock();
+ private final Set<String> knownSones = new HashSet<String>();
+ private final ConfigurationLoader configurationLoader;
+
+ public MemorySoneDatabase(ConfigurationLoader configurationLoader) {
+ this.configurationLoader = configurationLoader;
+ }
+
+ void start() {
+ loadKnownSones();
+ }
+
+ private void loadKnownSones() {
+ lock.writeLock().lock();
+ try {
+ knownSones.clear();
+ knownSones.addAll(configurationLoader.loadKnownSones());
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ void stop() {
+ saveKnownSones();
+ }
+
+ boolean isKnownSone(String soneId) {
+ lock.readLock().lock();
+ try {
+ return knownSones.contains(soneId);
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ void setSoneKnown(String soneId) {
+ lock.writeLock().lock();
+ try {
+ knownSones.add(soneId);
+ saveKnownSones();
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ private void saveKnownSones() {
+ lock.readLock().lock();
+ try {
+ configurationLoader.saveKnownSones(knownSones);
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+}