import static com.google.common.primitives.Longs.tryParse;
import static java.lang.String.format;
import static java.util.logging.Level.WARNING;
+import static java.util.logging.Logger.getLogger;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import net.pterodactylus.sone.database.PostReplyProvider;
import net.pterodactylus.sone.database.SoneBuilder;
import net.pterodactylus.sone.database.SoneProvider;
-import net.pterodactylus.sone.fcp.FcpInterface;
import net.pterodactylus.sone.freenet.wot.Identity;
import net.pterodactylus.sone.freenet.wot.IdentityManager;
import net.pterodactylus.sone.freenet.wot.OwnIdentity;
import net.pterodactylus.sone.main.SonePlugin;
import net.pterodactylus.util.config.Configuration;
import net.pterodactylus.util.config.ConfigurationException;
-import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.service.AbstractService;
import net.pterodactylus.util.thread.NamedThreadFactory;
public class Core extends AbstractService implements SoneProvider, PostProvider, PostReplyProvider {
/** The logger. */
- private static final Logger logger = Logging.getLogger(Core.class);
+ private static final Logger logger = getLogger("Sone.Core");
/** The start time. */
private final long startupTime = System.currentTimeMillis();
logger.log(Level.FINE, String.format("Downloaded Sone %s is not newer than stored Sone %s.", sone, storedSone));
return;
}
- /* find removed posts. */
- SoneChangeDetector soneChangeDetector = new SoneChangeDetector(storedSone.get());
- soneChangeDetector.onNewPosts(new PostProcessor() {
- @Override
- public void processPost(Post post) {
- if (post.getTime() < getSoneFollowingTime(sone)) {
- post.setKnown(true);
- } else if (!post.isKnown()) {
- eventBus.post(new NewPostFoundEvent(post));
- }
- }
- });
- soneChangeDetector.onRemovedPosts(new PostProcessor() {
- @Override
- public void processPost(Post post) {
- eventBus.post(new PostRemovedEvent(post));
- }
- });
- soneChangeDetector.onNewPostReplies(new PostReplyProcessor() {
- @Override
- public void processPostReply(PostReply postReply) {
- if (postReply.getTime() < getSoneFollowingTime(sone)) {
- postReply.setKnown(true);
- } else if (!postReply.isKnown()) {
- eventBus.post(new NewPostReplyFoundEvent(postReply));
- }
- }
- });
- soneChangeDetector.onRemovedPostReplies(new PostReplyProcessor() {
- @Override
- public void processPostReply(PostReply postReply) {
- eventBus.post(new PostReplyRemovedEvent(postReply));
- }
- });
- soneChangeDetector.detectChanges(sone);
+ List<Object> events =
+ collectEventsForChangesInSone(storedSone.get(), sone);
database.storeSone(sone);
+ for (Object event : events) {
+ eventBus.post(event);
+ }
sone.setOptions(storedSone.get().getOptions());
sone.setKnown(storedSone.get().isKnown());
sone.setStatus((sone.getTime() == 0) ? SoneStatus.unknown : SoneStatus.idle);
}
}
+ private List<Object> collectEventsForChangesInSone(Sone oldSone,
+ final Sone newSone) {
+ final List<Object> events = new ArrayList<Object>();
+ SoneChangeDetector soneChangeDetector = new SoneChangeDetector(
+ oldSone);
+ soneChangeDetector.onNewPosts(new PostProcessor() {
+ @Override
+ public void processPost(Post post) {
+ if (post.getTime() < getSoneFollowingTime(newSone)) {
+ post.setKnown(true);
+ } else if (!post.isKnown()) {
+ events.add(new NewPostFoundEvent(post));
+ }
+ }
+ });
+ soneChangeDetector.onRemovedPosts(new PostProcessor() {
+ @Override
+ public void processPost(Post post) {
+ events.add(new PostRemovedEvent(post));
+ }
+ });
+ soneChangeDetector.onNewPostReplies(new PostReplyProcessor() {
+ @Override
+ public void processPostReply(PostReply postReply) {
+ if (postReply.getTime() < getSoneFollowingTime(newSone)) {
+ postReply.setKnown(true);
+ } else if (!postReply.isKnown()) {
+ events.add(new NewPostReplyFoundEvent(postReply));
+ }
+ }
+ });
+ soneChangeDetector.onRemovedPostReplies(new PostReplyProcessor() {
+ @Override
+ public void processPostReply(PostReply postReply) {
+ events.add(new PostReplyRemovedEvent(postReply));
+ }
+ });
+ soneChangeDetector.detectChanges(newSone);
+ return events;
+ }
+
/**
* Deletes the given Sone. This will remove the Sone from the
* {@link #getLocalSones() local Sones}, stop its {@link SoneInserter} and
logger.log(Level.WARNING, String.format("Tried to delete non-local Sone: %s", sone));
return;
}
- // FIXME – implement in database
-// sones.remove(sone.getId());
SoneInserter soneInserter = soneInserters.remove(sone);
soneInserter.stop();
+ database.removeSone(sone);
webOfTrustUpdater.removeContext((OwnIdentity) sone.getIdentity(), "Sone");
webOfTrustUpdater.removeProperty((OwnIdentity) sone.getIdentity(), "Sone.LatestEdition");
try {
* @return The created post
*/
public Post createPost(Sone sone, Optional<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, Optional<Sone> recipient, long time, String text) {
checkNotNull(text, "text must not be null");
checkArgument(text.trim().length() > 0, "text must not be empty");
if (!sone.isLocal()) {
return null;
}
PostBuilder postBuilder = database.newPostBuilder();
- postBuilder.from(sone.getId()).randomId().withTime(time).withText(text.trim());
+ postBuilder.from(sone.getId()).randomId().currentTime().withText(text.trim());
if (recipient.isPresent()) {
postBuilder.to(recipient.get().getId());
}
/* save known posts. */
database.save();
- /* save bookmarked posts. */
- int bookmarkedPostCounter = 0;
- for (Post bookmarkedPost : getBookmarkedPosts()) {
- configuration.getStringValue("Bookmarks/Post/" + bookmarkedPostCounter++ + "/ID").setValue(bookmarkedPost.getId());
- }
- configuration.getStringValue("Bookmarks/Post/" + bookmarkedPostCounter++ + "/ID").setValue(null);
-
/* now save it. */
configuration.save();
}
++soneCounter;
}
-
- /* load bookmarked posts. */
- int bookmarkedPostCounter = 0;
- while (true) {
- String bookmarkedPostId = configuration.getStringValue("Bookmarks/Post/" + bookmarkedPostCounter++ + "/ID").getValue(null);
- if (bookmarkedPostId == null) {
- break;
- }
- database.bookmarkPost(bookmarkedPostId);
- }
-
}
/**
/* TODO - we don’t have the Sone anymore. should this happen? */
return;
}
- database.removePosts(sone.get());
- for (Post post : sone.get().getPosts()) {
- eventBus.post(new PostRemovedEvent(post));
- }
- database.removePostReplies(sone.get());
- for (PostReply reply : sone.get().getReplies()) {
- eventBus.post(new PostReplyRemovedEvent(reply));
- }
-// TODO – implement in database
-// sones.remove(identity.getId());
+ database.removeSone(sone.get());
eventBus.post(new SoneRemovedEvent(sone.get()));
}