/** The options. */
private final Options options = new Options();
+ /** The core listener manager. */
+ private final CoreListenerManager coreListenerManager = new CoreListenerManager(this);
+
/** The configuration. */
private final Configuration configuration;
/** The Sone downloader. */
private final SoneDownloader soneDownloader;
+ /** Whether the core has been stopped. */
+ private volatile boolean stopped;
+
/** The Sones’ statuses. */
/* synchronize access on itself. */
private final Map<Sone, SoneStatus> soneStatuses = new HashMap<Sone, SoneStatus>();
}
//
+ // LISTENER MANAGEMENT
+ //
+
+ /**
+ * Adds a new core listener.
+ *
+ * @param coreListener
+ * The listener to add
+ */
+ public void addCoreListener(CoreListener coreListener) {
+ coreListenerManager.addListener(coreListener);
+ }
+
+ /**
+ * Removes a core listener.
+ *
+ * @param coreListener
+ * The listener to remove
+ */
+ public void removeCoreListener(CoreListener coreListener) {
+ coreListenerManager.removeListener(coreListener);
+ }
+
+ //
// ACCESSORS
//
}
/**
+ * Returns whether the “Sone rescue mode” is currently activated.
+ *
+ * @return {@code true} if the “Sone rescue mode” is currently activated,
+ * {@code false} if it is not
+ */
+ public boolean isSoneRescueMode() {
+ return options.getBooleanOption("SoneRescueMode").get();
+ }
+
+ /**
* Returns the identity manager used by the core.
*
* @return The identity manager
synchronized (newSones) {
boolean isNew = !knownSones.contains(sone.getId()) && newSones.remove(sone.getId());
knownSones.add(sone.getId());
+ if (isNew) {
+ coreListenerManager.fireMarkSoneKnown(sone);
+ }
return isNew;
}
}
synchronized (newPosts) {
boolean isNew = !knownPosts.contains(postId) && newPosts.remove(postId);
knownPosts.add(postId);
+ if (isNew) {
+ coreListenerManager.fireMarkPostKnown(getPost(postId));
+ }
return isNew;
}
}
synchronized (newReplies) {
boolean isNew = !knownReplies.contains(replyId) && newReplies.remove(replyId);
knownReplies.add(replyId);
+ if (isNew) {
+ coreListenerManager.fireMarkReplyKnown(getReply(replyId));
+ }
return isNew;
}
}
sone.setClient(new Client("Sone", SonePlugin.VERSION.toString()));
/* TODO - load posts ’n stuff */
localSones.put(ownIdentity.getId(), sone);
- SoneInserter soneInserter = new SoneInserter(this, freenetInterface, sone);
+ final SoneInserter soneInserter = new SoneInserter(this, freenetInterface, sone);
soneInserters.put(sone, soneInserter);
setSoneStatus(sone, SoneStatus.idle);
loadSone(sone);
- soneInserter.start();
+ if (!isSoneRescueMode()) {
+ soneInserter.start();
+ }
new Thread(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
public void run() {
- soneDownloader.fetchSone(sone);
+ if (!isSoneRescueMode()) {
+ soneDownloader.fetchSone(sone);
+ return;
+ }
+ logger.log(Level.INFO, "Trying to restore Sone from Freenet…");
+ long edition = sone.getLatestEdition();
+ while (!stopped && (edition >= 0) && isSoneRescueMode()) {
+ logger.log(Level.FINE, "Downloading edition " + edition + "…");
+ soneDownloader.fetchSone(sone, sone.getRequestUri().setKeyType("SSK").setDocName("Sone-" + edition));
+ --edition;
+ }
+ logger.log(Level.INFO, "Finished restoring Sone from Freenet, starting Inserter…");
+ soneInserter.start();
}
}, "Sone Downloader").start();
sone.setLatestEdition(Numbers.safeParseLong(identity.getProperty("Sone.LatestEdition"), (long) 0));
if (newSone) {
synchronized (newSones) {
- newSones.add(sone.getId());
+ newSone = !knownSones.contains(sone.getId());
+ if (newSone) {
+ newSones.add(sone.getId());
+ }
+ }
+ if (newSone) {
+ coreListenerManager.fireNewSoneFound(sone);
}
}
remoteSones.put(identity.getId(), sone);
*/
public void updateSone(Sone sone) {
if (hasSone(sone.getId())) {
+ boolean soneRescueMode = isLocalSone(sone) && isSoneRescueMode();
Sone storedSone = getSone(sone.getId());
- if (!(sone.getTime() > storedSone.getTime())) {
+ if (!soneRescueMode && !(sone.getTime() > storedSone.getTime())) {
logger.log(Level.FINE, "Downloaded Sone %s is not newer than stored Sone %s.", new Object[] { sone, storedSone });
return;
}
synchronized (posts) {
- for (Post post : storedSone.getPosts()) {
- posts.remove(post.getId());
+ if (!soneRescueMode) {
+ for (Post post : storedSone.getPosts()) {
+ posts.remove(post.getId());
+ }
}
synchronized (newPosts) {
for (Post post : sone.getPosts()) {
- if (!storedSone.getPosts().contains(post) && !knownSones.contains(post.getId())) {
+ if (!storedSone.getPosts().contains(post) && !knownPosts.contains(post.getId())) {
newPosts.add(post.getId());
+ coreListenerManager.fireNewPostFound(post);
}
posts.put(post.getId(), post);
}
}
}
synchronized (replies) {
- for (Reply reply : storedSone.getReplies()) {
- replies.remove(reply.getId());
+ if (!soneRescueMode) {
+ for (Reply reply : storedSone.getReplies()) {
+ replies.remove(reply.getId());
+ }
}
synchronized (newReplies) {
for (Reply reply : sone.getReplies()) {
- if (!storedSone.getReplies().contains(reply) && !knownSones.contains(reply.getId())) {
+ if (!storedSone.getReplies().contains(reply) && !knownReplies.contains(reply.getId())) {
newReplies.add(reply.getId());
+ coreListenerManager.fireNewReplyFound(reply);
}
replies.put(reply.getId(), reply);
}
}
synchronized (storedSone) {
storedSone.setTime(sone.getTime());
+ storedSone.setClient(sone.getClient());
storedSone.setProfile(sone.getProfile());
- storedSone.setPosts(sone.getPosts());
- storedSone.setReplies(sone.getReplies());
- storedSone.setLikePostIds(sone.getLikedPostIds());
- storedSone.setLikeReplyIds(sone.getLikedReplyIds());
+ if (soneRescueMode) {
+ for (Post post : sone.getPosts()) {
+ storedSone.addPost(post);
+ }
+ for (Reply reply : sone.getReplies()) {
+ storedSone.addReply(reply);
+ }
+ for (String likedPostId : sone.getLikedPostIds()) {
+ storedSone.addLikedPostId(likedPostId);
+ }
+ for (String likedReplyId : sone.getLikedReplyIds()) {
+ storedSone.addLikedReplyId(likedReplyId);
+ }
+ } else {
+ storedSone.setPosts(sone.getPosts());
+ storedSone.setReplies(sone.getReplies());
+ storedSone.setLikePostIds(sone.getLikedPostIds());
+ storedSone.setLikeReplyIds(sone.getLikedReplyIds());
+ }
storedSone.setLatestEdition(sone.getRequestUri().getEdition());
}
}
}
}
saveConfiguration();
+ stopped = true;
}
//
}
}));
+ options.addBooleanOption("SoneRescueMode", new DefaultOption<Boolean>(false));
options.addBooleanOption("ClearOnNextRestart", new DefaultOption<Boolean>(false));
options.addBooleanOption("ReallyClearOnNextRestart", new DefaultOption<Boolean>(false));
}
options.getIntegerOption("InsertionDelay").set(configuration.getIntValue("Option/InsertionDelay").getValue(null));
+ options.getBooleanOption("SoneRescueMode").set(configuration.getBooleanValue("Option/SoneRescueMode").getValue(null));
/* load known Sones. */
int soneCounter = 0;
/* 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());