Add function to flatten an album and all albums beneath it.
[Sone.git] / src / main / java / net / pterodactylus / sone / data / Album.java
index 94af8ec..5375d98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Sone - Album.java - Copyright © 2011–2012 David Roden
+ * Sone - Album.java - Copyright © 2011–2013 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -28,11 +28,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import net.pterodactylus.util.object.Default;
-
 import com.google.common.base.Function;
+import com.google.common.base.Optional;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
 
 /**
  * Container for images that can also contain nested {@link Album}s.
@@ -50,6 +53,20 @@ public class Album implements Fingerprintable {
                }
        };
 
+       /** Function that flattens the given album and all albums beneath it. */
+       public static final Function<Album, List<Album>> FLATTENER = new Function<Album, List<Album>>() {
+
+               @Override
+               public List<Album> apply(Album album) {
+                       List<Album> albums = new ArrayList<Album>();
+                       albums.add(album);
+                       for (Album subAlbum : album.getAlbums()) {
+                               albums.addAll(FluentIterable.from(ImmutableList.of(subAlbum)).transformAndConcat(FLATTENER).toList());
+                       }
+                       return albums;
+               }
+       };
+
        /** The ID of this album. */
        private final String id;
 
@@ -330,7 +347,7 @@ public class Album implements Fingerprintable {
                if (albumImage == null) {
                        return null;
                }
-               return Default.forNull(images.get(albumImage), images.values().iterator().next());
+               return Optional.fromNullable(images.get(albumImage)).or(images.values().iterator().next());
        }
 
        /**
@@ -437,33 +454,33 @@ public class Album implements Fingerprintable {
         */
        @Override
        public String getFingerprint() {
-               StringBuilder fingerprint = new StringBuilder();
-               fingerprint.append("Album(");
-               fingerprint.append("ID(").append(id).append(')');
-               fingerprint.append("Title(").append(title).append(')');
-               fingerprint.append("Description(").append(description).append(')');
+               Hasher hash = Hashing.sha256().newHasher();
+               hash.putString("Album(");
+               hash.putString("ID(").putString(id).putString(")");
+               hash.putString("Title(").putString(title).putString(")");
+               hash.putString("Description(").putString(description).putString(")");
                if (albumImage != null) {
-                       fingerprint.append("AlbumImage(").append(albumImage).append(')');
+                       hash.putString("AlbumImage(").putString(albumImage).putString(")");
                }
 
                /* add nested albums. */
-               fingerprint.append("Albums(");
+               hash.putString("Albums(");
                for (Album album : albums) {
-                       fingerprint.append(album.getFingerprint());
+                       hash.putString(album.getFingerprint());
                }
-               fingerprint.append(')');
+               hash.putString(")");
 
                /* add images. */
-               fingerprint.append("Images(");
+               hash.putString("Images(");
                for (Image image : getImages()) {
                        if (image.isInserted()) {
-                               fingerprint.append(image.getFingerprint());
+                               hash.putString(image.getFingerprint());
                        }
                }
-               fingerprint.append(')');
+               hash.putString(")");
 
-               fingerprint.append(')');
-               return fingerprint.toString();
+               hash.putString(")");
+               return hash.hash().toString();
        }
 
        //