X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FConfigurationSoneParser.java;h=aa387e924635f1bd9c9d8f88e61b704a31584d4d;hp=4f80e08e4e22176f6e9fdd6f849a67ea9b8f19c7;hb=62573c314957b1851f4fbe693b8746686caa940a;hpb=68d5537f9d502ce6dc7079ae55b52b9284a01899 diff --git a/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java b/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java index 4f80e08..aa387e9 100644 --- a/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java +++ b/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java @@ -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 David ‘Bombe’ Roden */ public class ConfigurationSoneParser { private final Configuration configuration; private final Sone sone; private final String sonePrefix; + private final Map albums = new HashMap(); + private final List topLevelAlbums = new ArrayList(); + private final Map images = new HashMap(); public ConfigurationSoneParser(Configuration configuration, Sone sone) { this.configuration = configuration; @@ -149,8 +160,148 @@ public class ConfigurationSoneParser { return likedPostIds; } + public Set parseLikedPostReplyIds() { + Set likedPostReplyIds = new HashSet(); + while (true) { + String likedReplyId = getString( + "/Likes/Reply/" + likedPostReplyIds.size() + "/ID", null); + if (likedReplyId == null) { + break; + } + likedPostReplyIds.add(likedReplyId); + } + return likedPostReplyIds; + } + + public Set parseFriends() { + Set friends = new HashSet(); + while (true) { + String friendId = + getString("/Friends/" + friends.size() + "/ID", null); + if (friendId == null) { + break; + } + friends.add(friendId); + } + return friends; + } + + public List 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 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 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 { } + }