X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fdata%2FSone.java;h=a895585c4df982e0aa86a938a6761f100122b29d;hb=e96dca9509a6300a1db19c724c8df499cffa95c3;hp=80032add3c77630109f74b16fdc00d1f1ae3bab4;hpb=26dbc1f7ba2c4243d8cc07986b0e943a2238ea08;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/data/Sone.java b/src/main/java/net/pterodactylus/sone/data/Sone.java index 80032ad..a895585 100644 --- a/src/main/java/net/pterodactylus/sone/data/Sone.java +++ b/src/main/java/net/pterodactylus/sone/data/Sone.java @@ -1,5 +1,5 @@ /* - * Sone - Sone.java - Copyright © 2010–2012 David Roden + * Sone - Sone.java - Copyright © 2010–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 @@ -17,6 +17,8 @@ package net.pterodactylus.sone.data; +import static com.google.common.base.Preconditions.*; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -33,12 +35,14 @@ import net.pterodactylus.sone.freenet.wot.Identity; import net.pterodactylus.sone.freenet.wot.OwnIdentity; import net.pterodactylus.sone.template.SoneAccessor; import net.pterodactylus.util.logging.Logging; -import net.pterodactylus.util.validation.Validation; - -import com.google.common.base.Predicate; import freenet.keys.FreenetURI; +import com.google.common.base.Predicate; +import com.google.common.collect.FluentIterable; +import com.google.common.hash.Hasher; +import com.google.common.hash.Hashing; + /** * A Sone defines everything about a user: her profile, her status updates, her * replies, her likes and dislikes, etc. @@ -226,7 +230,7 @@ public class Sone implements Fingerprintable, Comparable { private final List albums = new CopyOnWriteArrayList(); /** Sone-specific options. */ - private final Options options = new Options(); + private Options options = new Options(); /** * Creates a new Sone. @@ -422,8 +426,7 @@ public class Sone implements Fingerprintable, Comparable { * if {@code status} is {@code null} */ public Sone setStatus(SoneStatus status) { - Validation.begin().isNotNull("Sone Status", status).check(); - this.status = status; + this.status = checkNotNull(status, "status must not be null"); return this; } @@ -767,27 +770,6 @@ public class Sone implements Fingerprintable, Comparable { } /** - * Returns a flattened list of all albums of this Sone. The resulting list - * contains parent albums before child albums so that the resulting list can - * be parsed in a single pass. - * - * @return The flattened albums - */ - public List getAllAlbums() { - List flatAlbums = new ArrayList(); - flatAlbums.addAll(albums); - int lastAlbumIndex = 0; - while (lastAlbumIndex < flatAlbums.size()) { - int previousAlbumCount = flatAlbums.size(); - for (Album album : new ArrayList(flatAlbums.subList(lastAlbumIndex, flatAlbums.size()))) { - flatAlbums.addAll(album.getAlbums()); - } - lastAlbumIndex = previousAlbumCount; - } - return flatAlbums; - } - - /** * Returns all images of a Sone. Images of a album are inserted into this * list before images of all child albums. * @@ -795,7 +777,7 @@ public class Sone implements Fingerprintable, Comparable { */ public List getAllImages() { List allImages = new ArrayList(); - for (Album album : getAllAlbums()) { + for (Album album : FluentIterable.from(getAlbums()).transformAndConcat(Album.FLATTENER).toList()) { allImages.addAll(album.getImages()); } return allImages; @@ -808,7 +790,8 @@ public class Sone implements Fingerprintable, Comparable { * The album to add */ public void addAlbum(Album album) { - Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).check(); + checkNotNull(album, "album must not be null"); + checkArgument(album.getSone().equals(this), "album must belong to this Sone"); if (!albums.contains(album)) { albums.add(album); } @@ -821,7 +804,7 @@ public class Sone implements Fingerprintable, Comparable { * The albums of this Sone */ public void setAlbums(Collection albums) { - Validation.begin().isNotNull("Albums", albums).check(); + checkNotNull(albums, "albums must not be null"); this.albums.clear(); for (Album album : albums) { addAlbum(album); @@ -835,7 +818,8 @@ public class Sone implements Fingerprintable, Comparable { * The album to remove */ public void removeAlbum(Album album) { - Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).check(); + checkNotNull(album, "album must not be null"); + checkArgument(album.getSone().equals(this), "album must belong to this Sone"); albums.remove(album); } @@ -849,7 +833,9 @@ public class Sone implements Fingerprintable, Comparable { * null if the album did not change its place */ public Album moveAlbumUp(Album album) { - Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).isNull("Album Parent", album.getParent()).check(); + checkNotNull(album, "album must not be null"); + checkArgument(album.getSone().equals(this), "album must belong to this Sone"); + checkArgument(album.getParent() == null, "album must not have a parent"); int oldIndex = albums.indexOf(album); if (oldIndex <= 0) { return null; @@ -869,7 +855,9 @@ public class Sone implements Fingerprintable, Comparable { * null if the album did not change its place */ public Album moveAlbumDown(Album album) { - Validation.begin().isNotNull("Album", album).check().isEqual("Album Owner", album.getSone(), this).isNull("Album Parent", album.getParent()).check(); + checkNotNull(album, "album must not be null"); + checkArgument(album.getSone().equals(this), "album must belong to this Sone"); + checkArgument(album.getParent() == null, "album must not have a parent"); int oldIndex = albums.indexOf(album); if ((oldIndex < 0) || (oldIndex >= (albums.size() - 1))) { return null; @@ -888,6 +876,17 @@ public class Sone implements Fingerprintable, Comparable { return options; } + /** + * Sets the options of this Sone. + * + * @param options + * The options of this Sone + */ + /* TODO - remove this method again, maybe add an option provider */ + public void setOptions(Options options) { + this.options = options; + } + // // FINGERPRINTABLE METHODS // @@ -897,46 +896,46 @@ public class Sone implements Fingerprintable, Comparable { */ @Override public synchronized String getFingerprint() { - StringBuilder fingerprint = new StringBuilder(); - fingerprint.append(profile.getFingerprint()); + Hasher hash = Hashing.sha256().newHasher(); + hash.putString(profile.getFingerprint()); - fingerprint.append("Posts("); + hash.putString("Posts("); for (Post post : getPosts()) { - fingerprint.append("Post(").append(post.getId()).append(')'); + hash.putString("Post(").putString(post.getId()).putString(")"); } - fingerprint.append(")"); + hash.putString(")"); List replies = new ArrayList(getReplies()); Collections.sort(replies, Reply.TIME_COMPARATOR); - fingerprint.append("Replies("); + hash.putString("Replies("); for (PostReply reply : replies) { - fingerprint.append("Reply(").append(reply.getId()).append(')'); + hash.putString("Reply(").putString(reply.getId()).putString(")"); } - fingerprint.append(')'); + hash.putString(")"); List likedPostIds = new ArrayList(getLikedPostIds()); Collections.sort(likedPostIds); - fingerprint.append("LikedPosts("); + hash.putString("LikedPosts("); for (String likedPostId : likedPostIds) { - fingerprint.append("Post(").append(likedPostId).append(')'); + hash.putString("Post(").putString(likedPostId).putString(")"); } - fingerprint.append(')'); + hash.putString(")"); List likedReplyIds = new ArrayList(getLikedReplyIds()); Collections.sort(likedReplyIds); - fingerprint.append("LikedReplies("); + hash.putString("LikedReplies("); for (String likedReplyId : likedReplyIds) { - fingerprint.append("Reply(").append(likedReplyId).append(')'); + hash.putString("Reply(").putString(likedReplyId).putString(")"); } - fingerprint.append(')'); + hash.putString(")"); - fingerprint.append("Albums("); + hash.putString("Albums("); for (Album album : albums) { - fingerprint.append(album.getFingerprint()); + hash.putString(album.getFingerprint()); } - fingerprint.append(')'); + hash.putString(")"); - return fingerprint.toString(); + return hash.hash().toString(); } //