*/
public enum SoneStatus {
+ /** The Sone is unknown, i.e. not yet downloaded. */
+ unknown,
+
/** The Sone is idle, i.e. not being downloaded or inserted. */
idle,
private final Map<Sone, SoneInserter> soneInserters = new HashMap<Sone, SoneInserter>();
/** The Sones’ statuses. */
- private final Map<Sone, SoneStatus> soneStatuses = new HashMap<Sone, SoneStatus>();
+ private final Map<Sone, SoneStatus> soneStatuses = Collections.synchronizedMap(new HashMap<Sone, SoneStatus>());
/* various caches follow here. */
* Creates a new core.
*/
public Core() {
- super("Sone Core");
+ super("Sone Core", false);
}
//
if (!soneCache.containsKey(soneId)) {
Sone sone = new Sone(soneId);
soneCache.put(soneId, sone);
- setSoneStatus(sone, SoneStatus.idle);
+ setSoneStatus(sone, SoneStatus.unknown);
}
return soneCache.get(soneId);
}
*/
public void addLocalSone(Sone sone) {
if (localSones.add(sone)) {
+ setSoneStatus(sone, SoneStatus.idle);
SoneInserter soneInserter = new SoneInserter(this, freenetInterface, sone);
soneInserter.start();
soneInserters.put(sone, soneInserter);
addSone(parsedSone);
}
} finally {
- setSoneStatus(sone, SoneStatus.idle);
+ setSoneStatus(sone, (sone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle);
}
}
}, "Sone Downloader").start();
return replies;
}
+ /**
+ * Gets all Sones that like the given post.
+ *
+ * @param post
+ * The post to check for
+ * @return All Sones that like the post
+ */
+ public Set<Sone> getLikes(final Post post) {
+ return Filters.filteredSet(getSones(), new Filter<Sone>() {
+
+ @Override
+ public boolean filterObject(Sone sone) {
+ return sone.isLikedPostId(post.getId());
+ }
+ });
+ }
+
+ /**
+ * Gets all Sones that like the given reply.
+ *
+ * @param reply
+ * The reply to check for
+ * @return All Sones that like the reply
+ */
+ public Set<Sone> getLikes(final Reply reply) {
+ return Filters.filteredSet(getSones(), new Filter<Sone>() {
+
+ @Override
+ public boolean filterObject(Sone sone) {
+ return sone.isLikedReplyId(reply.getId());
+ }
+ });
+ }
+
+ /**
+ * Deletes the given reply. It is removed from its Sone and from the reply
+ * cache.
+ *
+ * @param reply
+ * The reply to remove
+ */
+ public void deleteReply(Reply reply) {
+ reply.getSone().removeReply(reply);
+ replyCache.remove(reply.getId());
+ }
+
//
// SERVICE METHODS
//
sone.addBlockedSoneId(blockedSoneId);
}
+ /* load liked post IDs. */
+ int likedPostIdCounter = 0;
+ while (true) {
+ String likedPostIdPrefix = sonePrefix + "/LikedPostId." + likedPostIdCounter++;
+ String likedPostId = configuration.getStringValue(likedPostIdPrefix + "/ID").getValue(null);
+ if (likedPostId == null) {
+ break;
+ }
+ sone.addLikedPostId(likedPostId);
+ }
+
+ /* load liked reply IDs. */
+ int likedReplyIdCounter = 0;
+ while (true) {
+ String likedReplyIdPrefix = sonePrefix + "/LikedReplyId." + likedReplyIdCounter++;
+ String likedReplyId = configuration.getStringValue(likedReplyIdPrefix + "/ID").getValue(null);
+ if (likedReplyId == null) {
+ break;
+ }
+ sone.addLikedReplyId(likedReplyId);
+ }
+
sone.setModificationCounter(modificationCounter);
addLocalSone(sone);
} catch (MalformedURLException mue1) {
}
configuration.getStringValue(sonePrefix + "/BlockedSone." + blockedSoneCounter + "/ID").setValue(null);
+ /* write all liked posts. */
+ int likedPostIdCounter = 0;
+ for (String soneLikedPostId : sone.getLikedPostIds()) {
+ String likedPostIdPrefix = sonePrefix + "/LikedPostId." + likedPostIdCounter++;
+ configuration.getStringValue(likedPostIdPrefix + "/ID").setValue(soneLikedPostId);
+ }
+ configuration.getStringValue(sonePrefix + "/LikedPostId." + likedPostIdCounter + "/ID").setValue(null);
+
+ /* write all liked replies. */
+ int likedReplyIdCounter = 0;
+ for (String soneLikedReplyId : sone.getLikedReplyIds()) {
+ String likedReplyIdPrefix = sonePrefix + "/LikedReplyId." + likedReplyIdCounter++;
+ configuration.getStringValue(likedReplyIdPrefix + "/ID").setValue(soneLikedReplyId);
+ }
+ configuration.getStringValue(sonePrefix + "/LikedReplyId." + likedReplyIdCounter + "/ID").setValue(null);
+
}
/* write null ID as terminator. */
configuration.getStringValue("Sone/Sone." + soneId + "/ID").setValue(null);