import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.number.Numbers;
import net.pterodactylus.util.service.AbstractService;
+import net.pterodactylus.util.thread.NamedThreadFactory;
import net.pterodactylus.util.thread.Ticker;
import net.pterodactylus.util.validation.EqualityValidator;
import net.pterodactylus.util.validation.IntegerRangeValidator;
/** The logger. */
private static final Logger logger = Logging.getLogger(Core.class);
+ /** The start time. */
+ private final long startupTime = System.currentTimeMillis();
+
/** The options. */
private final Options options = new Options();
private final ImageInserter imageInserter;
/** Sone downloader thread-pool. */
- private final ExecutorService soneDownloaders = Executors.newFixedThreadPool(10);
+ private final ExecutorService soneDownloaders = Executors.newFixedThreadPool(10, new NamedThreadFactory("Sone Downloader %2$d"));
/** The update checker. */
private final UpdateChecker updateChecker;
//
/**
+ * Returns the time Sone was started.
+ *
+ * @return The startup time (in milliseconds since Jan 1, 1970 UTC)
+ */
+ public long getStartupTime() {
+ return startupTime;
+ }
+
+ /**
* Sets the configuration to use. This will automatically save the current
* configuration to the given configuration.
*
/**
* 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
- */
- public PostReply 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.
*
* to return {@code null} if no reply can be found
* @return The reply, or {@code null} if there is no such reply
*/
- public PostReply getReply(String replyId, boolean create) {
+ public PostReply getPostReply(String replyId, boolean create) {
synchronized (replies) {
PostReply reply = replies.get(replyId);
if (create && (reply == null)) {
if (!storedPosts.contains(post)) {
if (post.getTime() < getSoneFollowingTime(sone)) {
knownPosts.add(post.getId());
+ post.setKnown(true);
} else if (!knownPosts.contains(post.getId())) {
- sone.setKnown(false);
coreListenerManager.fireNewPostFound(post);
}
}
if (!storedReplies.contains(reply)) {
if (reply.getTime() < getSoneFollowingTime(sone)) {
knownReplies.add(reply.getId());
+ reply.setKnown(true);
} else if (!knownReplies.contains(reply.getId())) {
- reply.setKnown(false);
coreListenerManager.fireNewReplyFound(reply);
}
}
logger.log(Level.WARNING, "Invalid reply found, aborting load!");
return;
}
- replies.add(getReply(replyId).setSone(sone).setPost(getPost(postId)).setTime(replyTime).setText(replyText));
+ replies.add(getPostReply(replyId, true).setSone(sone).setPost(getPost(postId)).setTime(replyTime).setText(replyText));
}
/* load post likes. */
* @return The created post
*/
public Post createPost(Sone sone, Sone recipient, long time, String text) {
+ Validation.begin().isNotNull("Text", text).check().isGreater("Text Length", text.length(), 0).check();
if (!isLocalSone(sone)) {
logger.log(Level.FINE, String.format("Tried to create post for non-local Sone: %s", sone));
return null;
* @return The created reply
*/
public PostReply createReply(Sone sone, Post post, long time, String text) {
+ Validation.begin().isNotNull("Text", text).check().isGreater("Text Length", text.trim().length(), 0).check();
if (!isLocalSone(sone)) {
logger.log(Level.FINE, String.format("Tried to create reply for non-local Sone: %s", sone));
return null;
FreenetURI uri = new FreenetURI(uriString).setDocName("Sone").setMetaString(new String[0]);
return uri;
} catch (MalformedURLException mue1) {
- logger.log(Level.WARNING, String.format("Could not create Sone URI from URI: %s", uriString, mue1));
+ logger.log(Level.WARNING, String.format("Could not create Sone URI from URI: %s", uriString), mue1);
return null;
}
}
*/
@Override
public void identityUpdated(OwnIdentity ownIdentity, final Identity identity) {
- new Thread(new Runnable() {
+ soneDownloaders.execute(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
soneDownloader.addSone(sone);
soneDownloader.fetchSone(sone);
}
- }).start();
+ });
}
/**