X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=c3ac305dc39f3ec513409abbc92125f1feff40ce;hb=f333f58180a7f112394cd768d86c95a3c9edf794;hp=17905f3495e8546c2f8ffed0f6da8e30d41d49f8;hpb=2524f4d47c56874a263f9e53ec5c4035f2baa7e0;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index 17905f3..c3ac305 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -21,8 +21,6 @@ import static com.google.common.base.Optional.fromNullable; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.primitives.Longs.tryParse; -import static java.lang.String.format; -import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import java.util.ArrayList; @@ -40,11 +38,6 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidAlbumFound; -import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidImageFound; -import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidParentAlbumFound; -import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidPostFound; -import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidPostReplyFound; import net.pterodactylus.sone.core.SoneChangeDetector.PostProcessor; import net.pterodactylus.sone.core.SoneChangeDetector.PostReplyProcessor; import net.pterodactylus.sone.core.event.ImageInsertFinishedEvent; @@ -56,19 +49,17 @@ import net.pterodactylus.sone.core.event.NewPostReplyFoundEvent; import net.pterodactylus.sone.core.event.NewSoneFoundEvent; import net.pterodactylus.sone.core.event.PostRemovedEvent; import net.pterodactylus.sone.core.event.PostReplyRemovedEvent; +import net.pterodactylus.sone.core.event.SoneInsertedEvent; import net.pterodactylus.sone.core.event.SoneLockedEvent; import net.pterodactylus.sone.core.event.SoneRemovedEvent; import net.pterodactylus.sone.core.event.SoneUnlockedEvent; import net.pterodactylus.sone.data.Album; -import net.pterodactylus.sone.data.Client; import net.pterodactylus.sone.data.Image; +import net.pterodactylus.sone.data.LocalSone; import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; -import net.pterodactylus.sone.data.Profile; -import net.pterodactylus.sone.data.Profile.Field; import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; -import net.pterodactylus.sone.data.Sone.ShowCustomAvatars; import net.pterodactylus.sone.data.Sone.SoneStatus; import net.pterodactylus.sone.data.TemporaryImage; import net.pterodactylus.sone.database.AlbumBuilder; @@ -89,7 +80,6 @@ import net.pterodactylus.sone.freenet.wot.event.IdentityRemovedEvent; import net.pterodactylus.sone.freenet.wot.event.IdentityUpdatedEvent; import net.pterodactylus.sone.freenet.wot.event.OwnIdentityAddedEvent; import net.pterodactylus.sone.freenet.wot.event.OwnIdentityRemovedEvent; -import net.pterodactylus.sone.main.SonePlugin; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; import net.pterodactylus.util.service.AbstractService; @@ -98,7 +88,6 @@ import net.pterodactylus.util.thread.NamedThreadFactory; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; import com.google.common.base.Optional; -import com.google.common.collect.FluentIterable; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; @@ -154,23 +143,17 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** The trust updater. */ private final WebOfTrustUpdater webOfTrustUpdater; - /** The times Sones were followed. */ - private final Map soneFollowingTimes = new HashMap(); - /** Locked local Sones. */ /* synchronize on itself. */ - private final Set lockedSones = new HashSet(); + private final Set lockedSones = new HashSet(); /** Sone inserters. */ /* synchronize access on this on sones. */ - private final Map soneInserters = new HashMap(); + private final Map soneInserters = new HashMap(); /** Sone rescuers. */ /* synchronize access on this on sones. */ - private final Map soneRescuers = new HashMap(); - - /** All known Sones. */ - private final Set knownSones = new HashSet(); + private final Map soneRescuers = new HashMap(); /** The post database. */ private final Database database; @@ -280,9 +263,8 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The local Sone to get the rescuer for * @return The Sone rescuer for the given Sone */ - public SoneRescuer getSoneRescuer(Sone sone) { + public SoneRescuer getSoneRescuer(LocalSone sone) { checkNotNull(sone, "sone must not be null"); - checkArgument(sone.isLocal(), "sone must be local"); synchronized (soneRescuers) { SoneRescuer soneRescuer = soneRescuers.get(sone); if (soneRescuer == null) { @@ -301,7 +283,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The sone to check * @return {@code true} if the Sone is locked, {@code false} if it is not */ - public boolean isLocked(Sone sone) { + public boolean isLocked(LocalSone sone) { synchronized (lockedSones) { return lockedSones.contains(sone); } @@ -338,27 +320,13 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, return database.getSone(id); } - /** - * {@inheritDocs} - */ @Override - public Collection getLocalSones() { + public Collection getLocalSones() { return database.getLocalSones(); } - /** - * Returns the local Sone with the given ID, optionally creating a new Sone. - * - * @param id - * The ID of the Sone - * @return The Sone with the given ID, or {@code null} - */ - public Sone getLocalSone(String id) { - Optional sone = database.getSone(id); - if (sone.isPresent() && sone.get().isLocal()) { - return sone.get(); - } - return null; + public Optional getLocalSone(String id) { + return database.getLocalSone(id); } /** @@ -389,7 +357,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @return {@code true} if a modification has been detected in the Sone, * {@code false} otherwise */ - public boolean isModifiedSone(Sone sone) { + public boolean isModifiedSone(LocalSone sone) { return soneInserters.containsKey(sone) && soneInserters.get(sone).isModified(); } @@ -402,9 +370,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * been followed, or {@link Long#MAX_VALUE} */ public long getSoneFollowingTime(Sone sone) { - synchronized (soneFollowingTimes) { - return Optional.fromNullable(soneFollowingTimes.get(sone.getId())).or(Long.MAX_VALUE); - } + return database.getSoneFollowingTime(sone.getId()).or(Long.MAX_VALUE); } /** @@ -598,13 +564,13 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** * Locks the given Sone. A locked Sone will not be inserted by - * {@link SoneInserter} until it is {@link #unlockSone(Sone) unlocked} + * {@link SoneInserter} until it is {@link #unlockSone(LocalSone) unlocked} * again. * * @param sone * The sone to lock */ - public void lockSone(Sone sone) { + public void lockSone(LocalSone sone) { synchronized (lockedSones) { if (lockedSones.add(sone)) { eventBus.post(new SoneLockedEvent(sone)); @@ -615,11 +581,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, /** * Unlocks the given Sone. * - * @see #lockSone(Sone) + * @see #lockSone(LocalSone) * @param sone * The sone to unlock */ - public void unlockSone(Sone sone) { + public void unlockSone(LocalSone sone) { synchronized (lockedSones) { if (lockedSones.remove(sone)) { eventBus.post(new SoneUnlockedEvent(sone)); @@ -634,22 +600,21 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * The own identity to create a Sone from * @return The added (or already existing) Sone */ - public Sone addLocalSone(OwnIdentity ownIdentity) { + public LocalSone addLocalSone(OwnIdentity ownIdentity) { if (ownIdentity == null) { logger.log(Level.WARNING, "Given OwnIdentity is null!"); return null; } logger.info(String.format("Adding Sone from OwnIdentity: %s", ownIdentity)); - Sone sone = database.newSoneBuilder().local().from(ownIdentity).build(); - sone.setLatestEdition(fromNullable(tryParse(ownIdentity.getProperty("Sone.LatestEdition"))).or(0L)); - sone.setClient(new Client("Sone", SonePlugin.VERSION.toString())); - sone.setKnown(true); - SoneInserter soneInserter = new SoneInserter(this, eventBus, freenetInterface, ownIdentity.getId()); + LocalSone sone = database.registerLocalSone(ownIdentity); + SoneInserter soneInserter = new SoneInserter(this, eventBus, freenetInterface, database, ownIdentity.getId()); eventBus.register(soneInserter); synchronized (soneInserters) { soneInserters.put(sone, soneInserter); } - loadSone(sone); + synchronized (soneInserters) { + soneInserters.get(sone).setLastInsertFingerprint(database.getLastInsertFingerprint(sone)); + } sone.setStatus(SoneStatus.idle); soneInserter.start(); return sone; @@ -667,7 +632,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, logger.log(Level.SEVERE, String.format("Could not add “Sone” context to own identity: %s", ownIdentity)); return null; } - Sone sone = addLocalSone(ownIdentity); + LocalSone sone = addLocalSone(ownIdentity); followSone(sone, "nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI"); touchConfiguration(); @@ -696,13 +661,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, Sone sone = !newSone ? existingSone.get() : database.newSoneBuilder().from(identity).build(); sone.setLatestEdition(latestEdition); if (newSone) { - synchronized (knownSones) { - newSone = !knownSones.contains(sone.getId()); - } + newSone = !database.isSoneKnown(sone); sone.setKnown(!newSone); if (newSone) { eventBus.post(new NewSoneFoundEvent(sone)); - for (Sone localSone : getLocalSones()) { + for (LocalSone localSone : getLocalSones()) { if (localSone.getOptions().isAutoFollow()) { followSone(localSone, sone.getId()); } @@ -723,31 +686,28 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @param soneId * The ID of the Sone to follow */ - public void followSone(Sone sone, String soneId) { + public void followSone(LocalSone sone, String soneId) { checkNotNull(sone, "sone must not be null"); checkNotNull(soneId, "soneId must not be null"); + boolean newFriend = !database.getSoneFollowingTime(soneId).isPresent(); database.addFriend(sone, soneId); - synchronized (soneFollowingTimes) { - if (!soneFollowingTimes.containsKey(soneId)) { - long now = System.currentTimeMillis(); - soneFollowingTimes.put(soneId, now); - Optional followedSone = getSone(soneId); - if (!followedSone.isPresent()) { - return; - } - for (Post post : followedSone.get().getPosts()) { - if (post.getTime() < now) { - markPostKnown(post); - } + if (newFriend) { + long now = System.currentTimeMillis(); + Optional followedSone = getSone(soneId); + if (!followedSone.isPresent()) { + return; + } + for (Post post : followedSone.get().getPosts()) { + if (post.getTime() < now) { + markPostKnown(post); } - for (PostReply reply : followedSone.get().getReplies()) { - if (reply.getTime() < now) { - markReplyKnown(reply); - } + } + for (PostReply reply : followedSone.get().getReplies()) { + if (reply.getTime() < now) { + markReplyKnown(reply); } } } - touchConfiguration(); } /** @@ -758,20 +718,10 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, * @param soneId * The ID of the Sone being unfollowed */ - public void unfollowSone(Sone sone, String soneId) { + public void unfollowSone(LocalSone sone, String soneId) { checkNotNull(sone, "sone must not be null"); checkNotNull(soneId, "soneId must not be null"); database.removeFriend(sone, soneId); - boolean unfollowedSoneStillFollowed = false; - for (Sone localSone : getLocalSones()) { - unfollowedSoneStillFollowed |= localSone.hasFriend(soneId); - } - if (!unfollowedSoneStillFollowed) { - synchronized (soneFollowingTimes) { - soneFollowingTimes.remove(soneId); - } - } - touchConfiguration(); } /** @@ -966,140 +916,13 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, public void markSoneKnown(Sone sone) { if (!sone.isKnown()) { sone.setKnown(true); - synchronized (knownSones) { - knownSones.add(sone.getId()); - } + database.setSoneKnown(sone); eventBus.post(new MarkSoneKnownEvent(sone)); touchConfiguration(); } } /** - * Loads and updates the given Sone from the configuration. If any error is - * encountered, loading is aborted and the given Sone is not changed. - * - * @param sone - * The Sone to load and update - */ - public void loadSone(Sone sone) { - if (!sone.isLocal()) { - logger.log(Level.FINE, String.format("Tried to load non-local Sone: %s", sone)); - return; - } - logger.info(String.format("Loading local Sone: %s", sone)); - - /* load Sone. */ - String sonePrefix = "Sone/" + sone.getId(); - Long soneTime = configuration.getLongValue(sonePrefix + "/Time").getValue(null); - if (soneTime == null) { - logger.log(Level.INFO, "Could not load Sone because no Sone has been saved."); - return; - } - String lastInsertFingerprint = configuration.getStringValue(sonePrefix + "/LastInsertFingerprint").getValue(""); - - /* load profile. */ - ConfigurationSoneParser configurationSoneParser = new ConfigurationSoneParser(configuration, sone); - Profile profile = configurationSoneParser.parseProfile(); - - /* load posts. */ - Collection posts; - try { - posts = configurationSoneParser.parsePosts(database); - } catch (InvalidPostFound ipf) { - logger.log(Level.WARNING, "Invalid post found, aborting load!"); - return; - } - - /* load replies. */ - Collection replies; - try { - replies = configurationSoneParser.parsePostReplies(database); - } catch (InvalidPostReplyFound iprf) { - logger.log(Level.WARNING, "Invalid reply found, aborting load!"); - return; - } - - /* load post likes. */ - Set likedPostIds = - configurationSoneParser.parseLikedPostIds(); - - /* load reply likes. */ - Set likedReplyIds = - configurationSoneParser.parseLikedPostReplyIds(); - - /* load albums. */ - List topLevelAlbums; - try { - topLevelAlbums = - configurationSoneParser.parseTopLevelAlbums(database); - } catch (InvalidAlbumFound iaf) { - logger.log(Level.WARNING, "Invalid album found, aborting load!"); - return; - } catch (InvalidParentAlbumFound ipaf) { - logger.log(Level.WARNING, format("Invalid parent album ID: %s", - ipaf.getAlbumParentId())); - return; - } - - /* load images. */ - try { - configurationSoneParser.parseImages(database); - } catch (InvalidImageFound iif) { - logger.log(WARNING, "Invalid image found, aborting load!"); - return; - } catch (InvalidParentAlbumFound ipaf) { - logger.log(Level.WARNING, - format("Invalid album image (%s) encountered, aborting load!", - ipaf.getAlbumParentId())); - return; - } - - /* load avatar. */ - String avatarId = configuration.getStringValue(sonePrefix + "/Profile/Avatar").getValue(null); - if (avatarId != null) { - final Map images = - configurationSoneParser.getImages(); - profile.setAvatar(images.get(avatarId)); - } - - /* load options. */ - sone.getOptions().setAutoFollow(configuration.getBooleanValue(sonePrefix + "/Options/AutoFollow").getValue(null)); - sone.getOptions().setSoneInsertNotificationEnabled(configuration.getBooleanValue(sonePrefix + "/Options/EnableSoneInsertNotifications").getValue(null)); - sone.getOptions().setShowNewSoneNotifications(configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewSones").getValue(null)); - sone.getOptions().setShowNewPostNotifications(configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewPosts").getValue(null)); - sone.getOptions().setShowNewReplyNotifications(configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewReplies").getValue(null)); - sone.getOptions().setShowCustomAvatars(ShowCustomAvatars.valueOf(configuration.getStringValue(sonePrefix + "/Options/ShowCustomAvatars").getValue(ShowCustomAvatars.NEVER.name()))); - - /* if we’re still here, Sone was loaded successfully. */ - synchronized (sone) { - sone.setTime(soneTime); - sone.setProfile(profile); - sone.setPosts(posts); - sone.setReplies(replies); - sone.setLikePostIds(likedPostIds); - sone.setLikeReplyIds(likedReplyIds); - for (Album album : sone.getRootAlbum().getAlbums()) { - sone.getRootAlbum().removeAlbum(album); - } - for (Album album : topLevelAlbums) { - sone.getRootAlbum().addAlbum(album); - } - database.storeSone(sone); - synchronized (soneInserters) { - soneInserters.get(sone).setLastInsertFingerprint(lastInsertFingerprint); - } - } - for (Post post : posts) { - post.setKnown(true); - } - for (PostReply reply : replies) { - reply.setKnown(true); - } - - logger.info(String.format("Sone loaded successfully: %s", sone)); - } - - /** * Creates a new post. * * @param sone @@ -1389,9 +1212,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, sleep(1000); long now = System.currentTimeMillis(); if (shouldStop() || ((lastConfigurationUpdate > lastSaved) && ((now - lastConfigurationUpdate) > 5000))) { - for (Sone localSone : getLocalSones()) { - saveSone(localSone); - } saveConfiguration(); lastSaved = now; } @@ -1405,13 +1225,12 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, public void serviceStop() { localElementTicker.shutdownNow(); synchronized (soneInserters) { - for (Entry soneInserter : soneInserters.entrySet()) { + for (Entry soneInserter : soneInserters.entrySet()) { soneInserter.getValue().stop(); - saveSone(soneInserter.getKey()); } } - saveConfiguration(); database.stop(); + saveConfiguration(); webOfTrustUpdater.stop(); updateChecker.stop(); soneDownloader.stop(); @@ -1424,137 +1243,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, // /** - * Saves the given Sone. This will persist all local settings for the given - * Sone, such as the friends list and similar, private options. - * - * @param sone - * The Sone to save - */ - private synchronized void saveSone(Sone sone) { - if (!sone.isLocal()) { - logger.log(Level.FINE, String.format("Tried to save non-local Sone: %s", sone)); - return; - } - if (!(sone.getIdentity() instanceof OwnIdentity)) { - logger.log(Level.WARNING, String.format("Local Sone without OwnIdentity found, refusing to save: %s", sone)); - return; - } - - logger.log(Level.INFO, String.format("Saving Sone: %s", sone)); - try { - /* save Sone into configuration. */ - String sonePrefix = "Sone/" + sone.getId(); - configuration.getLongValue(sonePrefix + "/Time").setValue(sone.getTime()); - configuration.getStringValue(sonePrefix + "/LastInsertFingerprint").setValue(soneInserters.get(sone).getLastInsertFingerprint()); - - /* save profile. */ - Profile profile = sone.getProfile(); - configuration.getStringValue(sonePrefix + "/Profile/FirstName").setValue(profile.getFirstName()); - configuration.getStringValue(sonePrefix + "/Profile/MiddleName").setValue(profile.getMiddleName()); - configuration.getStringValue(sonePrefix + "/Profile/LastName").setValue(profile.getLastName()); - configuration.getIntValue(sonePrefix + "/Profile/BirthDay").setValue(profile.getBirthDay()); - configuration.getIntValue(sonePrefix + "/Profile/BirthMonth").setValue(profile.getBirthMonth()); - configuration.getIntValue(sonePrefix + "/Profile/BirthYear").setValue(profile.getBirthYear()); - configuration.getStringValue(sonePrefix + "/Profile/Avatar").setValue(profile.getAvatar()); - - /* save profile fields. */ - int fieldCounter = 0; - for (Field profileField : profile.getFields()) { - String fieldPrefix = sonePrefix + "/Profile/Fields/" + fieldCounter++; - configuration.getStringValue(fieldPrefix + "/Name").setValue(profileField.getName()); - configuration.getStringValue(fieldPrefix + "/Value").setValue(profileField.getValue()); - } - configuration.getStringValue(sonePrefix + "/Profile/Fields/" + fieldCounter + "/Name").setValue(null); - - /* save posts. */ - int postCounter = 0; - for (Post post : sone.getPosts()) { - String postPrefix = sonePrefix + "/Posts/" + postCounter++; - configuration.getStringValue(postPrefix + "/ID").setValue(post.getId()); - configuration.getStringValue(postPrefix + "/Recipient").setValue(post.getRecipientId().orNull()); - configuration.getLongValue(postPrefix + "/Time").setValue(post.getTime()); - configuration.getStringValue(postPrefix + "/Text").setValue(post.getText()); - } - configuration.getStringValue(sonePrefix + "/Posts/" + postCounter + "/ID").setValue(null); - - /* save replies. */ - int replyCounter = 0; - for (PostReply reply : sone.getReplies()) { - String replyPrefix = sonePrefix + "/Replies/" + replyCounter++; - configuration.getStringValue(replyPrefix + "/ID").setValue(reply.getId()); - configuration.getStringValue(replyPrefix + "/Post/ID").setValue(reply.getPostId()); - configuration.getLongValue(replyPrefix + "/Time").setValue(reply.getTime()); - configuration.getStringValue(replyPrefix + "/Text").setValue(reply.getText()); - } - configuration.getStringValue(sonePrefix + "/Replies/" + replyCounter + "/ID").setValue(null); - - /* save post likes. */ - int postLikeCounter = 0; - for (String postId : sone.getLikedPostIds()) { - configuration.getStringValue(sonePrefix + "/Likes/Post/" + postLikeCounter++ + "/ID").setValue(postId); - } - configuration.getStringValue(sonePrefix + "/Likes/Post/" + postLikeCounter + "/ID").setValue(null); - - /* save reply likes. */ - int replyLikeCounter = 0; - for (String replyId : sone.getLikedReplyIds()) { - configuration.getStringValue(sonePrefix + "/Likes/Reply/" + replyLikeCounter++ + "/ID").setValue(replyId); - } - configuration.getStringValue(sonePrefix + "/Likes/Reply/" + replyLikeCounter + "/ID").setValue(null); - - /* save albums. first, collect in a flat structure, top-level first. */ - List albums = FluentIterable.from(sone.getRootAlbum().getAlbums()).transformAndConcat(Album.FLATTENER).toList(); - - int albumCounter = 0; - for (Album album : albums) { - String albumPrefix = sonePrefix + "/Albums/" + albumCounter++; - configuration.getStringValue(albumPrefix + "/ID").setValue(album.getId()); - configuration.getStringValue(albumPrefix + "/Title").setValue(album.getTitle()); - configuration.getStringValue(albumPrefix + "/Description").setValue(album.getDescription()); - configuration.getStringValue(albumPrefix + "/Parent").setValue(album.getParent().equals(sone.getRootAlbum()) ? null : album.getParent().getId()); - configuration.getStringValue(albumPrefix + "/AlbumImage").setValue(album.getAlbumImage() == null ? null : album.getAlbumImage().getId()); - } - configuration.getStringValue(sonePrefix + "/Albums/" + albumCounter + "/ID").setValue(null); - - /* save images. */ - int imageCounter = 0; - for (Album album : albums) { - for (Image image : album.getImages()) { - if (!image.isInserted()) { - continue; - } - String imagePrefix = sonePrefix + "/Images/" + imageCounter++; - configuration.getStringValue(imagePrefix + "/ID").setValue(image.getId()); - configuration.getStringValue(imagePrefix + "/Album").setValue(album.getId()); - configuration.getStringValue(imagePrefix + "/Key").setValue(image.getKey()); - configuration.getStringValue(imagePrefix + "/Title").setValue(image.getTitle()); - configuration.getStringValue(imagePrefix + "/Description").setValue(image.getDescription()); - configuration.getLongValue(imagePrefix + "/CreationTime").setValue(image.getCreationTime()); - configuration.getIntValue(imagePrefix + "/Width").setValue(image.getWidth()); - configuration.getIntValue(imagePrefix + "/Height").setValue(image.getHeight()); - } - } - configuration.getStringValue(sonePrefix + "/Images/" + imageCounter + "/ID").setValue(null); - - /* save options. */ - configuration.getBooleanValue(sonePrefix + "/Options/AutoFollow").setValue(sone.getOptions().isAutoFollow()); - configuration.getBooleanValue(sonePrefix + "/Options/EnableSoneInsertNotifications").setValue(sone.getOptions().isSoneInsertNotificationEnabled()); - configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewSones").setValue(sone.getOptions().isShowNewSoneNotifications()); - configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewPosts").setValue(sone.getOptions().isShowNewPostNotifications()); - configuration.getBooleanValue(sonePrefix + "/Options/ShowNotification/NewReplies").setValue(sone.getOptions().isShowNewReplyNotifications()); - configuration.getStringValue(sonePrefix + "/Options/ShowCustomAvatars").setValue(sone.getOptions().getShowCustomAvatars().name()); - - configuration.save(); - - webOfTrustUpdater.setProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition", String.valueOf(sone.getLatestEdition())); - - logger.log(Level.INFO, String.format("Sone %s saved.", sone)); - } catch (ConfigurationException ce1) { - logger.log(Level.WARNING, String.format("Could not save Sone: %s", sone), ce1); - } - } - - /** * Saves the current options. */ private void saveConfiguration() { @@ -1570,26 +1258,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, try { preferences.saveTo(configuration); - /* save known Sones. */ - int soneCounter = 0; - synchronized (knownSones) { - for (String knownSoneId : knownSones) { - configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSoneId); - } - configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); - } - - /* save Sone following times. */ - soneCounter = 0; - synchronized (soneFollowingTimes) { - for (Entry soneFollowingTime : soneFollowingTimes.entrySet()) { - configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(soneFollowingTime.getKey()); - configuration.getLongValue("SoneFollowingTimes/" + soneCounter + "/Time").setValue(soneFollowingTime.getValue()); - ++soneCounter; - } - configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").setValue(null); - } - /* save known posts. */ database.save(); @@ -1612,32 +1280,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, */ private void loadConfiguration() { new PreferencesLoader(preferences).loadFrom(configuration); - - /* load known Sones. */ - int soneCounter = 0; - while (true) { - String knownSoneId = configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").getValue(null); - if (knownSoneId == null) { - break; - } - synchronized (knownSones) { - knownSones.add(knownSoneId); - } - } - - /* load Sone following times. */ - soneCounter = 0; - while (true) { - String soneId = configuration.getStringValue("SoneFollowingTimes/" + soneCounter + "/Sone").getValue(null); - if (soneId == null) { - break; - } - long time = configuration.getLongValue("SoneFollowingTimes/" + soneCounter + "/Time").getValue(Long.MAX_VALUE); - synchronized (soneFollowingTimes) { - soneFollowingTimes.put(soneId, time); - } - ++soneCounter; - } } /** @@ -1728,6 +1370,14 @@ public class Core extends AbstractService implements SoneProvider, PostProvider, eventBus.post(new SoneRemovedEvent(sone.get())); } + @Subscribe + public void soneInserted(SoneInsertedEvent soneInsertedEvent) { + Sone sone = soneInsertedEvent.sone(); + database.setLastInsertFingerprint(sone, soneInsertedEvent.insertFingerprint()); + webOfTrustUpdater.setProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition", String.valueOf( + sone.getLatestEdition())); + } + /** * Deletes the temporary image. *