X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=70d9ea2c6dc01a086f3e5e0b32b342cf7a6ca68e;hp=5ce01fe3df96b3f766c572746e17e6e4009cfa2c;hb=93fdf9e218d808f65f618abbddce183191d8c15b;hpb=d678616d36fce087fe89cdbc27f0169e7a612790
diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java
index 5ce01fe..70d9ea2 100644
--- a/src/main/java/net/pterodactylus/sone/core/Core.java
+++ b/src/main/java/net/pterodactylus/sone/core/Core.java
@@ -59,6 +59,8 @@ import net.pterodactylus.sone.data.Post;
import net.pterodactylus.sone.data.PostBuilder;
import net.pterodactylus.sone.data.PostBuilderFactory;
import net.pterodactylus.sone.data.PostReply;
+import net.pterodactylus.sone.data.PostReplyBuilder;
+import net.pterodactylus.sone.data.PostReplyBuilderFactory;
import net.pterodactylus.sone.data.Profile;
import net.pterodactylus.sone.data.Profile.Field;
import net.pterodactylus.sone.data.Reply;
@@ -66,7 +68,6 @@ import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.data.Sone.ShowCustomAvatars;
import net.pterodactylus.sone.data.Sone.SoneStatus;
import net.pterodactylus.sone.data.TemporaryImage;
-import net.pterodactylus.sone.data.impl.PostReplyImpl;
import net.pterodactylus.sone.fcp.FcpInterface;
import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired;
import net.pterodactylus.sone.freenet.wot.Identity;
@@ -86,9 +87,13 @@ import net.pterodactylus.util.number.Numbers;
import net.pterodactylus.util.service.AbstractService;
import net.pterodactylus.util.thread.NamedThreadFactory;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Ordering;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
@@ -100,7 +105,7 @@ import freenet.keys.FreenetURI;
*
* @author David âBombeâ Roden
*/
-public class Core extends AbstractService implements SoneProvider, PostProvider {
+public class Core extends AbstractService implements SoneProvider, PostProvider, PostReplyProvider {
/** The logger. */
private static final Logger logger = Logging.getLogger(Core.class);
@@ -178,6 +183,9 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
/** All known posts. */
private final Set knownPosts = new HashSet();
+ /** The post reply builder factory. */
+ private final PostReplyBuilderFactory postReplyBuilderFactory;
+
/** All replies. */
private final Map replies = new HashMap();
@@ -221,9 +229,11 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
* The event bus
* @param postBuilderFactory
* The post builder
+ * @param postReplyBuilderFactory
+ * The post reply builder factory
*/
@Inject
- public Core(Configuration configuration, FreenetInterface freenetInterface, IdentityManager identityManager, WebOfTrustUpdater webOfTrustUpdater, EventBus eventBus, PostBuilderFactory postBuilderFactory) {
+ public Core(Configuration configuration, FreenetInterface freenetInterface, IdentityManager identityManager, WebOfTrustUpdater webOfTrustUpdater, EventBus eventBus, PostBuilderFactory postBuilderFactory, PostReplyBuilderFactory postReplyBuilderFactory) {
super("Sone Core");
this.configuration = configuration;
this.freenetInterface = freenetInterface;
@@ -234,6 +244,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
this.webOfTrustUpdater = webOfTrustUpdater;
this.eventBus = eventBus;
this.postBuilderFactory = postBuilderFactory;
+ this.postReplyBuilderFactory = postReplyBuilderFactory;
}
//
@@ -558,37 +569,42 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
}
/**
- * Returns the reply with the given ID.
+ * Returns a post reply builder.
*
- * @param replyId
- * The ID of the reply to get
- * @return The reply, or {@code null} if there is no such reply
+ * @return A new post reply builder
+ */
+ public PostReplyBuilder postReplyBuilder() {
+ return postReplyBuilderFactory.newPostReplyBuilder();
+ }
+
+ /**
+ * {@inheritDoc}
*/
- public PostReply getPostReply(String replyId) {
+ @Override
+ public Optional getPostReply(String replyId) {
synchronized (replies) {
- return replies.get(replyId);
+ return Optional.fromNullable(replies.get(replyId));
}
}
/**
- * Returns all replies for the given post, order ascending by time.
- *
- * @param post
- * The post to get all replies for
- * @return All replies for the given post
+ * {@inheritDoc}
*/
- public List getReplies(Post post) {
- Set sones = getSones();
- List replies = new ArrayList();
- for (Sone sone : sones) {
- for (PostReply reply : sone.getReplies()) {
- if (reply.getPost().equals(post)) {
- replies.add(reply);
- }
+ @Override
+ public List getReplies(final Post post) {
+ return Ordering.from(Reply.TIME_COMPARATOR).sortedCopy(FluentIterable.from(getSones()).transformAndConcat(new Function>() {
+
+ @Override
+ public Iterable apply(Sone sone) {
+ return sone.getReplies();
}
- }
- Collections.sort(replies, Reply.TIME_COMPARATOR);
- return replies;
+ }).filter(new Predicate() {
+
+ @Override
+ public boolean apply(PostReply reply) {
+ return post.equals(reply.getPost());
+ }
+ }));
}
/**
@@ -861,7 +877,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
synchronized (sones) {
final Sone sone = getRemoteSone(identity.getId(), true).setIdentity(identity);
boolean newSone = sone.getRequestUri() == null;
- sone.setRequestUri(getSoneUri(identity.getRequestUri()));
+ sone.setRequestUri(SoneUri.create(identity.getRequestUri()));
sone.setLatestEdition(Numbers.safeParseLong(identity.getProperty("Sone.LatestEdition"), (long) 0));
if (newSone) {
synchronized (knownSones) {
@@ -1297,7 +1313,7 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
logger.log(Level.WARNING, "Invalid post found, aborting load!");
return;
}
- PostBuilder postBuilder = postBuilderFactory.newPostBuilder().withId(postId).from(sone).withTime(postTime).withText(postText);
+ PostBuilder postBuilder = postBuilder().withId(postId).from(sone).withTime(postTime).withText(postText);
if ((postRecipientId != null) && (postRecipientId.length() == 43)) {
postBuilder.to(getSone(postRecipientId));
}
@@ -1319,7 +1335,9 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
logger.log(Level.WARNING, "Invalid reply found, aborting load!");
return;
}
- replies.add(getPostReply(replyId, true).setSone(sone).setPost(getPost(postId)).setTime(replyTime).setText(replyText));
+ PostReplyBuilder postReplyBuilder = postReplyBuilderFactory.newPostReplyBuilder();
+ postReplyBuilder.withId(replyId).from(sone).to(postId).withTime(replyTime).withText(replyText);
+ replies.add(postReplyBuilder.build());
}
/* load post likes. */
@@ -1644,30 +1662,15 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
* @return The created reply
*/
public PostReply createReply(Sone sone, Post post, String text) {
- return createReply(sone, post, System.currentTimeMillis(), text);
- }
-
- /**
- * Creates a new reply.
- *
- * @param sone
- * The Sone that creates the reply
- * @param post
- * The post that this reply refers to
- * @param time
- * The time of the reply
- * @param text
- * The text of the reply
- * @return The created reply
- */
- public PostReply createReply(Sone sone, Post post, long time, String text) {
checkNotNull(text, "text must not be null");
checkArgument(text.trim().length() > 0, "text must not be empty");
if (!sone.isLocal()) {
logger.log(Level.FINE, String.format("Tried to create reply for non-local Sone: %s", sone));
return null;
}
- final PostReply reply = new PostReplyImpl(sone, post, System.currentTimeMillis(), text.trim());
+ PostReplyBuilder postReplyBuilder = postReplyBuilderFactory.newPostReplyBuilder();
+ postReplyBuilder.randomId().from(sone).to(post.getId()).currentTime().withText(text.trim());
+ final PostReply reply = postReplyBuilder.build();
synchronized (replies) {
replies.put(reply.getId(), reply);
}
@@ -2307,23 +2310,6 @@ public class Core extends AbstractService implements SoneProvider, PostProvider
}
/**
- * Generate a Sone URI from the given URI and latest edition.
- *
- * @param uriString
- * The URI to derive the Sone URI from
- * @return The derived URI
- */
- private static FreenetURI getSoneUri(String uriString) {
- try {
- 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);
- return null;
- }
- }
-
- /**
* Notifies the core that a new {@link OwnIdentity} was added.
*
* @param ownIdentityAddedEvent