import java.util.logging.Level;
import java.util.logging.Logger;
-import net.pterodactylus.sone.core.SoneException.Type;
import net.pterodactylus.sone.data.Image;
import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.data.TemporaryImage;
ClientPutter clientPutter = client.insert(insertBlock, false, null, false, insertContext, insertToken, RequestStarter.INTERACTIVE_PRIORITY_CLASS);
insertToken.setClientPutter(clientPutter);
} catch (InsertException ie1) {
- throw new SoneException(Type.INSERT_FAILED, "Could not start image insert.", ie1);
+ throw new SoneInsertException("Could not start image insert.", ie1);
}
}
try {
return client.insertManifest(insertUri, manifestEntries, defaultFile);
} catch (InsertException ie1) {
- throw new SoneException(null, ie1);
+ throw new SoneException(ie1);
}
}
* @param soneInputStream
* The input stream to parse the Sone from
* @return The parsed Sone
+ * @throws SoneException
+ * if a parse error occurs, or the protocol is invalid
*/
- public Sone parseSone(Sone originalSone, InputStream soneInputStream) {
+ public Sone parseSone(Sone originalSone, InputStream soneInputStream) throws SoneException {
/* TODO - impose a size limit? */
Document document;
if (profileFieldsXml != null) {
for (SimpleXML fieldXml : profileFieldsXml.getNodes("field")) {
String fieldName = fieldXml.getValue("field-name", null);
- String fieldValue = fieldXml.getValue("field-value", null);
- if ((fieldName == null) || (fieldValue == null)) {
+ String fieldValue = fieldXml.getValue("field-value", "");
+ if (fieldName == null) {
logger.log(Level.WARNING, "Downloaded profile field for Sone %s with missing data! Name: %s, Value: %s", new Object[] { sone, fieldName, fieldValue });
return null;
}
public class SoneException extends Exception {
/**
- * Defines the different error. This is an enum instead of custom exceptions
- * to keep the number of exceptions down. Specialized exceptions might still
- * exist, though.
- */
- public static enum Type {
-
- /** An invalid Sone name was specified. */
- INVALID_SONE_NAME,
-
- /** An invalid URI was specified. */
- INVALID_URI,
-
- /** An insert failed. */
- INSERT_FAILED,
-
- }
-
- /** The type of the exception. */
- private final Type type;
-
- /**
* Creates a new Sone exception.
- *
- * @param type
- * The type of the occured error
*/
- public SoneException(Type type) {
- this.type = type;
+ public SoneException() {
+ super();
}
/**
* Creates a new Sone exception.
*
- * @param type
- * The type of the occured error
* @param message
* The message of the exception
*/
- public SoneException(Type type, String message) {
+ public SoneException(String message) {
super(message);
- this.type = type;
}
/**
* Creates a new Sone exception.
*
- * @param type
- * The type of the occured error
* @param cause
* The cause of the exception
*/
- public SoneException(Type type, Throwable cause) {
+ public SoneException(Throwable cause) {
super(cause);
- this.type = type;
}
/**
* Creates a new Sone exception.
*
- * @param type
- * The type of the occured error
* @param message
* The message of the exception
* @param cause
* The cause of the exception
*/
- public SoneException(Type type, String message, Throwable cause) {
+ public SoneException(String message, Throwable cause) {
super(message, cause);
- this.type = type;
- }
-
- //
- // ACCESSORS
- //
-
- /**
- * Returns the type of this exception.
- *
- * @return The type of this exception (may be {@code null})
- */
- public Type getType() {
- return type;
}
}
--- /dev/null
+/*
+ * Sone - SoneInsertException.java - Copyright © 2011 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package net.pterodactylus.sone.core;
+
+/**
+ * Exception that signals a problem with an insert.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class SoneInsertException extends SoneException {
+
+ /**
+ * Creates a new Sone insert exception.
+ */
+ public SoneInsertException() {
+ super();
+ }
+
+ /**
+ * Creates a new Sone insert exception.
+ *
+ * @param message
+ * The message of the exception
+ */
+ public SoneInsertException(String message) {
+ super(message);
+ }
+
+ /**
+ * Creates a new Sone insert exception.
+ *
+ * @param cause
+ * The cause of the exception
+ */
+ public SoneInsertException(Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * Creates a new Sone insert exception.
+ *
+ * @param message
+ * The message of the exception
+ * @param cause
+ * The cause of the exception
+ */
+ public SoneInsertException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
public class ImageLinkFilter implements Filter {
/** The template to render for the <img> tag. */
- private static final Template linkTemplate = TemplateParser.parse(new StringReader("<img<%ifnull !class> class=\"<%class|css>\"<%/if> src=\"<%src|html>\" alt=\"<%alt|html>\" title=\"<%title|html>\" width=\"<%width|html>\" height=\"<%height|html>\" style=\"position: relative;<%ifnull ! top>top: <% top|html>;<%/if><%ifnull ! left>left: <% left|html>;<%/if>\"/>"));
+ private static final Template linkTemplate = TemplateParser.parse(new StringReader("<img<%ifnull !class> class=\"<%class|css>\"<%/if> src=\"<%src|html><%if forceDownload>?forcedownload=true<%/if>\" alt=\"<%alt|html>\" title=\"<%title|html>\" width=\"<%width|html>\" height=\"<%height|html>\" style=\"position: relative;<%ifnull ! top>top: <% top|html>;<%/if><%ifnull ! left>left: <% left|html>;<%/if>\"/>"));
/** The template context factory. */
private final TemplateContextFactory templateContextFactory;
linkTemplateContext.set("class", imageClass);
if (image.isInserted()) {
linkTemplateContext.set("src", "/" + image.getKey());
+ linkTemplateContext.set("forceDownload", true);
} else {
linkTemplateContext.set("src", "getImage.html?image=" + image.getId());
}
});
List<Post> sortedPosts = new ArrayList<Post>(loadedPosts);
Collections.sort(sortedPosts, Post.TIME_COMPARATOR);
- Pagination<Post> pagination = new Pagination<Post>(sortedPosts, 25).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("page"), 0));
+ Pagination<Post> pagination = new Pagination<Post>(sortedPosts, webInterface.getCore().getPreferences().getPostsPerPage()).setPage(Numbers.safeParseInteger(request.getHttpRequest().getParam("page"), 0));
templateContext.set("pagination", pagination);
templateContext.set("posts", pagination.getItems());
templateContext.set("postsNotLoaded", allPosts.size() != loadedPosts.size());
<h1><%= Page.Bookmarks.Page.Title|l10n|html></h1>
<div id="posts">
+ <%= page|store key=pageParameter>
<%include include/pagination.html>
<%foreach posts post>
<%include include/viewPost.html>