X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffcp%2FAbstractSoneCommand.java;h=502cb36f416a7d5b71ecf83dd82204839aa26d2d;hp=ed5aca8de3ce16dc735a9d9fe0cf4d1f3e6e4be1;hb=a47643aed43d118ca68044f95451bb5374cdb332;hpb=53aca71a0f7aa4d7b645e9715c94f29ea5ce580f diff --git a/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java b/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java index ed5aca8..502cb36 100644 --- a/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java +++ b/src/main/java/net/pterodactylus/sone/fcp/AbstractSoneCommand.java @@ -1,5 +1,5 @@ /* - * Sone - FcpInterface.java - Copyright © 2011 David Roden + * Sone - FcpInterface.java - Copyright © 2011–2012 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,6 +22,9 @@ import java.util.List; import net.pterodactylus.sone.core.Core; 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; @@ -99,6 +102,19 @@ public abstract class AbstractSoneCommand extends AbstractCommand { // /** + * Encodes text in a way that makes it possible for the text to be stored in + * a {@link SimpleFieldSet}. Backslashes, CR, and LF are prepended with a + * backslash. + * + * @param text + * The text to encode + * @return The encoded text + */ + protected String encodeString(String text) { + 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 @@ -115,16 +131,40 @@ public abstract class AbstractSoneCommand extends AbstractCommand { * or if the Sone ID is invalid */ protected Sone getSone(SimpleFieldSet simpleFieldSet, String parameterName, boolean localOnly) throws FcpException { - try { - String soneId = simpleFieldSet.getString(parameterName); - Sone sone = localOnly ? core.getLocalSone(soneId, false) : core.getSone(soneId, false); - if (sone == null) { - throw new FcpException("Could not load Sone from “" + soneId + "”."); - } - return sone; - } catch (FSParseException fspe1) { - throw new FcpException("Could not load Sone ID from “" + parameterName + "”.", fspe1); + return getSone(simpleFieldSet, parameterName, localOnly, true); + } + + /** + * 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 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 + "”."); + } + Sone sone = localOnly ? core.getLocalSone(soneId, false) : core.getSone(soneId, false); + if (mandatory && (sone == null)) { + throw new FcpException("Could not load Sone from “" + soneId + "”."); } + return sone; } /** @@ -166,10 +206,10 @@ public abstract class AbstractSoneCommand extends AbstractCommand { * if there is no reply ID stored under the given parameter * name, or if the reply ID is invalid */ - protected Reply getReply(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { + protected PostReply getReply(SimpleFieldSet simpleFieldSet, String parameterName) throws FcpException { try { String replyId = simpleFieldSet.getString(parameterName); - Reply reply = core.getReply(replyId, false); + PostReply reply = core.getReply(replyId, false); if (reply == null) { throw new FcpException("Could not load reply from “" + replyId + "”."); } @@ -180,6 +220,41 @@ public abstract class AbstractSoneCommand extends AbstractCommand { } /** + * Creates a simple field set from the given Sone, including {@link Profile} + * information. + * + * @param sone + * The Sone to encode + * @param prefix + * The prefix for the field names (may be empty but not {@code + * null}) + * @param localSone + * An optional local Sone that is used for Sone-specific data, + * such as if the Sone is followed by the local Sone + * @return The simple field set containing the given Sone + */ + protected SimpleFieldSet encodeSone(Sone sone, String prefix, Sone localSone) { + SimpleFieldSetBuilder soneBuilder = new SimpleFieldSetBuilder(); + + soneBuilder.put(prefix + "Name", sone.getName()); + soneBuilder.put(prefix + "NiceName", SoneAccessor.getNiceName(sone)); + soneBuilder.put(prefix + "LastUpdated", sone.getTime()); + if (localSone != null) { + soneBuilder.put(prefix + "Followed", String.valueOf(localSone.hasFriend(sone.getId()))); + } + Profile profile = sone.getProfile(); + soneBuilder.put(prefix + "Field.Count", profile.getFields().size()); + int fieldIndex = 0; + for (Field field : profile.getFields()) { + soneBuilder.put(prefix + "Field." + fieldIndex + ".Name", field.getName()); + soneBuilder.put(prefix + "Field." + fieldIndex + ".Value", field.getValue()); + ++fieldIndex; + } + + return soneBuilder.get(); + } + + /** * Creates a simple field set from the given collection of Sones. * * @param sones @@ -227,11 +302,11 @@ public abstract class AbstractSoneCommand extends AbstractCommand { postBuilder.put(prefix + "Recipient", post.getRecipient().getId()); } postBuilder.put(prefix + "Time", post.getTime()); - postBuilder.put(prefix + "Text", post.getText()); + postBuilder.put(prefix + "Text", encodeString(post.getText())); postBuilder.put(encodeLikes(core.getLikes(post), prefix + "Likes.")); if (includeReplies) { - List replies = core.getReplies(post); + List replies = core.getReplies(post); postBuilder.put(encodeReplies(replies, prefix)); } @@ -260,7 +335,7 @@ public abstract class AbstractSoneCommand extends AbstractCommand { 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(encodeReplies(Filters.filteredList(core.getReplies(post), Reply.FUTURE_REPLY_FILTER), postPrefix + ".")); } } @@ -277,17 +352,17 @@ public abstract class AbstractSoneCommand extends AbstractCommand { * {@code null}) * @return The simple field set containing the replies */ - protected SimpleFieldSet encodeReplies(Collection replies, String prefix) { + 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) { + for (PostReply 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()); + replyBuilder.put(replyPrefix + "Text", encodeString(reply.getText())); } return replyBuilder.get(); @@ -317,4 +392,16 @@ public abstract class AbstractSoneCommand extends AbstractCommand { return likesBuilder.get(); } + // + // OBJECT METHODS + // + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return getClass().getName() + "[writeAccess=" + writeAccess + "]"; + } + }