+ /* load reply likes. */
+ Set<String> likedReplyIds = new HashSet<String>();
+ while (true) {
+ String likedReplyId = configuration.getStringValue(sonePrefix + "/Likes/Reply/" + likedReplyIds.size() + "/ID").getValue(null);
+ if (likedReplyId == null) {
+ break;
+ }
+ likedReplyIds.add(likedReplyId);
+ }
+
+ /* load friends. */
+ Set<String> friends = new HashSet<String>();
+ while (true) {
+ String friendId = configuration.getStringValue(sonePrefix + "/Friends/" + friends.size() + "/ID").getValue(null);
+ if (friendId == null) {
+ break;
+ }
+ friends.add(friendId);
+ }
+
+ /* 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);
+ sone.setFriends(friends);
+ soneInserters.get(sone).setLastInsertFingerprint(lastInsertFingerprint);
+ }
+ synchronized (newSones) {
+ for (String friend : friends) {
+ knownSones.add(friend);
+ }
+ }
+ synchronized (newPosts) {
+ for (Post post : posts) {
+ knownPosts.add(post.getId());
+ }
+ }
+ synchronized (newReplies) {
+ for (Reply reply : replies) {
+ knownReplies.add(reply.getId());
+ }
+ }
+ }
+
+ /**
+ * 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
+ */
+ public void saveSone(Sone sone) {
+ if (!isLocalSone(sone)) {
+ logger.log(Level.FINE, "Tried to save non-local Sone: %s", sone);
+ return;
+ }
+ if (!(sone.getIdentity() instanceof OwnIdentity)) {
+ logger.log(Level.WARNING, "Local Sone without OwnIdentity found, refusing to save: %s", sone);
+ return;
+ }
+
+ logger.log(Level.INFO, "Saving Sone: %s", sone);
+ identityManager.setProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition", String.valueOf(sone.getLatestEdition()));
+ 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());
+
+ /* save posts. */
+ int postCounter = 0;
+ for (Post post : sone.getPosts()) {
+ String postPrefix = sonePrefix + "/Posts/" + postCounter++;
+ configuration.getStringValue(postPrefix + "/ID").setValue(post.getId());
+ if (post.getRecipient() != null) {
+ configuration.getStringValue(postPrefix + "/Recipient").setValue(post.getRecipient().getId());