Merge branch 'link-filter-26' into next
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 5 Nov 2011 15:55:54 +0000 (16:55 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 5 Nov 2011 15:55:54 +0000 (16:55 +0100)
src/main/java/net/pterodactylus/sone/core/FreenetInterface.java
src/main/java/net/pterodactylus/sone/core/SoneDownloader.java
src/main/java/net/pterodactylus/sone/core/SoneException.java
src/main/java/net/pterodactylus/sone/core/SoneInsertException.java [new file with mode: 0644]
src/main/java/net/pterodactylus/sone/template/ImageLinkFilter.java
src/main/java/net/pterodactylus/sone/web/BookmarksPage.java
src/main/resources/templates/bookmarks.html

index af680a1..c63231a 100644 (file)
@@ -26,7 +26,6 @@ import java.util.Map;
 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;
@@ -154,7 +153,7 @@ public class FreenetInterface {
                        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);
                }
        }
 
@@ -175,7 +174,7 @@ public class FreenetInterface {
                try {
                        return client.insertManifest(insertUri, manifestEntries, defaultFile);
                } catch (InsertException ie1) {
-                       throw new SoneException(null, ie1);
+                       throw new SoneException(ie1);
                }
        }
 
index db26d80..b085ade 100644 (file)
@@ -219,8 +219,10 @@ public class SoneDownloader extends AbstractService {
         * @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;
@@ -336,8 +338,8 @@ public class SoneDownloader extends AbstractService {
                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;
                                }
index 271627e..683a148 100644 (file)
@@ -25,88 +25,42 @@ package net.pterodactylus.sone.core;
 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;
        }
 
 }
diff --git a/src/main/java/net/pterodactylus/sone/core/SoneInsertException.java b/src/main/java/net/pterodactylus/sone/core/SoneInsertException.java
new file mode 100644 (file)
index 0000000..350c3d8
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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);
+       }
+
+}
index 063a1de..d7b5eea 100644 (file)
@@ -39,7 +39,7 @@ import net.pterodactylus.util.template.TemplateParser;
 public class ImageLinkFilter implements Filter {
 
        /** The template to render for the &lt;img&gt; 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;
@@ -73,6 +73,7 @@ public class ImageLinkFilter implements Filter {
                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());
                }
index ad1717b..41a3e65 100644 (file)
@@ -70,7 +70,7 @@ public class BookmarksPage extends SoneTemplatePage {
                });
                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());
index 8768b5a..cf4e7ce 100644 (file)
@@ -5,6 +5,7 @@
        <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>