Replace unnecessary type parameters with <>
[Sone.git] / src / main / java / net / pterodactylus / sone / core / ConfigurationSoneParser.java
index 39dcd12..99c1c9d 100644 (file)
@@ -1,14 +1,24 @@
 package net.pterodactylus.sone.core;
 
+import static java.util.Collections.unmodifiableMap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.annotation.Nullable;
 
+import net.pterodactylus.sone.data.Album;
+import net.pterodactylus.sone.data.Image;
 import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Profile;
 import net.pterodactylus.sone.data.Sone;
+import net.pterodactylus.sone.database.AlbumBuilderFactory;
+import net.pterodactylus.sone.database.ImageBuilderFactory;
 import net.pterodactylus.sone.database.PostBuilder;
 import net.pterodactylus.sone.database.PostBuilderFactory;
 import net.pterodactylus.sone.database.PostReplyBuilder;
@@ -17,14 +27,15 @@ import net.pterodactylus.util.config.Configuration;
 
 /**
  * Parses a {@link Sone}’s data from a {@link Configuration}.
- *
- * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
 public class ConfigurationSoneParser {
 
        private final Configuration configuration;
        private final Sone sone;
        private final String sonePrefix;
+       private final Map<String, Album> albums = new HashMap<>();
+       private final List<Album> topLevelAlbums = new ArrayList<>();
+       private final Map<String, Image> images = new HashMap<>();
 
        public ConfigurationSoneParser(Configuration configuration, Sone sone) {
                this.configuration = configuration;
@@ -73,7 +84,7 @@ public class ConfigurationSoneParser {
 
        public Set<Post> parsePosts(PostBuilderFactory postBuilderFactory)
        throws InvalidPostFound {
-               Set<Post> posts = new HashSet<Post>();
+               Set<Post> posts = new HashSet<>();
                while (true) {
                        String postPrefix = "/Posts/" + posts.size();
                        String postId = getString(postPrefix + "/ID", null);
@@ -110,7 +121,7 @@ public class ConfigurationSoneParser {
 
        public Set<PostReply> parsePostReplies(
                        PostReplyBuilderFactory postReplyBuilderFactory) {
-               Set<PostReply> replies = new HashSet<PostReply>();
+               Set<PostReply> replies = new HashSet<>();
                while (true) {
                        String replyPrefix = "/Replies/" + replies.size();
                        String replyId = getString(replyPrefix + "/ID", null);
@@ -136,7 +147,7 @@ public class ConfigurationSoneParser {
        }
 
        public Set<String> parseLikedPostIds() {
-               Set<String> likedPostIds = new HashSet<String>();
+               Set<String> likedPostIds = new HashSet<>();
                while (true) {
                        String likedPostId =
                                        getString("/Likes/Post/" + likedPostIds.size() + "/ID",
@@ -150,7 +161,7 @@ public class ConfigurationSoneParser {
        }
 
        public Set<String> parseLikedPostReplyIds() {
-               Set<String> likedPostReplyIds = new HashSet<String>();
+               Set<String> likedPostReplyIds = new HashSet<>();
                while (true) {
                        String likedReplyId = getString(
                                        "/Likes/Reply/" + likedPostReplyIds.size() + "/ID", null);
@@ -163,7 +174,7 @@ public class ConfigurationSoneParser {
        }
 
        public Set<String> parseFriends() {
-               Set<String> friends = new HashSet<String>();
+               Set<String> friends = new HashSet<>();
                while (true) {
                        String friendId =
                                        getString("/Friends/" + friends.size() + "/ID", null);
@@ -175,8 +186,122 @@ public class ConfigurationSoneParser {
                return friends;
        }
 
+       public List<Album> parseTopLevelAlbums(
+                       AlbumBuilderFactory albumBuilderFactory) {
+               int albumCounter = 0;
+               while (true) {
+                       String albumPrefix = "/Albums/" + albumCounter++;
+                       String albumId = getString(albumPrefix + "/ID", null);
+                       if (albumId == null) {
+                               break;
+                       }
+                       String albumTitle = getString(albumPrefix + "/Title", null);
+                       String albumDescription =
+                                       getString(albumPrefix + "/Description", null);
+                       String albumParentId = getString(albumPrefix + "/Parent", null);
+                       if ((albumTitle == null) || (albumDescription == null)) {
+                               throw new InvalidAlbumFound();
+                       }
+                       Album album = albumBuilderFactory.newAlbumBuilder()
+                                       .withId(albumId)
+                                       .by(sone)
+                                       .build()
+                                       .modify()
+                                       .setTitle(albumTitle)
+                                       .setDescription(albumDescription)
+                                       .update();
+                       if (albumParentId != null) {
+                               Album parentAlbum = albums.get(albumParentId);
+                               if (parentAlbum == null) {
+                                       throw new InvalidParentAlbumFound(albumParentId);
+                               }
+                               parentAlbum.addAlbum(album);
+                       } else {
+                               topLevelAlbums.add(album);
+                       }
+                       albums.put(albumId, album);
+               }
+               return topLevelAlbums;
+       }
+
+       public Map<String, Album> getAlbums() {
+               return unmodifiableMap(albums);
+       }
+
+       public void parseImages(ImageBuilderFactory imageBuilderFactory) {
+               int imageCounter = 0;
+               while (true) {
+                       String imagePrefix = "/Images/" + imageCounter++;
+                       String imageId = getString(imagePrefix + "/ID", null);
+                       if (imageId == null) {
+                               break;
+                       }
+                       String albumId = getString(imagePrefix + "/Album", null);
+                       String key = getString(imagePrefix + "/Key", null);
+                       String title = getString(imagePrefix + "/Title", null);
+                       String description =
+                                       getString(imagePrefix + "/Description", null);
+                       Long creationTime = getLong(imagePrefix + "/CreationTime", null);
+                       Integer width = getInt(imagePrefix + "/Width", null);
+                       Integer height = getInt(imagePrefix + "/Height", null);
+                       if (albumAttributesAreInvalid(albumId, key, title, description,
+                                       creationTime,
+                                       width, height)) {
+                               throw new InvalidImageFound();
+                       }
+                       Album album = albums.get(albumId);
+                       if (album == null) {
+                               throw new InvalidParentAlbumFound(albumId);
+                       }
+                       Image image = imageBuilderFactory.newImageBuilder()
+                                       .withId(imageId)
+                                       .build()
+                                       .modify()
+                                       .setSone(sone)
+                                       .setCreationTime(creationTime)
+                                       .setKey(key)
+                                       .setTitle(title)
+                                       .setDescription(description)
+                                       .setWidth(width)
+                                       .setHeight(height)
+                                       .update();
+                       album.addImage(image);
+                       images.put(image.getId(), image);
+               }
+       }
+
+       public Map<String, Image> getImages() {
+               return images;
+       }
+
+       private boolean albumAttributesAreInvalid(String albumId, String key,
+                       String title, String description, Long creationTime,
+                       Integer width, Integer height) {
+               return (albumId == null) || (key == null) || (title == null) || (
+                               description == null) || (creationTime == null) || (width
+                               == null) || (height == null);
+       }
+
        public static class InvalidPostFound extends RuntimeException { }
 
        public static class InvalidPostReplyFound extends RuntimeException { }
 
+       public static class InvalidAlbumFound extends RuntimeException { }
+
+       public static class InvalidParentAlbumFound extends RuntimeException {
+
+               private final String albumParentId;
+
+               public InvalidParentAlbumFound(String albumParentId) {
+                       this.albumParentId = albumParentId;
+               }
+
+               public String getAlbumParentId() {
+                       return albumParentId;
+               }
+
+       }
+
+       public static class InvalidImageFound extends RuntimeException { }
+
 }