Add methods to add and remove images to or from an album.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Album.java
index a85a6ab..d53ba6e 100644 (file)
@@ -19,6 +19,9 @@ package net.pterodactylus.sone.data;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
+
+import net.pterodactylus.util.validation.Validation;
 
 /**
  * Container for images that can also contain nested {@link Album}s.
@@ -27,6 +30,12 @@ import java.util.List;
  */
 public class Album {
 
+       /** The ID of this album. */
+       private final String id;
+
+       /** The Sone this album belongs to. */
+       private final Sone sone;
+
        /** Nested albums. */
        private final List<Album> albums = new ArrayList<Album>();
 
@@ -36,11 +45,56 @@ public class Album {
        /** The name of this album. */
        private String name;
 
+       /** The description of this album. */
+       private String description;
+
+       /**
+        * Creates a new album with a random ID.
+        *
+        * @param sone
+        *            The Sone this album belongs to
+        */
+       public Album(Sone sone) {
+               this(UUID.randomUUID().toString(), sone);
+       }
+
+       /**
+        * Creates a new album with the given ID.
+        *
+        * @param id
+        *            The ID of the album
+        * @param sone
+        *            The Sone this album belongs to
+        */
+       public Album(String id, Sone sone) {
+               Validation.begin().isNotNull("Album ID", id).isNotNull("Album Owner", sone).check();
+               this.id = id;
+               this.sone = sone;
+       }
+
        //
        // ACCESSORS
        //
 
        /**
+        * Returns the ID of this album.
+        *
+        * @return The ID of this album
+        */
+       public String getId() {
+               return id;
+       }
+
+       /**
+        * Returns the Sone this album belongs to.
+        *
+        * @return The Sone this album belongs to
+        */
+       public Sone getSone() {
+               return sone;
+       }
+
+       /**
         * Returns the nested albums.
         *
         * @return The nested albums
@@ -50,6 +104,28 @@ public class Album {
        }
 
        /**
+        * Adds an album to this album.
+        *
+        * @param album
+        *            The album to add
+        */
+       public void addAlbum(Album album) {
+               Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.sone, sone).check();
+               albums.add(album);
+       }
+
+       /**
+        * Removes an album from this album.
+        *
+        * @param album
+        *            The album to remove
+        */
+       public void removeAlbum(Album album) {
+               Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.sone, sone).check();
+               albums.remove(album);
+       }
+
+       /**
         * Returns the images in this album.
         *
         * @return The images in this album
@@ -59,6 +135,28 @@ public class Album {
        }
 
        /**
+        * Adds the given image to this album.
+        *
+        * @param image
+        *            The image to add
+        */
+       public void addImage(Image image) {
+               Validation.begin().isNotNull("Image", image).check().isEqual("Image Owner", image.getSone(), sone).check();
+               images.add(image);
+       }
+
+       /**
+        * Removes the given image from this album.
+        *
+        * @param image
+        *            The image to remove
+        */
+       public void removeImage(Image image) {
+               Validation.begin().isNotNull("Image", image).check().isEqual("Image Owner", image.getSone(), sone).check();
+               images.remove(image);
+       }
+
+       /**
         * Returns the name of this album.
         *
         * @return The name of this album
@@ -75,8 +173,47 @@ public class Album {
         * @return This album
         */
        public Album setName(String name) {
+               Validation.begin().isNotNull("Album Name", name).check();
                this.name = name;
                return this;
        }
 
+       /**
+        * Returns the description of this album.
+        *
+        * @return The description of this album
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * Sets the description of this album.
+        *
+        * @param description
+        *            The description of this album
+        * @return This album
+        */
+       public Album setDescription(String description) {
+               Validation.begin().isNotNull("Album Description", description).check();
+               this.description = description;
+               return this;
+       }
+
+       //
+       // OBJECT METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public boolean equals(Object object) {
+               if (!(object instanceof Album)) {
+                       return false;
+               }
+               Album album = (Album) object;
+               return sone.equals(album.sone) && id.equals(album.id);
+       }
+
 }