X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=e1dcb9c3c74d17dd6dd4f5b1efdcc19eb5f221bd;hb=4316b669b28d294dd2b4b9a34e45f080c77037fe;hp=225e3e6181b30d772ff1811bc1bf6e26da617ec7;hpb=cbeea5bd399143abd649bd295729137a886de3b6;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 225e3e6..e1dcb9c 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -84,7 +84,7 @@ public class Core implements IdentityListener { private final CoreListenerManager coreListenerManager = new CoreListenerManager(this); /** The configuration. */ - private final Configuration configuration; + private Configuration configuration; /** The identity manager. */ private final IdentityManager identityManager; @@ -190,6 +190,18 @@ public class Core implements IdentityListener { // /** + * Sets the configuration to use. This will automatically save the current + * configuration to the given configuration. + * + * @param configuration + * The new configuration to use + */ + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + saveConfiguration(); + } + + /** * Returns the options used by the core. * * @return The options of the core @@ -529,27 +541,64 @@ public class Core implements IdentityListener { * otherwise */ public boolean isNewPost(String postId) { + return isNewPost(postId, true); + } + + /** + * Returns whether the given post ID is new. If {@code markAsKnown} is + * {@code true} then after this method returns the post ID is marked a known + * post ID. + * + * @param postId + * The post ID + * @param markAsKnown + * {@code true} to mark the post ID as known, {@code false} to + * not to mark it as known + * @return {@code true} if the post is considered to be new, {@code false} + * otherwise + */ + public boolean isNewPost(String postId, boolean markAsKnown) { synchronized (newPosts) { - boolean isNew = !knownPosts.contains(postId) && newPosts.remove(postId); - knownPosts.add(postId); - if (isNew) { - coreListenerManager.fireMarkPostKnown(getPost(postId)); + boolean isNew = !knownPosts.contains(postId) && newPosts.contains(postId); + if (markAsKnown) { + newPosts.remove(postId); + knownPosts.add(postId); + if (isNew) { + coreListenerManager.fireMarkPostKnown(getPost(postId)); + } } return isNew; } } /** - * Returns the reply with the given ID. + * Returns the reply with the given ID. If there is no reply with the given + * ID yet, a new one is created. * * @param replyId * The ID of the reply to get - * @return The reply, or {@code null} if there is no such reply + * @return The reply */ public Reply getReply(String replyId) { + return getReply(replyId, true); + } + + /** + * Returns the reply with the given ID. If there is no reply with the given + * ID yet, a new one is created, unless {@code create} is false in which + * case {@code null} is returned. + * + * @param replyId + * The ID of the reply to get + * @param create + * {@code true} to always return a {@link Reply}, {@code false} + * to return {@code null} if no reply can be found + * @return The reply, or {@code null} if there is no such reply + */ + public Reply getReply(String replyId, boolean create) { synchronized (replies) { Reply reply = replies.get(replyId); - if (reply == null) { + if (create && (reply == null)) { reply = new Reply(replyId); replies.put(replyId, reply); } @@ -587,11 +636,29 @@ public class Core implements IdentityListener { * otherwise */ public boolean isNewReply(String replyId) { + return isNewReply(replyId, true); + } + + /** + * Returns whether the reply with the given ID is new. + * + * @param replyId + * The ID of the reply to check + * @param markAsKnown + * {@code true} to mark the reply as known, {@code false} to not + * to mark it as known + * @return {@code true} if the reply is considered to be new, {@code false} + * otherwise + */ + public boolean isNewReply(String replyId, boolean markAsKnown) { synchronized (newReplies) { - boolean isNew = !knownReplies.contains(replyId) && newReplies.remove(replyId); - knownReplies.add(replyId); - if (isNew) { - coreListenerManager.fireMarkReplyKnown(getReply(replyId)); + boolean isNew = !knownReplies.contains(replyId) && newReplies.contains(replyId); + if (markAsKnown) { + newReplies.remove(replyId); + knownReplies.add(replyId); + if (isNew) { + coreListenerManager.fireMarkReplyKnown(getReply(replyId)); + } } return isNew; } @@ -949,13 +1016,18 @@ public class Core implements IdentityListener { if (postId == null) { break; } + String postRecipientId = configuration.getStringValue(postPrefix + "/Recipient").getValue(null); long postTime = configuration.getLongValue(postPrefix + "/Time").getValue((long) 0); String postText = configuration.getStringValue(postPrefix + "/Text").getValue(null); if ((postTime == 0) || (postText == null)) { logger.log(Level.WARNING, "Invalid post found, aborting load!"); return; } - posts.add(getPost(postId).setSone(sone).setTime(postTime).setText(postText)); + Post post = getPost(postId).setSone(sone).setTime(postTime).setText(postText); + if ((postRecipientId != null) && (postRecipientId.length() == 43)) { + post.setRecipient(getSone(postRecipientId)); + } + posts.add(post); } /* load replies. */ @@ -1073,6 +1145,9 @@ public class Core implements IdentityListener { 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.getLongValue(postPrefix + "/Time").setValue(post.getTime()); configuration.getStringValue(postPrefix + "/Text").setValue(post.getText()); } @@ -1123,9 +1198,10 @@ public class Core implements IdentityListener { * The Sone that creates the post * @param text * The text of the post + * @return The created post */ - public void createPost(Sone sone, String text) { - createPost(sone, System.currentTimeMillis(), text); + public Post createPost(Sone sone, String text) { + return createPost(sone, System.currentTimeMillis(), text); } /** @@ -1137,11 +1213,12 @@ public class Core implements IdentityListener { * The time of the post * @param text * The text of the post + * @return The created post */ - public void createPost(Sone sone, long time, String text) { + public Post createPost(Sone sone, long time, String text) { if (!isLocalSone(sone)) { logger.log(Level.FINE, "Tried to create post for non-local Sone: %s", sone); - return; + return null; } Post post = new Post(sone, time, text); synchronized (posts) { @@ -1152,6 +1229,7 @@ public class Core implements IdentityListener { } sone.addPost(post); saveSone(sone); + return post; } /** @@ -1173,6 +1251,22 @@ public class Core implements IdentityListener { } /** + * Marks the given post as known, if it is currently a new post (according + * to {@link #isNewPost(String)}). + * + * @param post + * The post to mark as known + */ + public void markPostKnown(Post post) { + synchronized (newPosts) { + if (newPosts.remove(post.getId())) { + knownPosts.add(post.getId()); + coreListenerManager.fireMarkPostKnown(post); + } + } + } + + /** * Creates a new reply. * * @param sone @@ -1237,6 +1331,22 @@ public class Core implements IdentityListener { } /** + * Marks the given reply as known, if it is currently a new reply (according + * to {@link #isNewReply(String)}). + * + * @param reply + * The reply to mark as known + */ + public void markReplyKnown(Reply reply) { + synchronized (newReplies) { + if (newReplies.remove(reply.getId())) { + knownReplies.add(reply.getId()); + coreListenerManager.fireMarkReplyKnown(reply); + } + } + } + + /** * Starts the core. */ public void start() { @@ -1256,6 +1366,52 @@ public class Core implements IdentityListener { stopped = true; } + /** + * Saves the current options. + */ + public void saveConfiguration() { + /* store the options first. */ + try { + 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()); + configuration.getBooleanValue("Option/ReallyClearOnNextRestart").setValue(options.getBooleanOption("ReallyClearOnNextRestart").getReal()); + + /* save known Sones. */ + int soneCounter = 0; + synchronized (newSones) { + for (String knownSoneId : knownSones) { + configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSoneId); + } + configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); + } + + /* save known posts. */ + int postCounter = 0; + synchronized (newPosts) { + for (String knownPostId : knownPosts) { + configuration.getStringValue("KnownPosts/" + postCounter++ + "/ID").setValue(knownPostId); + } + configuration.getStringValue("KnownPosts/" + postCounter + "/ID").setValue(null); + } + + /* save known replies. */ + int replyCounter = 0; + synchronized (newReplies) { + for (String knownReplyId : knownReplies) { + configuration.getStringValue("KnownReplies/" + replyCounter++ + "/ID").setValue(knownReplyId); + } + configuration.getStringValue("KnownReplies/" + replyCounter + "/ID").setValue(null); + } + + /* now save it. */ + configuration.save(); + + } catch (ConfigurationException ce1) { + logger.log(Level.SEVERE, "Could not store configuration!", ce1); + } + } + // // PRIVATE METHODS // @@ -1331,49 +1487,6 @@ public class Core implements IdentityListener { } /** - * Saves the current options. - */ - private void saveConfiguration() { - /* store the options first. */ - try { - 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()); - configuration.getBooleanValue("Option/ReallyClearOnNextRestart").setValue(options.getBooleanOption("ReallyClearOnNextRestart").getReal()); - - /* save known Sones. */ - int soneCounter = 0; - synchronized (newSones) { - for (String knownSoneId : knownSones) { - configuration.getStringValue("KnownSone/" + soneCounter++ + "/ID").setValue(knownSoneId); - } - configuration.getStringValue("KnownSone/" + soneCounter + "/ID").setValue(null); - } - - /* save known posts. */ - int postCounter = 0; - synchronized (newPosts) { - for (String knownPostId : knownPosts) { - configuration.getStringValue("KnownPosts/" + postCounter++ + "/ID").setValue(knownPostId); - } - configuration.getStringValue("KnownPosts/" + postCounter + "/ID").setValue(null); - } - - /* save known replies. */ - int replyCounter = 0; - synchronized (newReplies) { - for (String knownReplyId : knownReplies) { - configuration.getStringValue("KnownReplies/" + replyCounter++ + "/ID").setValue(knownReplyId); - } - configuration.getStringValue("KnownReplies/" + replyCounter + "/ID").setValue(null); - } - - } catch (ConfigurationException ce1) { - logger.log(Level.SEVERE, "Could not store configuration!", ce1); - } - } - - /** * Generate a Sone URI from the given URI and latest edition. * * @param uriString