/** The configuration. */
private Configuration configuration;
+ /** Whether we’re currently saving the configuration. */
+ private boolean storingConfiguration = false;
+
/** The identity manager. */
private final IdentityManager identityManager;
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;
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;
*/
public void lockSone(Sone sone) {
synchronized (lockedSones) {
- lockedSones.add(sone);
+ if (lockedSones.add(sone)) {
+ coreListenerManager.fireSoneLocked(sone);
+ }
}
}
*/
public void unlockSone(Sone sone) {
synchronized (lockedSones) {
- lockedSones.remove(sone);
+ if (lockedSones.remove(sone)) {
+ coreListenerManager.fireSoneUnlocked(sone);
+ }
}
}
if (!soneRescueMode) {
for (Post post : storedSone.getPosts()) {
posts.remove(post.getId());
+ if (!sone.getPosts().contains(post)) {
+ coreListenerManager.firePostRemoved(post);
+ }
}
}
synchronized (newPosts) {
if (!soneRescueMode) {
for (Reply reply : storedSone.getReplies()) {
replies.remove(reply.getId());
+ if (!sone.getReplies().contains(reply)) {
+ coreListenerManager.fireReplyRemoved(reply);
+ }
}
}
synchronized (newReplies) {
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. */
* @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;
for (Post post : sone.getPosts()) {
String postPrefix = sonePrefix + "/Posts/" + postCounter++;
configuration.getStringValue(postPrefix + "/ID").setValue(post.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());
}
}
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);
* @return The created post
*/
public Post createPost(Sone sone, long time, String text) {
+ return createPost(sone, null, time, text);
+ }
+
+ /**
+ * Creates a new post.
+ *
+ * @param sone
+ * The Sone that creates the post
+ * @param recipient
+ * The recipient Sone, or {@code null} if this post does not have
+ * a recipient
+ * @param text
+ * The text of the post
+ * @return The created post
+ */
+ public Post createPost(Sone sone, Sone recipient, String text) {
+ return createPost(sone, recipient, System.currentTimeMillis(), text);
+ }
+
+ /**
+ * Creates a new post.
+ *
+ * @param sone
+ * The Sone that creates the post
+ * @param recipient
+ * The recipient Sone, or {@code null} if this post does not have
+ * a recipient
+ * @param time
+ * The time of the post
+ * @param text
+ * The text of the post
+ * @return The created post
+ */
+ public Post createPost(Sone sone, Sone recipient, long time, String text) {
if (!isLocalSone(sone)) {
logger.log(Level.FINE, "Tried to create post for non-local Sone: %s", sone);
return null;
}
Post post = new Post(sone, time, text);
+ if (recipient != null) {
+ post.setRecipient(recipient);
+ }
synchronized (posts) {
posts.put(post.getId(), post);
}
if (newPosts.remove(post.getId())) {
knownPosts.add(post.getId());
coreListenerManager.fireMarkPostKnown(post);
+ saveConfiguration();
}
}
}
if (newReplies.remove(reply.getId())) {
knownReplies.add(reply.getId());
coreListenerManager.fireMarkReplyKnown(reply);
+ saveConfiguration();
}
}
}
soneInserter.stop();
}
}
+ soneDownloader.stop();
saveConfiguration();
stopped = true;
}
* 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/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal());
} catch (ConfigurationException ce1) {
logger.log(Level.SEVERE, "Could not store configuration!", ce1);
+ } finally {
+ synchronized (configuration) {
+ storingConfiguration = false;
+ }
}
}