X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffcp%2FAbstractSoneCommand.java;h=baa3129e4f7f723cad8634ba212ab0d0157721c1;hb=0a4b6fc252003c71f4bdef09560e87982838d9c8;hp=d71ffc4481125a6327909a0b4199d4b841023dbe;hpb=60fda3f6fd8cd72151338c831f509dd8d9d0f9ff;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 d71ffc4..baa3129 100644 --- a/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java +++ b/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java @@ -17,6 +17,9 @@ package net.pterodactylus.sone.fcp; +import static com.google.common.collect.FluentIterable.from; +import static net.pterodactylus.sone.data.Reply.FUTURE_REPLY_FILTER; + import java.util.Collection; import java.util.List; @@ -25,7 +28,6 @@ import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.PostReply; import net.pterodactylus.sone.data.Profile; import net.pterodactylus.sone.data.Profile.Field; -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; @@ -33,12 +35,11 @@ import net.pterodactylus.sone.freenet.fcp.Command; import net.pterodactylus.sone.freenet.fcp.FcpException; import net.pterodactylus.sone.template.SoneAccessor; -import com.google.common.base.Optional; -import com.google.common.collect.Collections2; - import freenet.node.FSParseException; import freenet.support.SimpleFieldSet; +import com.google.common.base.Optional; + /** * Abstract base implementation of a {@link Command} with Sone-related helper * methods. @@ -114,62 +115,44 @@ public abstract class AbstractSoneCommand extends AbstractCommand { * @return The encoded text */ protected static String encodeString(String text) { - return text.replaceAll("\\\\", "\\\\").replaceAll("\n", "\\\\n").replaceAll("\r", "\\\\r"); + return text.replaceAll("\\\\", "\\\\\\\\").replaceAll("\n", "\\\\n").replaceAll("\r", "\\\\r"); } - /** - * Returns a Sone whose ID is a parameter in the given simple field set. - * - * @param simpleFieldSet - * The simple field set containing the ID of the Sone - * @param parameterName - * The name under which the Sone ID is stored in the simple field - * set - * @param localOnly - * {@code true} to only return local Sones, {@code false} to - * return any Sones - * @return The Sone - * @throws FcpException - * if there is no Sone ID stored under the given parameter name, - * or if the Sone ID is invalid - */ - protected Sone getSone(SimpleFieldSet simpleFieldSet, String parameterName, boolean localOnly) throws FcpException { - return getSone(simpleFieldSet, parameterName, localOnly, true).get(); + protected Optional getOptionalSone(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + String soneId = getString(simpleFieldSet, parameterName, null); + return (soneId == null) ? Optional.absent() : core.getSone(soneId); } - /** - * Returns a Sone whose ID is a parameter in the given simple field set. - * - * @param simpleFieldSet - * The simple field set containing the ID of the Sone - * @param parameterName - * The name under which the Sone ID is stored in the simple field - * set - * @param localOnly - * {@code true} to only return local Sones, {@code false} to - * return any Sones - * @param mandatory - * {@code true} if a valid Sone ID is required, {@code false} - * otherwise - * @return The Sone, or {@code null} if {@code mandatory} is {@code false} - * and the Sone ID is invalid - * @throws FcpException - * if there is no Sone ID stored under the given parameter name, - * or if {@code mandatory} is {@code true} and the Sone ID is - * invalid - */ - protected Optional getSone(SimpleFieldSet simpleFieldSet, String parameterName, boolean localOnly, boolean mandatory) throws FcpException { - String soneId = simpleFieldSet.get(parameterName); - if (mandatory && (soneId == null)) { - throw new FcpException("Could not load Sone ID from “" + parameterName + "”."); + protected Sone getMandatoryLocalSone(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + Sone sone = getMandatorySone(simpleFieldSet, parameterName); + if (!sone.isLocal()) { + throw new FcpException("Could not load Sone from “" + sone.getId() + "”."); } + return sone; + } + + protected Sone getMandatorySone(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + String soneId = getMandatoryParameter(simpleFieldSet, parameterName); + Optional sone = getMandatorySone(soneId); + return sone.get(); + } + + private Optional getMandatorySone(String soneId) throws FcpException { Optional sone = core.getSone(soneId); - if ((mandatory && !sone.isPresent()) || (mandatory && sone.isPresent() && (localOnly && !sone.get().isLocal()))) { + if (!sone.isPresent()) { throw new FcpException("Could not load Sone from “" + soneId + "”."); } return sone; } + private String getMandatoryParameter(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + String soneId = simpleFieldSet.get(parameterName); + if (soneId == null) { + throw new FcpException("Could not load Sone ID from “" + parameterName + "”."); + } + return soneId; + } + /** * Returns a post whose ID is a parameter in the given simple field set. * @@ -186,7 +169,7 @@ public abstract class AbstractSoneCommand extends AbstractCommand { protected Post getPost(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { try { String postId = simpleFieldSet.getString(parameterName); - Optional post = core.getPost(postId); + Optional post = core.getDatabase().getPost(postId); if (!post.isPresent()) { throw new FcpException("Could not load post from “" + postId + "”."); } @@ -212,7 +195,7 @@ public abstract class AbstractSoneCommand extends AbstractCommand { protected PostReply getReply(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { try { String replyId = simpleFieldSet.getString(parameterName); - Optional reply = core.getPostReply(replyId); + Optional reply = core.getDatabase().getPostReply(replyId); if (!reply.isPresent()) { throw new FcpException("Could not load reply from “" + replyId + "”."); } @@ -283,20 +266,20 @@ public abstract class AbstractSoneCommand extends AbstractCommand { 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) { + protected SimpleFieldSet encodePost(Post post, String prefix) { + return createPostBuilderFromPost(post, prefix).get(); + } + + protected SimpleFieldSet encodePostWithReplies(Post post, String prefix) { + SimpleFieldSetBuilder postBuilder = createPostBuilderFromPost(post, prefix); + + List replies = from(post.getReplies()).filter(FUTURE_REPLY_FILTER).toList(); + postBuilder.put(encodeReplies(replies, prefix)); + + return postBuilder.get(); + } + + private SimpleFieldSetBuilder createPostBuilderFromPost(Post post, String prefix) { SimpleFieldSetBuilder postBuilder = new SimpleFieldSetBuilder(); postBuilder.put(prefix + "ID", post.getId()); @@ -306,40 +289,37 @@ public abstract class AbstractSoneCommand extends AbstractCommand { } postBuilder.put(prefix + "Time", post.getTime()); postBuilder.put(prefix + "Text", encodeString(post.getText())); - postBuilder.put(encodeLikes(core.getLikes(post), prefix + "Likes.")); + postBuilder.put(encodeLikes(post.getLikes(), prefix + "Likes.")); - if (includeReplies) { - List replies = core.getReplies(post.getId()); - postBuilder.put(encodeReplies(replies, prefix)); - } + return postBuilder; + } + + protected SimpleFieldSet encodePosts(Collection posts, String prefix) { + SimpleFieldSetBuilder postBuilder = createPostBuilderFromPosts(posts, 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 - */ - protected SimpleFieldSet encodePosts(Collection posts, String prefix, boolean includeReplies) { + private SimpleFieldSetBuilder createPostBuilderFromPosts(Collection posts, String prefix) { SimpleFieldSetBuilder postBuilder = new SimpleFieldSetBuilder(); int postIndex = 0; postBuilder.put(prefix + "Count", posts.size()); for (Post post : posts) { String postPrefix = prefix + postIndex++; - postBuilder.put(encodePost(post, postPrefix + ".", includeReplies)); - if (includeReplies) { - postBuilder.put(encodeReplies(Collections2.filter(core.getReplies(post.getId()), Reply.FUTURE_REPLY_FILTER), postPrefix + ".")); - } + postBuilder.put(encodePost(post, postPrefix + ".")); + } + + return postBuilder; + } + + protected SimpleFieldSet encodePostsWithReplies(Collection posts, String prefix) { + SimpleFieldSetBuilder postBuilder = createPostBuilderFromPosts(posts, prefix); + + int postIndex = 0; + for (Post post : posts) { + String postPrefix = prefix + postIndex++; + postBuilder.put(encodeReplies(from(post.getReplies()).filter(FUTURE_REPLY_FILTER).toList(), postPrefix + ".")); } return postBuilder.get(); @@ -399,9 +379,6 @@ public abstract class AbstractSoneCommand extends AbstractCommand { // OBJECT METHODS // - /** - * {@inheritDoc} - */ @Override public String toString() { return getClass().getName() + "[writeAccess=" + writeAccess + "]";