X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=a1282cc2f8706dbb3470034f7719a6c71685711a;hb=043b045d6e3f3908597d789606368d0b08ef6a59;hp=bdea9893f0b1ccd7c12e0e6c7ae8fce0075a75b9;hpb=96fcb6d250349cb1c02df44d6e3acdb93c8e7370;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 bdea989..a1282cc 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -34,6 +34,7 @@ import net.pterodactylus.sone.core.Options.OptionWatcher; import net.pterodactylus.sone.data.Client; import net.pterodactylus.sone.data.Post; 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.freenet.wot.Identity; @@ -45,6 +46,7 @@ import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.number.Numbers; +import net.pterodactylus.util.version.Version; import freenet.keys.FreenetURI; /** @@ -52,7 +54,7 @@ import freenet.keys.FreenetURI; * * @author David ‘Bombe’ Roden */ -public class Core implements IdentityListener { +public class Core implements IdentityListener, UpdateListener { /** * Enumeration for the possible states of a {@link Sone}. @@ -86,6 +88,9 @@ public class Core implements IdentityListener { /** The configuration. */ private Configuration configuration; + /** Whether we’re currently saving the configuration. */ + private boolean storingConfiguration = false; + /** The identity manager. */ private final IdentityManager identityManager; @@ -95,6 +100,9 @@ public class Core implements IdentityListener { /** The Sone downloader. */ private final SoneDownloader soneDownloader; + /** The update checker. */ + private final UpdateChecker updateChecker; + /** Whether the core has been stopped. */ private volatile boolean stopped; @@ -159,6 +167,7 @@ public class Core implements IdentityListener { this.freenetInterface = freenetInterface; this.identityManager = identityManager; this.soneDownloader = new SoneDownloader(this, freenetInterface); + this.updateChecker = new UpdateChecker(freenetInterface); } // @@ -230,6 +239,15 @@ public class Core implements IdentityListener { } /** + * Returns the update checker. + * + * @return The update checker + */ + public UpdateChecker getUpdateChecker() { + return updateChecker; + } + + /** * Returns the status of the given Sone. * * @param sone @@ -561,10 +579,9 @@ public class Core implements IdentityListener { synchronized (newPosts) { boolean isNew = !knownPosts.contains(postId) && newPosts.contains(postId); if (markAsKnown) { - newPosts.remove(postId); - knownPosts.add(postId); - if (isNew) { - coreListenerManager.fireMarkPostKnown(getPost(postId)); + Post post = getPost(postId, false); + if (post != null) { + markPostKnown(post); } } return isNew; @@ -654,10 +671,9 @@ public class Core implements IdentityListener { synchronized (newReplies) { boolean isNew = !knownReplies.contains(replyId) && newReplies.contains(replyId); if (markAsKnown) { - newReplies.remove(replyId); - knownReplies.add(replyId); - if (isNew) { - coreListenerManager.fireMarkReplyKnown(getReply(replyId)); + Reply reply = getReply(replyId, false); + if (reply != null) { + markReplyKnown(reply); } } return isNew; @@ -712,7 +728,9 @@ public class Core implements IdentityListener { */ public void lockSone(Sone sone) { synchronized (lockedSones) { - lockedSones.add(sone); + if (lockedSones.add(sone)) { + coreListenerManager.fireSoneLocked(sone); + } } } @@ -725,7 +743,9 @@ public class Core implements IdentityListener { */ public void unlockSone(Sone sone) { synchronized (lockedSones) { - lockedSones.remove(sone); + if (lockedSones.remove(sone)) { + coreListenerManager.fireSoneUnlocked(sone); + } } } @@ -887,6 +907,9 @@ public class Core implements IdentityListener { if (!soneRescueMode) { for (Post post : storedSone.getPosts()) { posts.remove(post.getId()); + if (!sone.getPosts().contains(post)) { + coreListenerManager.firePostRemoved(post); + } } } synchronized (newPosts) { @@ -904,6 +927,9 @@ public class Core implements IdentityListener { if (!soneRescueMode) { for (Reply reply : storedSone.getReplies()) { replies.remove(reply.getId()); + if (!sone.getReplies().contains(reply)) { + coreListenerManager.fireReplyRemoved(reply); + } } } synchronized (newReplies) { @@ -1008,6 +1034,17 @@ public class Core implements IdentityListener { profile.setBirthMonth(configuration.getIntValue(sonePrefix + "/Profile/BirthMonth").getValue(null)); profile.setBirthYear(configuration.getIntValue(sonePrefix + "/Profile/BirthYear").getValue(null)); + /* load profile fields. */ + while (true) { + String fieldPrefix = sonePrefix + "/Profile/Fields/" + profile.getFields().size(); + String fieldName = configuration.getStringValue(fieldPrefix + "/Name").getValue(null); + if (fieldName == null) { + break; + } + String fieldValue = configuration.getStringValue(fieldPrefix + "/Value").getValue(""); + profile.addField(fieldName).setValue(fieldValue); + } + /* load posts. */ Set posts = new HashSet(); while (true) { @@ -1113,7 +1150,7 @@ public class Core implements IdentityListener { * @param sone * The Sone to save */ - public void saveSone(Sone sone) { + public synchronized void saveSone(Sone sone) { if (!isLocalSone(sone)) { logger.log(Level.FINE, "Tried to save non-local Sone: %s", sone); return; @@ -1140,14 +1177,21 @@ public class Core implements IdentityListener { configuration.getIntValue(sonePrefix + "/Profile/BirthMonth").setValue(profile.getBirthMonth()); configuration.getIntValue(sonePrefix + "/Profile/BirthYear").setValue(profile.getBirthYear()); + /* 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()); - if (post.getRecipient() != null) { - configuration.getStringValue(postPrefix + "/Recipient").setValue(post.getRecipient().getId()); - } + configuration.getStringValue(postPrefix + "/Recipient").setValue((post.getRecipient() != null) ? post.getRecipient().getId() : null); configuration.getLongValue(postPrefix + "/Time").setValue(post.getTime()); configuration.getStringValue(postPrefix + "/Text").setValue(post.getText()); } @@ -1185,6 +1229,7 @@ public class Core implements IdentityListener { } configuration.getStringValue(sonePrefix + "/Friends/" + friendCounter + "/ID").setValue(null); + configuration.save(); logger.log(Level.INFO, "Sone %s saved.", sone); } catch (ConfigurationException ce1) { logger.log(Level.WARNING, "Could not save Sone: " + sone, ce1); @@ -1299,6 +1344,7 @@ public class Core implements IdentityListener { if (newPosts.remove(post.getId())) { knownPosts.add(post.getId()); coreListenerManager.fireMarkPostKnown(post); + saveConfiguration(); } } } @@ -1379,6 +1425,7 @@ public class Core implements IdentityListener { if (newReplies.remove(reply.getId())) { knownReplies.add(reply.getId()); coreListenerManager.fireMarkReplyKnown(reply); + saveConfiguration(); } } } @@ -1388,6 +1435,8 @@ public class Core implements IdentityListener { */ public void start() { loadConfiguration(); + updateChecker.addUpdateListener(this); + updateChecker.start(); } /** @@ -1399,6 +1448,9 @@ public class Core implements IdentityListener { soneInserter.stop(); } } + updateChecker.stop(); + updateChecker.removeUpdateListener(this); + soneDownloader.stop(); saveConfiguration(); stopped = true; } @@ -1407,8 +1459,17 @@ public class Core implements IdentityListener { * Saves the current options. */ public void saveConfiguration() { + synchronized (configuration) { + if (storingConfiguration) { + logger.log(Level.FINE, "Already storing configuration…"); + return; + } + storingConfiguration = true; + } + /* store the options first. */ try { + configuration.getIntValue("Option/ConfigurationVersion").setValue(0); configuration.getIntValue("Option/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal()); configuration.getBooleanValue("Option/SoneRescueMode").setValue(options.getBooleanOption("SoneRescueMode").getReal()); configuration.getBooleanValue("Option/ClearOnNextRestart").setValue(options.getBooleanOption("ClearOnNextRestart").getReal()); @@ -1446,6 +1507,10 @@ public class Core implements IdentityListener { } catch (ConfigurationException ce1) { logger.log(Level.SEVERE, "Could not store configuration!", ce1); + } finally { + synchronized (configuration) { + storingConfiguration = false; + } } } @@ -1596,4 +1661,16 @@ public class Core implements IdentityListener { /* TODO */ } + // + // INTERFACE UpdateListener + // + + /** + * {@inheritDoc} + */ + @Override + public void updateFound(Version version, long releaseTime) { + coreListenerManager.fireUpdateFound(version, releaseTime); + } + }