2 * Sone - Album.java - Copyright © 2011–2013 David Roden
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.pterodactylus.sone.data.impl;
20 import static com.google.common.base.Preconditions.checkState;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
26 import java.util.UUID;
28 import net.pterodactylus.sone.data.Album;
29 import net.pterodactylus.sone.data.Image;
30 import net.pterodactylus.sone.data.Sone;
31 import net.pterodactylus.sone.database.AlbumBuilder;
32 import net.pterodactylus.sone.database.ImageBuilder;
34 import com.google.common.base.Function;
35 import com.google.common.base.Optional;
36 import com.google.common.base.Predicates;
37 import com.google.common.collect.Collections2;
40 * Dumb, store-everything-in-memory implementation of an {@link Album}.
42 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
44 public class DefaultAlbum extends AbstractAlbum {
46 /** The Sone this album belongs to. */
49 /** The parent album. */
50 private final DefaultAlbum parent;
53 private final List<Album> albums = new ArrayList<Album>();
55 /** The image IDs in order. */
56 final List<String> imageIds = new ArrayList<String>();
58 /** The images in this album. */
59 final Map<String, Image> images = new HashMap<String, Image>();
61 /** Creates a new album with a random ID. */
62 public DefaultAlbum(Sone sone, DefaultAlbum parent) {
63 this(UUID.randomUUID().toString(), sone, parent);
67 * Creates a new album with the given ID.
72 public DefaultAlbum(String id, Sone sone, DefaultAlbum parent) {
83 public Sone getSone() {
88 public List<Album> getAlbums() {
89 return new ArrayList<Album>(albums);
93 public List<Image> getImages() {
94 return new ArrayList<Image>(Collections2.filter(Collections2.transform(imageIds, new Function<String, Image>() {
97 @SuppressWarnings("synthetic-access")
98 public Image apply(String imageId) {
99 return images.get(imageId);
101 }), Predicates.notNull()));
105 public Image getAlbumImage() {
106 if (albumImage == null) {
109 return Optional.fromNullable(images.get(albumImage)).or(images.values().iterator().next());
113 public Album getParent() {
118 public AlbumBuilder newAlbumBuilder() {
119 return new DefaultAlbumBuilder(sone, this) {
121 public Album build() throws IllegalStateException {
122 Album album = super.build();
130 public ImageBuilder newImageBuilder() throws IllegalStateException {
131 return new DefaultImageBuilder(sone, this) {
133 public Image build() throws IllegalStateException {
134 Image image = super.build();
135 if (images.isEmpty() && (albumImage == null)) {
136 albumImage = image.getId();
138 images.put(image.getId(), image);
139 imageIds.add(image.getId());
146 public void moveUp() {
147 int oldIndex = parent.albums.indexOf(this);
148 parent.albums.remove(this);
149 parent.albums.add(Math.max(0, oldIndex - 1), this);
153 public void moveDown() {
154 int oldIndex = parent.albums.indexOf(this);
155 parent.albums.remove(this);
156 parent.albums.add(Math.min(parent.albums.size(), oldIndex + 1), this);
160 public void remove() throws IllegalStateException {
161 checkState(!isRoot(), "can not remove root album");
164 parent.albums.remove(this);
167 private void removeAllImages() {
168 for (Image image : images.values()) {
173 private void removeAllAlbums() {
174 for (Album album: albums) {