Merge branch 'next' into image-management
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Album.java
index 67bfefd..60fb296 100644 (file)
@@ -21,18 +21,20 @@ 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.
  *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
-public class Album {
+public class Album implements Fingerprintable {
 
        /** The ID of this album. */
        private final String id;
 
        /** The Sone this album belongs to. */
-       private final Sone sone;
+       private Sone sone;
 
        /** Nested albums. */
        private final List<Album> albums = new ArrayList<Album>();
@@ -40,6 +42,9 @@ public class Album {
        /** The images in this album. */
        private final List<Image> images = new ArrayList<Image>();
 
+       /** The parent album. */
+       private Album parent;
+
        /** The name of this album. */
        private String name;
 
@@ -48,12 +53,9 @@ public class Album {
 
        /**
         * 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);
+       public Album() {
+               this(UUID.randomUUID().toString());
        }
 
        /**
@@ -61,12 +63,10 @@ public class Album {
         *
         * @param id
         *            The ID of the album
-        * @param sone
-        *            The Sone this album belongs to
         */
-       public Album(String id, Sone sone) {
+       public Album(String id) {
+               Validation.begin().isNotNull("Album ID", id).check();
                this.id = id;
-               this.sone = sone;
        }
 
        //
@@ -92,6 +92,20 @@ public class Album {
        }
 
        /**
+        * 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
+        */
+       public Album setSone(Sone sone) {
+               Validation.begin().isNull("Current Album Owner", this.sone).isNotNull("New Album Owner", sone).check().isEqual("New Album Owner", sone, this.sone).check();
+               this.sone = sone;
+               return this;
+       }
+
+       /**
         * Returns the nested albums.
         *
         * @return The nested albums
@@ -101,6 +115,30 @@ 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).isNull("Album Parent", album.parent).check();
+               albums.add(album);
+               album.setParent(this);
+       }
+
+       /**
+        * 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).isEqual("Album Parent", album.parent, this).check();
+               albums.remove(album);
+               album.removeParent();
+       }
+
+       /**
         * Returns the images in this album.
         *
         * @return The images in this album
@@ -110,6 +148,62 @@ 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 parent album of this album.
+        *
+        * @return The parent album of this album, or {@code null} if this album
+        *         does not have a parent
+        */
+       public Album getParent() {
+               return parent;
+       }
+
+       /**
+        * Sets the parent album of this album.
+        *
+        * @param parent
+        *            The new parent album of this album
+        * @return This album
+        */
+       protected Album setParent(Album parent) {
+               Validation.begin().isNotNull("Album Parent", parent).check();
+               this.parent = parent;
+               return this;
+       }
+
+       /**
+        * Removes the parent album of this album.
+        *
+        * @return This album
+        */
+       protected Album removeParent() {
+               Validation.begin().isNotNull("Album Parent", parent).check();
+               this.parent = null;
+               return this;
+       }
+
+       /**
         * Returns the name of this album.
         *
         * @return The name of this album
@@ -126,6 +220,7 @@ public class Album {
         * @return This album
         */
        public Album setName(String name) {
+               Validation.begin().isNotNull("Album Name", name).check();
                this.name = name;
                return this;
        }
@@ -147,11 +242,45 @@ public class Album {
         * @return This album
         */
        public Album setDescription(String description) {
+               Validation.begin().isNotNull("Album Description", description).check();
                this.description = description;
                return this;
        }
 
        //
+       // FINGERPRINTABLE METHODS
+       //
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public String getFingerprint() {
+               StringBuilder fingerprint = new StringBuilder();
+               fingerprint.append("Album(");
+               fingerprint.append("ID(").append(id).append(')');
+               fingerprint.append("Name(").append(name).append(')');
+               fingerprint.append("Description(").append(description).append(')');
+
+               /* add nested albums. */
+               fingerprint.append("Albums(");
+               for (Album album : albums) {
+                       fingerprint.append(album.getFingerprint());
+               }
+               fingerprint.append(')');
+
+               /* add images. */
+               fingerprint.append("Images(");
+               for (Image image : images) {
+                       fingerprint.append(image.getFingerprint());
+               }
+               fingerprint.append(')');
+
+               fingerprint.append(')');
+               return fingerprint.toString();
+       }
+
+       //
        // OBJECT METHODS
        //
 
@@ -164,7 +293,7 @@ public class Album {
                        return false;
                }
                Album album = (Album) object;
-               return sone.equals(album.sone) && id.equals(album.id);
+               return id.equals(album.id);
        }
 
 }