Use database methods where possible.
[Sone.git] / src / main / java / net / pterodactylus / sone / core / SoneInserter.java
index 60eebec..843e9c4 100644 (file)
@@ -32,6 +32,8 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import net.pterodactylus.sone.core.Options.Option;
+import net.pterodactylus.sone.core.Options.OptionWatcher;
 import net.pterodactylus.sone.core.event.SoneInsertAbortedEvent;
 import net.pterodactylus.sone.core.event.SoneInsertedEvent;
 import net.pterodactylus.sone.core.event.SoneInsertingEvent;
@@ -54,6 +56,7 @@ import net.pterodactylus.util.template.TemplateException;
 import net.pterodactylus.util.template.TemplateParser;
 import net.pterodactylus.util.template.XmlFilter;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Ordering;
 import com.google.common.eventbus.EventBus;
@@ -96,6 +99,7 @@ public class SoneInserter extends AbstractService {
        private final FreenetInterface freenetInterface;
 
        private final SoneModificationDetector soneModificationDetector;
+       private final long delay;
 
        /** The Sone to insert. */
        private volatile Sone sone;
@@ -113,12 +117,18 @@ public class SoneInserter extends AbstractService {
         *            The Sone to insert
         */
        public SoneInserter(Core core, EventBus eventBus, FreenetInterface freenetInterface, Sone sone) {
+               this(core, eventBus, freenetInterface, sone, new SoneModificationDetector(core, sone, insertionDelay), 1000);
+       }
+
+       @VisibleForTesting
+       SoneInserter(Core core, EventBus eventBus, FreenetInterface freenetInterface, Sone sone, SoneModificationDetector soneModificationDetector, long delay) {
                super("Sone Inserter for “" + sone.getName() + "”", false);
                this.core = core;
                this.eventBus = eventBus;
                this.freenetInterface = freenetInterface;
                this.sone = sone;
-               this.soneModificationDetector = new SoneModificationDetector(core, sone, insertionDelay);
+               this.soneModificationDetector = soneModificationDetector;
+               this.delay = delay;
        }
 
        //
@@ -133,11 +143,16 @@ public class SoneInserter extends AbstractService {
         * @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");
+               checkArgument(sone.equals(this.sone), "Sone to insert can not be set to a different Sone");
                this.sone = sone;
                return this;
        }
 
+       @VisibleForTesting
+       static AtomicInteger getInsertionDelay() {
+               return insertionDelay;
+       }
+
        /**
         * Changes the insertion delay, i.e. the time the Sone inserter waits after it
         * has noticed a Sone modification before it starts the insert.
@@ -191,7 +206,7 @@ public class SoneInserter extends AbstractService {
                while (!shouldStop()) {
                        try {
                                /* check every second. */
-                               sleep(1000);
+                               sleep(delay);
 
                                if (soneModificationDetector.isEligibleForInsert()) {
                                        InsertInformation insertInformation = new InsertInformation(sone);
@@ -241,6 +256,15 @@ public class SoneInserter extends AbstractService {
                }
        }
 
+       static class SetInsertionDelay implements OptionWatcher<Integer> {
+
+               @Override
+               public void optionChanged(Option<Integer> option, Integer oldValue, Integer newValue) {
+                       setInsertionDelay(newValue);
+               }
+
+       }
+
        /**
         * Container for information that are required to insert a Sone. This
         * container merely exists to copy all relevant data without holding a lock
@@ -248,7 +272,8 @@ public class SoneInserter extends AbstractService {
         *
         * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
         */
-       private class InsertInformation {
+       @VisibleForTesting
+       class InsertInformation {
 
                private final String fingerprint;
 
@@ -280,7 +305,8 @@ public class SoneInserter extends AbstractService {
                // ACCESSORS
                //
 
-               private String getFingerprint() {
+               @VisibleForTesting
+               String getFingerprint() {
                        return fingerprint;
                }