X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdatabase%2Fmemory%2FMemoryDatabase.java;h=538d97fa8efbd7d99103a063a498f0f0c2ceb2fe;hb=d37132932d423abaca088fdf3496b9b0f38e3ae3;hp=babe6fe5246f3a4aed5cbde80109ac672339f549;hpb=20033c2725145859c3a4d8d75a3008b9fc099b3c;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java index babe6fe..538d97f 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -19,6 +19,10 @@ package net.pterodactylus.sone.database.memory; import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Predicates.not; +import static com.google.common.collect.FluentIterable.from; +import static java.util.Collections.emptyList; +import static net.pterodactylus.sone.data.Sone.LOCAL_SONE_FILTER; import java.util.ArrayList; import java.util.Collection; @@ -40,18 +44,19 @@ import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; -import net.pterodactylus.sone.data.impl.DefaultAlbumBuilder; -import net.pterodactylus.sone.database.AlbumBuilder; import net.pterodactylus.sone.database.Database; import net.pterodactylus.sone.database.DatabaseException; import net.pterodactylus.sone.database.PostBuilder; import net.pterodactylus.sone.database.PostDatabase; import net.pterodactylus.sone.database.PostReplyBuilder; -import net.pterodactylus.sone.database.SoneProvider; +import net.pterodactylus.sone.database.SoneBuilder; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; +import com.google.common.base.Function; import com.google.common.base.Optional; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; import com.google.common.collect.SortedSetMultimap; import com.google.common.collect.TreeMultimap; import com.google.common.util.concurrent.AbstractService; @@ -67,12 +72,11 @@ public class MemoryDatabase extends AbstractService implements Database { /** The lock. */ private final ReadWriteLock lock = new ReentrantReadWriteLock(); - /** The Sone provider. */ - private final SoneProvider soneProvider; - /** The configuration. */ private final Configuration configuration; + private final Map sones = new HashMap(); + /** All posts by their ID. */ private final Map allPosts = new HashMap(); @@ -104,20 +108,19 @@ public class MemoryDatabase extends AbstractService implements Database { private final Set knownPostReplies = new HashSet(); private final Map allAlbums = new HashMap(); + private final ListMultimap albumChildren = ArrayListMultimap.create(); + private final ListMultimap albumImages = ArrayListMultimap.create(); private final Map allImages = new HashMap(); /** * Creates a new memory database. * - * @param soneProvider - * The Sone provider * @param configuration * The configuration for loading and saving elements */ @Inject - public MemoryDatabase(SoneProvider soneProvider, Configuration configuration) { - this.soneProvider = soneProvider; + public MemoryDatabase(Configuration configuration) { this.configuration = configuration; } @@ -160,6 +163,51 @@ public class MemoryDatabase extends AbstractService implements Database { } } + @Override + public Optional getSone(String soneId) { + lock.readLock().lock(); + try { + return fromNullable(sones.get(soneId)); + } finally { + lock.readLock().unlock(); + } + } + + @Override + public Collection getSones() { + lock.readLock().lock(); + try { + return Collections.unmodifiableCollection(sones.values()); + } finally { + lock.readLock().unlock(); + } + } + + @Override + public Collection getLocalSones() { + lock.readLock().lock(); + try { + return from(getSones()).filter(LOCAL_SONE_FILTER).toSet(); + } finally { + lock.readLock().unlock(); + } + } + + @Override + public Collection getRemoteSones() { + lock.readLock().lock(); + try { + return from(getSones()).filter(not(LOCAL_SONE_FILTER)).toSet(); + } finally { + lock.readLock().unlock(); + } + } + + @Override + public SoneBuilder newSoneBuilder() { + return null; + } + // // POSTPROVIDER METHODS // @@ -200,7 +248,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override public PostBuilder newPostBuilder() { - return new MemoryPostBuilder(this, soneProvider); + return new MemoryPostBuilder(this); } // @@ -315,7 +363,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.readLock().lock(); try { if (!postReplies.containsKey(postId)) { - return Collections.emptyList(); + return emptyList(); } return new ArrayList(postReplies.get(postId)); } finally { @@ -330,7 +378,7 @@ public class MemoryDatabase extends AbstractService implements Database { /** {@inheritDocs} */ @Override public PostReplyBuilder newPostReplyBuilder() { - return new MemoryPostReplyBuilder(this, soneProvider); + return new MemoryPostReplyBuilder(this, this); } // @@ -434,13 +482,14 @@ public class MemoryDatabase extends AbstractService implements Database { } } - // - // ALBUMBUILDERFACTORY METHODS - // - @Override - public AlbumBuilder newAlbumBuilder() { - return new DefaultAlbumBuilder(); + public List getAlbums(Album parent) { + lock.readLock().lock(); + try { + return from(albumChildren.get(parent.getId())).transformAndConcat(getAlbum()).toList(); + } finally { + lock.readLock().unlock(); + } } // @@ -452,6 +501,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allAlbums.put(album.getId(), album); + albumChildren.put(album.getParent().getId(), album.getId()); } finally { lock.writeLock().unlock(); } @@ -462,6 +512,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allAlbums.remove(album.getId()); + albumChildren.remove(album.getParent().getId(), album.getId()); } finally { lock.writeLock().unlock(); } @@ -481,6 +532,16 @@ public class MemoryDatabase extends AbstractService implements Database { } } + @Override + public List getImages(Album parent) { + lock.readLock().lock(); + try { + return from(albumImages.get(parent.getId())).transformAndConcat(getImage()).toList(); + } finally { + lock.readLock().unlock(); + } + } + // // IMAGESTORE METHODS // @@ -490,6 +551,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allImages.put(image.getId(), image); + albumImages.put(image.getAlbum().getId(), image.getId()); } finally { lock.writeLock().unlock(); } @@ -500,6 +562,7 @@ public class MemoryDatabase extends AbstractService implements Database { lock.writeLock().lock(); try { allImages.remove(image.getId()); + albumImages.remove(image.getAlbum().getId(), image.getId()); } finally { lock.writeLock().unlock(); } @@ -584,6 +647,66 @@ public class MemoryDatabase extends AbstractService implements Database { } } + void moveUp(Album album) { + lock.writeLock().lock(); + try { + List albums = albumChildren.get(album.getParent().getId()); + int currentIndex = albums.indexOf(album.getId()); + if (currentIndex == 0) { + return; + } + albums.remove(album.getId()); + albums.add(currentIndex - 1, album.getId()); + } finally { + lock.writeLock().unlock(); + } + } + + void moveDown(Album album) { + lock.writeLock().lock(); + try { + List albums = albumChildren.get(album.getParent().getId()); + int currentIndex = albums.indexOf(album.getId()); + if (currentIndex == (albums.size() - 1)) { + return; + } + albums.remove(album.getId()); + albums.add(currentIndex + 1, album.getId()); + } finally { + lock.writeLock().unlock(); + } + } + + void moveUp(Image image) { + lock.writeLock().lock(); + try { + List images = albumImages.get(image.getAlbum().getId()); + int currentIndex = images.indexOf(image.getId()); + if (currentIndex == 0) { + return; + } + images.remove(image.getId()); + images.add(currentIndex - 1, image.getId()); + } finally { + lock.writeLock().unlock(); + } + } + + void moveDown(Image image) { + lock.writeLock().lock(); + try { + List images = albumChildren.get(image.getAlbum().getId()); + int currentIndex = images.indexOf(image.getId()); + if (currentIndex == (images.size() - 1)) { + return; + } + images.remove(image.getId()); + images.add(currentIndex + 1, image.getId()); + } finally { + lock.writeLock().unlock(); + } + } + // // PRIVATE METHODS // @@ -745,4 +868,22 @@ public class MemoryDatabase extends AbstractService implements Database { } } + private Function> getAlbum() { + return new Function>() { + @Override + public Iterable apply(String input) { + return (input == null) ? Collections.emptyList() : getAlbum(input).asSet(); + } + }; + } + + private Function> getImage() { + return new Function>() { + @Override + public Iterable apply(String input) { + return (input == null) ? Collections.emptyList() : getImage(input).asSet(); + } + }; + } + }