--- /dev/null
+/*
+ * Sone - AlbumDatabase.java - Copyright © 2013 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.database;
+
+/**
+ * Combines an {@link AlbumProvider} and an {@link AlbumStore} into an album
+ * database.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public interface AlbumDatabase extends AlbumProvider, AlbumStore {
+
+ /* nothing here. */
+
+}
--- /dev/null
+/*
+ * Sone - AlbumProvider.java - Copyright © 2013 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.database;
+
+import net.pterodactylus.sone.data.Album;
+
+import com.google.common.base.Optional;
+
+/**
+ * Interface for objects that can provide {@link Album}s by their ID.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public interface AlbumProvider {
+
+ /**
+ * Returns the album with the given ID, or {@link Optional#absent()} if no such
+ * album exists.
+ *
+ * @param albumId
+ * The ID of the album
+ * @return The album, or {@link Optional#absent()} if the album does not exist
+ */
+ Optional<Album> getAlbum(String albumId);
+
+}
--- /dev/null
+/*
+ * Sone - AlbumStore.java - Copyright © 2013 David Roden
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.database;
+
+import net.pterodactylus.sone.data.Album;
+
+/**
+ * Interface for a store of albums.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public interface AlbumStore {
+
+ /**
+ * Stores the given album.
+ *
+ * @param album
+ * The album to store
+ */
+ void storeAlbum(Album album);
+
+ /**
+ * Removes the given album from the store.
+ *
+ * @param album
+ * The album to remove
+ */
+ void removeAlbum(Album album);
+
+}
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
-public interface Database extends Service, PostDatabase, PostReplyDatabase {
+public interface Database extends Service, PostDatabase, PostReplyDatabase, AlbumDatabase {
/**
* Saves the database.
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import net.pterodactylus.sone.data.Album;
import net.pterodactylus.sone.data.Post;
import net.pterodactylus.sone.data.PostReply;
import net.pterodactylus.sone.data.Reply;
/** Whether post replies are known. */
private final Set<String> knownPostReplies = new HashSet<String>();
+ private final Map<String, Album> allAlbums = new HashMap<String, Album>();
+
/**
* Creates a new memory database.
*
}
//
+ // ALBUMPROVDER METHODS
+ //
+
+ @Override
+ public Optional<Album> getAlbum(String albumId) {
+ lock.readLock().lock();
+ try {
+ return fromNullable(allAlbums.get(albumId));
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ //
+ // ALBUMSTORE METHODS
+ //
+
+ @Override
+ public void storeAlbum(Album album) {
+ lock.writeLock().lock();
+ try {
+ allAlbums.put(album.getId(), album);
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ @Override
+ public void removeAlbum(Album album) {
+ lock.writeLock().lock();
+ try {
+ allAlbums.remove(album.getId());
+ } finally {
+ lock.writeLock().unlock();
+ }
+ }
+
+ //
// PACKAGE-PRIVATE METHODS
//