From 851ef7a7f4e25fe3c57c2d9c67349acce58f1ddc Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Thu, 18 Dec 2014 20:43:13 +0100 Subject: [PATCH] Fix loading of local Sones without posts and replies. --- .../sone/core/ConfigurationSoneParser.java | 18 +++--- .../sone/database/memory/MemoryDatabase.java | 65 ++++++++++++---------- .../sone/core/ConfigurationSoneParserTest.java | 50 ++++++++--------- 3 files changed, 69 insertions(+), 64 deletions(-) diff --git a/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java b/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java index a29856b..f592c1e 100644 --- a/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java +++ b/src/main/java/net/pterodactylus/sone/core/ConfigurationSoneParser.java @@ -33,19 +33,19 @@ import net.pterodactylus.util.config.Configuration; public class ConfigurationSoneParser { private final Configuration configuration; - private final Sone sone; + private final String soneId; 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) { + public ConfigurationSoneParser(Configuration configuration, String soneId) { this.configuration = configuration; - this.sone = sone; - sonePrefix = "Sone/" + sone.getId(); + this.soneId = soneId; + sonePrefix = "Sone/" + soneId; } - public Profile parseProfile() { + public Profile parseProfile(Sone sone) { Profile profile = new Profile(sone); profile.setFirstName(getString("/Profile/FirstName", null)); profile.setMiddleName(getString("/Profile/MiddleName", null)); @@ -100,7 +100,7 @@ public class ConfigurationSoneParser { } PostBuilder postBuilder = postBuilderFactory.newPostBuilder() .withId(postId) - .from(sone.getId()) + .from(soneId) .withTime(postTime) .withText(postText); String postRecipientId = @@ -139,7 +139,7 @@ public class ConfigurationSoneParser { PostReplyBuilder postReplyBuilder = postReplyBuilderFactory .newPostReplyBuilder() .withId(replyId) - .from(sone.getId()) + .from(soneId) .to(postId) .withTime(replyTime) .withText(replyText); @@ -189,7 +189,7 @@ public class ConfigurationSoneParser { } public List parseTopLevelAlbums( - AlbumBuilderFactory albumBuilderFactory) { + AlbumBuilderFactory albumBuilderFactory, Sone sone) { int albumCounter = 0; while (true) { String albumPrefix = "/Albums/" + albumCounter++; @@ -233,7 +233,7 @@ public class ConfigurationSoneParser { return unmodifiableMap(albums); } - public void parseImages(ImageBuilderFactory imageBuilderFactory) { + public void parseImages(ImageBuilderFactory imageBuilderFactory, Sone sone) { int imageCounter = 0; while (true) { String imagePrefix = "/Images/" + imageCounter++; diff --git a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java index 8815abc..561f14f 100644 --- a/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java +++ b/src/main/java/net/pterodactylus/sone/database/memory/MemoryDatabase.java @@ -182,45 +182,56 @@ public class MemoryDatabase extends AbstractService implements Database { } private LocalSone loadLocalSone(OwnIdentity ownIdentity) { - LocalSone localSone = newSoneBuilder().from(ownIdentity).using( - new Client("Sone", SonePlugin.VERSION.toString())).buildLocal(); + final SoneBuilder soneBuilder = newSoneBuilder().from(ownIdentity).using( + new Client("Sone", SonePlugin.VERSION.toString())); + + loadElements(soneBuilder, ownIdentity.getId()); + + LocalSone localSone = soneBuilder.buildLocal(); + loadSone(localSone); + localSone.setKnown(true); localSone.setLatestEdition( Optional.fromNullable( Longs.tryParse(ownIdentity.getProperty(LATEST_EDITION_PROPERTY))) .or(0L)); - localSone.setKnown(true); - - loadSone(localSone); return localSone; } - private void loadSone(LocalSone sone) { - long soneTime = configurationLoader.getLocalSoneTime(sone.getId()); - if (soneTime == -1) { - return; - } + private void loadElements(SoneBuilder soneBuilder, String soneId) { + ConfigurationSoneParser configurationSoneParser = new ConfigurationSoneParser(configuration, soneId); - /* load profile. */ - ConfigurationSoneParser configurationSoneParser = new ConfigurationSoneParser(configuration, sone); - Profile profile = configurationSoneParser.parseProfile(); - - /* load posts. */ - Collection posts; try { - posts = configurationSoneParser.parsePosts(this); + Set posts = configurationSoneParser.parsePosts(this); + soneBuilder.withPosts(posts); + for (Post post : posts) { + post.setKnown(true); + } } catch (InvalidPostFound ipf) { logger.log(Level.WARNING, "Invalid post found, aborting load!"); return; } - /* load replies. */ - Collection postReplies; try { - postReplies = configurationSoneParser.parsePostReplies(this); + Set postReplies = configurationSoneParser.parsePostReplies(this); + soneBuilder.withPostReplies(postReplies); + for (PostReply reply : postReplies) { + reply.setKnown(true); + } } catch (InvalidPostReplyFound iprf) { logger.log(Level.WARNING, "Invalid reply found, aborting load!"); return; } + } + + private void loadSone(LocalSone sone) { + long soneTime = configurationLoader.getLocalSoneTime(sone.getId()); + if (soneTime == -1) { + return; + } + + /* load profile. */ + ConfigurationSoneParser configurationSoneParser = new ConfigurationSoneParser(configuration, sone.getId()); + Profile profile = configurationSoneParser.parseProfile(sone); /* load post likes. */ Set likedPostIds = configurationSoneParser.parseLikedPostIds(); @@ -231,7 +242,7 @@ public class MemoryDatabase extends AbstractService implements Database { /* load albums. */ List topLevelAlbums; try { - topLevelAlbums = configurationSoneParser.parseTopLevelAlbums(this); + topLevelAlbums = configurationSoneParser.parseTopLevelAlbums(this, sone); } catch (InvalidAlbumFound iaf) { logger.log(Level.WARNING, "Invalid album found, aborting load!"); return; @@ -243,7 +254,7 @@ public class MemoryDatabase extends AbstractService implements Database { /* load images. */ try { - configurationSoneParser.parseImages(this); + configurationSoneParser.parseImages(this, sone); } catch (InvalidImageFound iif) { logger.log(WARNING, "Invalid image found, aborting load!"); return; @@ -284,19 +295,13 @@ public class MemoryDatabase extends AbstractService implements Database { lastInsertFingerprints.put(sone.getId(), lastInsertFingerprint); allSones.put(sone.getId(), sone); - storePosts(sone.getId(), posts); - storePostReplies(sone.getId(), postReplies); + storePosts(sone.getId(), sone.getPosts()); + storePostReplies(sone.getId(), sone.getReplies()); storeAlbums(sone.getId(), topLevelAlbums); storeImages(sone.getId(), from(topLevelAlbums).transformAndConcat(Album.FLATTENER).transformAndConcat(Album.IMAGES).toList()); } finally { lock.writeLock().unlock(); } - for (Post post : posts) { - post.setKnown(true); - } - for (PostReply reply : postReplies) { - reply.setKnown(true); - } logger.info(String.format("Sone loaded successfully: %s", sone)); } diff --git a/src/test/java/net/pterodactylus/sone/core/ConfigurationSoneParserTest.java b/src/test/java/net/pterodactylus/sone/core/ConfigurationSoneParserTest.java index 7bbfae8..0df4836 100644 --- a/src/test/java/net/pterodactylus/sone/core/ConfigurationSoneParserTest.java +++ b/src/test/java/net/pterodactylus/sone/core/ConfigurationSoneParserTest.java @@ -69,13 +69,13 @@ public class ConfigurationSoneParserTest { public ConfigurationSoneParserTest() { when(sone.getId()).thenReturn("1"); configurationSoneParser = - new ConfigurationSoneParser(configuration, sone); + new ConfigurationSoneParser(configuration, "1"); } @Test public void emptyProfileIsLoadedCorrectly() { setupEmptyProfile(); - Profile profile = configurationSoneParser.parseProfile(); + Profile profile = configurationSoneParser.parseProfile(sone); assertThat(profile, notNullValue()); assertThat(profile.getFirstName(), nullValue()); assertThat(profile.getMiddleName(), nullValue()); @@ -96,7 +96,7 @@ public class ConfigurationSoneParserTest { @Test public void filledProfileWithFieldsIsParsedCorrectly() { setupFilledProfile(); - Profile profile = configurationSoneParser.parseProfile(); + Profile profile = configurationSoneParser.parseProfile(sone); assertThat(profile, notNullValue()); assertThat(profile.getFirstName(), is("First")); assertThat(profile.getMiddleName(), is("M.")); @@ -330,7 +330,7 @@ public class ConfigurationSoneParserTest { AlbumBuilderFactory albumBuilderFactory = createAlbumBuilderFactory(); List topLevelAlbums = configurationSoneParser.parseTopLevelAlbums( - albumBuilderFactory); + albumBuilderFactory, sone); assertThat(topLevelAlbums, hasSize(2)); Album firstAlbum = topLevelAlbums.get(0); assertThat(firstAlbum, isAlbum("A1", null, "T1", "D1", "I1")); @@ -381,30 +381,30 @@ public class ConfigurationSoneParserTest { public void albumWithInvalidTitleIsRecognized() { setupAlbum(0, "A1", null, null, "D1", "I1"); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); } @Test(expected = InvalidAlbumFound.class) public void albumWithInvalidDescriptionIsRecognized() { setupAlbum(0, "A1", null, "T1", null, "I1"); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); } @Test(expected = InvalidParentAlbumFound.class) public void albumWithInvalidParentIsRecognized() { setupAlbum(0, "A1", "A0", "T1", "D1", "I1"); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); } @Test public void imagesAreParsedCorrectly() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImages(); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); Map albums = configurationSoneParser.getAlbums(); assertThat(albums.get("A1").getImages(), contains(isImage("I1", 1000L, "K1", "T1", "D1", 16, 9))); @@ -453,72 +453,72 @@ public class ConfigurationSoneParserTest { public void missingAlbumIdIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", null, 1000L, "K1", "T1", "D1", 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidParentAlbumFound.class) public void invalidAlbumIdIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A4", 1000L, "K1", "T1", "D1", 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingCreationTimeIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", null, "K1", "T1", "D1", 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingKeyIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", 1000L, null, "T1", "D1", 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingTitleIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", 1000L, "K1", null, "D1", 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingDescriptionIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", 1000L, "K1", "T1", null, 16, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingWidthIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", 1000L, "K1", "T1", "D1", null, 9); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } @Test(expected = InvalidImageFound.class) public void missingHeightIsRecognized() { setupTopLevelAlbums(); configurationSoneParser.parseTopLevelAlbums( - createAlbumBuilderFactory()); + createAlbumBuilderFactory(), sone); setupImage(0, "I1", "A1", 1000L, "K1", "T1", "D1", 16, null); - configurationSoneParser.parseImages(createImageBuilderFactory()); + configurationSoneParser.parseImages(createImageBuilderFactory(), sone); } } -- 2.7.4