import java.util.List;
import javax.annotation.Nonnull;
+import net.pterodactylus.sone.database.AlbumBuilder;
+import net.pterodactylus.sone.database.ImageBuilder;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
*/
Sone getSone();
- /**
- * Sets the owner of the album. The owner can only be set as long as the
- * current owner is {@code null}.
- *
- * @param sone
- * The album owner
- * @return This album
- */
- Album setSone(Sone sone);
-
- /**
- * Returns the nested albums.
- *
- * @return The nested albums
- */
List<Album> getAlbums();
/**
- * Adds an album to this album.
- *
- * @param album
- * The album to add
- */
- void addAlbum(Album album);
-
- /**
- * Removes an album from this album.
- *
- * @param album
- * The album to remove
- */
- void removeAlbum(Album album);
-
- /**
* Moves the given album up in this album’s albums. If the album is already the
* first album, nothing happens.
*
List<Image> getImages();
/**
- * Adds the given image to this album.
- *
- * @param image
- * The image to add
- */
- void addImage(Image image);
-
- /**
- * Removes the given image from this album.
- *
- * @param image
- * The image to remove
- */
- void removeImage(Image image);
-
- /**
* Moves the given image up in this album’s images. If the image is already the
* first image, nothing happens.
*
Image getAlbumImage();
/**
- * Sets the ID of the album image.
- *
- * @param id
- * The ID of the album image
- * @return This album
- */
- Album setAlbumImage(String id);
-
- /**
* Returns whether this album contains any other albums or images.
*
* @return {@code true} if this album is empty, {@code false} otherwise
Album getParent();
/**
- * Sets the parent album of this album.
- *
- * @param parent
- * The new parent album of this album
- * @return This album
- */
- Album setParent(Album parent);
-
- /**
- * Removes the parent album of this album.
- *
- * @return This album
- */
- Album removeParent();
-
- /**
* Returns the title of this album.
*
* @return The title of this album
String getTitle();
/**
- * Sets the title of this album.
+ * Returns the description of this album.
*
- * @param title
- * The title of this album
- * @return This album
+ * @return The description of this album
*/
- Album setTitle(String title);
+ String getDescription();
+
+ AlbumBuilder newAlbumBuilder() throws IllegalStateException;
+
+ ImageBuilder newImageBuilder() throws IllegalStateException;
/**
- * Returns the description of this album.
+ * Returns a modifier for this album.
*
- * @return The description of this album
+ * @return A modifier for this album
+ * @throws IllegalStateException
+ * if this album can not be modified
*/
- String getDescription();
+ Modifier modify() throws IllegalStateException;
+
+ void remove() throws IllegalStateException;
/**
- * Sets the description of this album.
+ * Allows modifying an album. Modifications are only performed once {@link
+ * #update()} has succesfully returned a new album with the modifications
+ * made.
*
- * @param description
- * The description of this album
- * @return This album
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
- Album setDescription(String description);
+ interface Modifier {
+
+ Modifier setTitle(String title);
+
+ Modifier setDescription(String description);
+
+ Modifier setAlbumImage(String imageId);
+
+ Album update() throws IllegalStateException;
+
+ }
}