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;
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;
import freenet.support.SimpleFieldSet;
import com.google.common.base.Optional;
-import com.google.common.collect.Collections2;
/**
* Abstract base implementation of a {@link Command} with Sone-related helper
* @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<Sone> getOptionalSone(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException {
+ String soneId = getString(simpleFieldSet, parameterName, null);
+ return (soneId == null) ? Optional.<Sone>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<Sone> 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> sone = getMandatorySone(soneId);
+ return sone.get();
+ }
+
+ private Optional<Sone> getMandatorySone(String soneId) throws FcpException {
Optional<Sone> 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.
*
protected PostReply getReply(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException {
try {
String replyId = simpleFieldSet.getString(parameterName);
- Optional<PostReply> reply = core.getPostReply(replyId);
+ Optional<PostReply> reply = core.getDatabase().getPostReply(replyId);
if (!reply.isPresent()) {
throw new FcpException("Could not load reply from “" + replyId + "”.");
}
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<PostReply> 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());
}
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<PostReply> replies = core.getReplies(post.getId());
- postBuilder.put(encodeReplies(replies, prefix));
- }
+ return postBuilder;
+ }
+
+ protected SimpleFieldSet encodePosts(Collection<? extends Post> 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<? extends Post> posts, String prefix, boolean includeReplies) {
+ private SimpleFieldSetBuilder createPostBuilderFromPosts(Collection<? extends Post> 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<? extends Post> 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();