X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneInserter.java;h=c5b9e40c9f36d05e1c5552e7ccde5472b370ac7e;hb=7cd3aec944cf84236a2fa4991915608d4c905182;hp=8efcc73713bda663c44138d072926ec4aae60916;hpb=de928fae67034e4694d7d8e8ea73573d400491f4;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/SoneInserter.java b/src/main/java/net/pterodactylus/sone/core/SoneInserter.java index 8efcc73..c5b9e40 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneInserter.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneInserter.java @@ -17,12 +17,16 @@ package net.pterodactylus.sone.core; +import static com.google.common.base.Preconditions.checkArgument; +import static net.pterodactylus.sone.data.Album.NOT_EMPTY; + import java.io.InputStreamReader; import java.io.StringWriter; import java.nio.charset.Charset; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -34,7 +38,6 @@ import net.pterodactylus.sone.data.Post; import net.pterodactylus.sone.data.Reply; import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.data.Sone.SoneStatus; -import net.pterodactylus.sone.freenet.StringBucket; import net.pterodactylus.sone.main.SonePlugin; import net.pterodactylus.util.io.Closer; import net.pterodactylus.util.logging.Logging; @@ -48,12 +51,16 @@ import net.pterodactylus.util.template.TemplateException; import net.pterodactylus.util.template.TemplateParser; import net.pterodactylus.util.template.XmlFilter; +import com.google.common.base.Charsets; 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; +import freenet.support.api.Bucket; +import freenet.support.api.ManifestElement; +import freenet.support.api.RandomAccessBucket; +import freenet.support.io.ArrayBucket; /** * A Sone inserter is responsible for inserting a Sone if it has changed. @@ -90,7 +97,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 +130,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) @@ -175,12 +195,14 @@ public class SoneInserter extends AbstractService { 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) { @@ -237,6 +259,7 @@ public class SoneInserter extends AbstractService { eventBus.post(new SoneInsertAbortedEvent(sone, se1)); logger.log(Level.WARNING, String.format("Could not insert Sone “%s”!", sone.getName()), se1); } finally { + insertInformation.close(); sone.setStatus(SoneStatus.idle); } @@ -273,6 +296,7 @@ public class SoneInserter extends AbstractService { /** All properties of the Sone, copied for thread safety. */ private final Map soneProperties = new HashMap(); + private final Set buckets = new HashSet(); /** * Creates a new insert information container. @@ -291,7 +315,7 @@ public class SoneInserter extends AbstractService { soneProperties.put("replies", Ordering.from(Reply.TIME_COMPARATOR).reverse().sortedCopy(sone.getReplies())); soneProperties.put("likedPostIds", new HashSet(sone.getLikedPostIds())); soneProperties.put("likedReplyIds", new HashSet(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()); } // @@ -373,19 +397,22 @@ public class SoneInserter extends AbstractService { templateContext.set("currentEdition", core.getUpdateChecker().getLatestEdition()); templateContext.set("version", SonePlugin.VERSION); StringWriter writer = new StringWriter(); - StringBucket bucket = null; try { template.render(templateContext, writer); - bucket = new StringBucket(writer.toString(), utf8Charset); + RandomAccessBucket bucket = new ArrayBucket(writer.toString().getBytes(Charsets.UTF_8)); + buckets.add(bucket); return new ManifestElement(name, bucket, contentType, bucket.size()); } catch (TemplateException te1) { logger.log(Level.SEVERE, String.format("Could not render template “%s”!", templateName), te1); return null; } finally { Closer.close(writer); - if (bucket != null) { - bucket.free(); - } + } + } + + public void close() { + for (Bucket bucket : buckets) { + bucket.free(); } }