X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FSoneModificationDetector.java;h=810241a9c34de54cfeff5f75eb55b55b266328b1;hb=885f3980c49778280a748c630788212a68ac4ed6;hp=0a26e9ec45341b2a6819e8a9c62ef256f91f194b;hpb=ffeaf092f0381cf21d378115f8b97188d6eecdc6;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/SoneModificationDetector.java b/src/main/java/net/pterodactylus/sone/core/SoneModificationDetector.java index 0a26e9e..810241a 100644 --- a/src/main/java/net/pterodactylus/sone/core/SoneModificationDetector.java +++ b/src/main/java/net/pterodactylus/sone/core/SoneModificationDetector.java @@ -10,6 +10,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.pterodactylus.sone.data.Sone; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.base.Ticker; @@ -23,55 +24,73 @@ import com.google.common.base.Ticker; class SoneModificationDetector { private final Ticker ticker; - private final Core core; - private final Sone sone; + private final LockableFingerprintProvider lockableFingerprintProvider; private final AtomicInteger insertionDelay; private Optional lastModificationTime; - private String originalFingerprint; - private String lastFingerprint; + private String lastInsertFingerprint; + private String lastCheckFingerprint; - SoneModificationDetector(Core core, Sone sone, AtomicInteger insertionDelay) { - this(systemTicker(), core, sone, insertionDelay); + SoneModificationDetector(LockableFingerprintProvider lockableFingerprintProvider, AtomicInteger insertionDelay) { + this(systemTicker(), lockableFingerprintProvider, insertionDelay); } @VisibleForTesting - SoneModificationDetector(Ticker ticker, Core core, Sone sone, AtomicInteger insertionDelay) { + SoneModificationDetector(Ticker ticker, LockableFingerprintProvider lockableFingerprintProvider, AtomicInteger insertionDelay) { this.ticker = ticker; - this.core = core; - this.sone = sone; + this.lockableFingerprintProvider = lockableFingerprintProvider; this.insertionDelay = insertionDelay; - originalFingerprint = sone.getFingerprint(); - lastFingerprint = originalFingerprint; + lastCheckFingerprint = lastInsertFingerprint; } public boolean isEligibleForInsert() { - if (core.isLocked(sone)) { + if (lockableFingerprintProvider.isLocked()) { lastModificationTime = absent(); - lastFingerprint = ""; + lastCheckFingerprint = ""; return false; } - String fingerprint = sone.getFingerprint(); - if (originalFingerprint.equals(fingerprint)) { + String fingerprint = lockableFingerprintProvider.getFingerprint(); + if (fingerprint.equals(lastInsertFingerprint)) { lastModificationTime = absent(); - lastFingerprint = fingerprint; + lastCheckFingerprint = fingerprint; return false; } - if (!lastFingerprint.equals(fingerprint)) { + if (!Objects.equal(lastCheckFingerprint, fingerprint)) { lastModificationTime = of(ticker.read()); - lastFingerprint = fingerprint; + lastCheckFingerprint = fingerprint; return false; } return insertionDelayHasPassed(); } + public String getLastInsertFingerprint() { + return lastInsertFingerprint; + } + public void setFingerprint(String fingerprint) { - originalFingerprint = fingerprint; - lastFingerprint = originalFingerprint; + lastInsertFingerprint = fingerprint; + lastCheckFingerprint = lastInsertFingerprint; lastModificationTime = absent(); } private boolean insertionDelayHasPassed() { - return lastModificationTime.isPresent() && (NANOSECONDS.toSeconds(ticker.read() - lastModificationTime.get()) >= insertionDelay.get()); + return NANOSECONDS.toSeconds(ticker.read() - lastModificationTime.get()) >= insertionDelay.get(); + } + + public boolean isModified() { + return !Objects.equal(lockableFingerprintProvider.getFingerprint(), lastInsertFingerprint); + } + + /** + * Provider for a fingerprint and the information if a {@link Sone} is locked. This + * prevents us from having to lug a Sone object around. + * + * @author David ‘Bombe’ Roden + */ + static interface LockableFingerprintProvider { + + boolean isLocked(); + String getFingerprint(); + } }