X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffcp%2FAbstractSoneCommand.java;h=f3e29232e4777762cf5d3e164de9429bb99a496c;hb=d0c0e1b356a9979067f751b4131840d08bf507f5;hp=a8d851446fa4d29e4a86e3dc298388a1d747b2f4;hpb=698fdb0cf7923e58d0fb5dc3695b2e1b811c0816;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java b/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java index a8d8514..f3e2923 100644 --- a/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java +++ b/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java @@ -18,15 +18,18 @@ package net.pterodactylus.sone.fcp; import java.util.Collection; +import java.util.List; import net.pterodactylus.sone.core.Core; import net.pterodactylus.sone.data.Post; +import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder; import net.pterodactylus.sone.freenet.fcp.AbstractCommand; import net.pterodactylus.sone.freenet.fcp.Command; import net.pterodactylus.sone.freenet.fcp.FcpException; import net.pterodactylus.sone.template.SoneAccessor; +import net.pterodactylus.util.filter.Filters; import freenet.node.FSParseException; import freenet.support.SimpleFieldSet; @@ -95,52 +98,167 @@ public abstract class AbstractSoneCommand extends AbstractCommand { } /** + * Returns a post whose ID is a parameter in the given simple field set. + * + * @param simpleFieldSet + * The simple field set containing the ID of the post + * @param parameterName + * The name under which the post ID is stored in the simple field + * set + * @return The post + * @throws FcpException + * if there is no post ID stored under the given parameter name, + * or if the post ID is invalid + */ + protected Post getPost(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + try { + String postId = simpleFieldSet.getString(parameterName); + Post post = core.getPost(postId, false); + if (post == null) { + throw new FcpException("Could not load post from “" + postId + "”."); + } + return post; + } catch (FSParseException fspe1) { + throw new FcpException("Could not post ID from “" + parameterName + "”.", fspe1); + } + } + + /** * Creates a simple field set from the given collection of Sones. * * @param sones * The Sones to encode + * @param prefix + * The prefix for the field names (may be empty but not + * {@code null}) * @return The simple field set containing the given Sones */ - protected SimpleFieldSet encodeSones(Collection sones) { + protected SimpleFieldSet encodeSones(Collection sones, String prefix) { SimpleFieldSetBuilder soneBuilder = new SimpleFieldSetBuilder(); int soneIndex = 0; - soneBuilder.put("Sones.Count", sones.size()); + soneBuilder.put(prefix + "Count", sones.size()); for (Sone sone : sones) { - String sonePrefix = "Sones." + soneIndex++; - soneBuilder.put(sonePrefix + ".ID", sone.getId()); - soneBuilder.put(sonePrefix + ".Name", sone.getName()); - soneBuilder.put(sonePrefix + ".NiceName", SoneAccessor.getNiceName(sone)); - soneBuilder.put(sonePrefix + ".Time", sone.getTime()); + String sonePrefix = prefix + soneIndex++ + "."; + soneBuilder.put(sonePrefix + "ID", sone.getId()); + soneBuilder.put(sonePrefix + "Name", sone.getName()); + soneBuilder.put(sonePrefix + "NiceName", SoneAccessor.getNiceName(sone)); + soneBuilder.put(sonePrefix + "Time", sone.getTime()); } return soneBuilder.get(); } /** + * Creates a simple field set from the given post. + * + * @param post + * The post to encode + * @param prefix + * The prefix for the field names (may be empty but not + * {@code null}) + * @param includeReplies + * {@code true} to include replies, {@code false} to not include + * replies + * @return The simple field set containing the post + */ + protected SimpleFieldSet encodePost(Post post, String prefix, boolean includeReplies) { + SimpleFieldSetBuilder postBuilder = new SimpleFieldSetBuilder(); + + postBuilder.put(prefix + "ID", post.getId()); + postBuilder.put(prefix + "Sone", post.getSone().getId()); + if (post.getRecipient() != null) { + postBuilder.put(prefix + "Recipient", post.getRecipient().getId()); + } + postBuilder.put(prefix + "Time", post.getTime()); + postBuilder.put(prefix + "Text", post.getText()); + postBuilder.put(encodeLikes(core.getLikes(post), prefix + "Likes.")); + + if (includeReplies) { + List replies = core.getReplies(post); + postBuilder.put(encodeReplies(replies, prefix)); + } + + return postBuilder.get(); + } + + /** * Creates a simple field set from the given collection of posts. * * @param posts * The posts to encode + * @param prefix + * The prefix for the field names (may be empty but not + * {@code null}) + * @param includeReplies + * {@code true} to include the replies, {@code false} to not + * include the replies * @return The simple field set containing the posts */ - public SimpleFieldSet encodePosts(Collection posts) { + protected SimpleFieldSet encodePosts(Collection posts, String prefix, boolean includeReplies) { SimpleFieldSetBuilder postBuilder = new SimpleFieldSetBuilder(); int postIndex = 0; - postBuilder.put("Posts.Count", posts.size()); + postBuilder.put(prefix + "Count", posts.size()); for (Post post : posts) { - String postPrefix = "Posts." + postIndex++; - postBuilder.put(postPrefix + ".ID", post.getId()); - postBuilder.put(postPrefix + ".Sone", post.getSone().getId()); - if (post.getRecipient() != null) { - postBuilder.put(postPrefix + ".Recipient", post.getRecipient().getId()); + String postPrefix = prefix + postIndex++; + postBuilder.put(encodePost(post, postPrefix + ".", includeReplies)); + if (includeReplies) { + postBuilder.put(encodeReplies(Filters.filteredList(core.getReplies(post), Reply.FUTURE_REPLIES_FILTER), postPrefix + ".")); } - postBuilder.put(postPrefix + ".Time", post.getTime()); - postBuilder.put(postPrefix + ".Text", post.getText()); } return postBuilder.get(); } + /** + * Creates a simple field set from the given collection of replies. + * + * @param replies + * The replies to encode + * @param prefix + * The prefix for the field names (may be empty, but not + * {@code null}) + * @return The simple field set containing the replies + */ + protected SimpleFieldSet encodeReplies(Collection replies, String prefix) { + SimpleFieldSetBuilder replyBuilder = new SimpleFieldSetBuilder(); + + int replyIndex = 0; + replyBuilder.put(prefix + "Replies.Count", replies.size()); + for (Reply reply : replies) { + String replyPrefix = prefix + "Replies." + replyIndex++ + "."; + replyBuilder.put(replyPrefix + "ID", reply.getId()); + replyBuilder.put(replyPrefix + "Sone", reply.getSone().getId()); + replyBuilder.put(replyPrefix + "Time", reply.getTime()); + replyBuilder.put(replyPrefix + "Text", reply.getText()); + } + + return replyBuilder.get(); + } + + /** + * Creates a simple field set from the given collection of Sones that like + * an element. + * + * @param likes + * The liking Sones + * @param prefix + * The prefix for the field names (may be empty but not + * {@code null}) + * @return The simple field set containing the likes + */ + protected SimpleFieldSet encodeLikes(Collection likes, String prefix) { + SimpleFieldSetBuilder likesBuilder = new SimpleFieldSetBuilder(); + + int likeIndex = 0; + likesBuilder.put(prefix + "Count", likes.size()); + for (Sone sone : likes) { + String sonePrefix = prefix + likeIndex++ + "."; + likesBuilder.put(sonePrefix + "ID", sone.getId()); + } + + return likesBuilder.get(); + } + }