Store the insert URI in the information used for inserting.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / SoneInserter.java
index 8efcc73..8e253ee 100644 (file)
 
 package net.pterodactylus.sone.core;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static net.pterodactylus.sone.data.Album.NOT_EMPTY;
+import static net.pterodactylus.sone.data.Sone.TO_FREENET_URI;
+import static net.pterodactylus.sone.data.Sone.TO_INSERT_URI;
+
 import java.io.InputStreamReader;
 import java.io.StringWriter;
 import java.nio.charset.Charset;
@@ -48,13 +53,13 @@ import net.pterodactylus.util.template.TemplateException;
 import net.pterodactylus.util.template.TemplateParser;
 import net.pterodactylus.util.template.XmlFilter;
 
+import freenet.client.async.ManifestElement;
+import freenet.keys.FreenetURI;
+
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Ordering;
 import com.google.common.eventbus.EventBus;
 
-import freenet.client.async.ManifestElement;
-import freenet.keys.FreenetURI;
-
 /**
  * A Sone inserter is responsible for inserting a Sone if it has changed.
  *
@@ -90,7 +95,7 @@ public class SoneInserter extends AbstractService {
        private final FreenetInterface freenetInterface;
 
        /** The Sone to insert. */
-       private final Sone sone;
+       private volatile Sone sone;
 
        /** Whether a modification has been detected. */
        private volatile boolean modified = false;
@@ -123,8 +128,21 @@ public class SoneInserter extends AbstractService {
        //
 
        /**
-        * Changes the insertion delay, i.e. the time the Sone inserter waits after
-        * it has noticed a Sone modification before it starts the insert.
+        * Sets the Sone to insert.
+        *
+        * @param sone
+        *              The Sone to insert
+        * @return This Sone inserter
+        */
+       public SoneInserter setSone(Sone sone) {
+               checkArgument((this.sone == null) || sone.equals(this.sone), "Sone to insert can not be set to a different Sone");
+               this.sone = sone;
+               return this;
+       }
+
+       /**
+        * Changes the insertion delay, i.e. the time the Sone inserter waits after it
+        * has noticed a Sone modification before it starts the insert.
         *
         * @param insertionDelay
         *            The insertion delay (in seconds)
@@ -167,20 +185,19 @@ public class SoneInserter extends AbstractService {
        // SERVICE METHODS
        //
 
-       /**
-        * {@inheritDoc}
-        */
        @Override
        protected void serviceRun() {
                long lastModificationTime = 0;
                String lastInsertedFingerprint = lastInsertFingerprint;
                String lastFingerprint = "";
+               Sone sone;
                while (!shouldStop()) {
                        try {
                                /* check every seconds. */
                                sleep(1000);
 
                                /* don’t insert locked Sones. */
+                               sone = this.sone;
                                if (core.isLocked(sone)) {
                                        /* trigger redetection when the Sone is unlocked. */
                                        synchronized (sone) {
@@ -229,7 +246,7 @@ public class SoneInserter extends AbstractService {
                                                        break;
                                                }
                                                sone.setTime(insertTime);
-                                               sone.setLatestEdition(finalUri.getEdition());
+                                               sone.modify().setLatestEdition(finalUri.getEdition()).update();
                                                core.touchConfiguration();
                                                success = true;
                                                logger.log(Level.INFO, String.format("Inserted Sone “%s” at %s.", sone.getName(), finalUri));
@@ -284,14 +301,14 @@ public class SoneInserter extends AbstractService {
                        soneProperties.put("id", sone.getId());
                        soneProperties.put("name", sone.getName());
                        soneProperties.put("time", sone.getTime());
-                       soneProperties.put("requestUri", sone.getRequestUri());
-                       soneProperties.put("insertUri", sone.getInsertUri());
+                       soneProperties.put("requestUri", TO_FREENET_URI.apply(sone));
+                       soneProperties.put("insertUri", TO_INSERT_URI.apply(sone));
                        soneProperties.put("profile", sone.getProfile());
                        soneProperties.put("posts", Ordering.from(Post.TIME_COMPARATOR).sortedCopy(sone.getPosts()));
                        soneProperties.put("replies", Ordering.from(Reply.TIME_COMPARATOR).reverse().sortedCopy(sone.getReplies()));
                        soneProperties.put("likedPostIds", new HashSet<String>(sone.getLikedPostIds()));
                        soneProperties.put("likedReplyIds", new HashSet<String>(sone.getLikedReplyIds()));
-                       soneProperties.put("albums", FluentIterable.from(sone.getAlbums()).transformAndConcat(Album.FLATTENER).toList());
+                       soneProperties.put("albums", FluentIterable.from(sone.getRootAlbum().getAlbums()).transformAndConcat(Album.FLATTENER).filter(NOT_EMPTY).toList());
                }
 
                //