From 431966cbbd0c28f29d7d4da1bf682b8d02abc113 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Tue, 5 Feb 2019 15:10:36 +0700 Subject: [PATCH] Cache null values properly --- .../filebot/similarity/EpisodeMatcher.java | 23 +++++-------------- .../filebot/similarity/EpisodeMetrics.java | 18 ++++++++++----- .../net/filebot/subtitle/SubtitleMetrics.java | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/source/net/filebot/similarity/EpisodeMatcher.java b/source/net/filebot/similarity/EpisodeMatcher.java index 456fcf75..3246213a 100644 --- a/source/net/filebot/similarity/EpisodeMatcher.java +++ b/source/net/filebot/similarity/EpisodeMatcher.java @@ -2,12 +2,12 @@ package net.filebot.similarity; import static java.util.Arrays.*; import static java.util.Collections.*; -import static net.filebot.Logging.*; import static net.filebot.web.EpisodeUtilities.*; import java.io.File; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.List; @@ -15,13 +15,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import java.util.function.Function; -import java.util.logging.Level; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import net.filebot.media.SmartSeasonEpisodeMatcher; import net.filebot.similarity.SeasonEpisodeMatcher.SxE; @@ -91,18 +85,13 @@ public class EpisodeMatcher extends Matcher { } private final SeasonEpisodeMatcher seasonEpisodeMatcher = new SmartSeasonEpisodeMatcher(SeasonEpisodeMatcher.LENIENT_SANITY, false); - private final Cache> parseEpisodeIdentiferCache = CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build(); + private final Map> cache = synchronizedMap(new HashMap<>(64, 4)); private Set parseEpisodeIdentifer(File file) { - try { - return parseEpisodeIdentiferCache.get(file, () -> { - List sxe = seasonEpisodeMatcher.match(file.getName()); - return sxe == null ? emptySet() : new HashSet(sxe); - }); - } catch (ExecutionException e) { - debug.log(Level.SEVERE, e, e::toString); - } - return emptySet(); + return cache.computeIfAbsent(file, f -> { + List sxe = seasonEpisodeMatcher.match(f.getName()); + return sxe == null ? emptySet() : new HashSet(sxe); + }); } private Set normalizeIdentifierSet(Set numbers) { diff --git a/source/net/filebot/similarity/EpisodeMetrics.java b/source/net/filebot/similarity/EpisodeMetrics.java index 63b434a8..3461e9af 100644 --- a/source/net/filebot/similarity/EpisodeMetrics.java +++ b/source/net/filebot/similarity/EpisodeMetrics.java @@ -21,6 +21,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -44,7 +45,7 @@ public class EpisodeMetrics { // Match by season / episode numbers public final SimilarityMetric SeasonEpisode = new SeasonEpisodeMetric(new SmartSeasonEpisodeMatcher(null, false)) { - private final Map> cache = synchronizedMap(new HashMap>(64, 4)); + private final Map> cache = synchronizedMap(new HashMap<>(64, 4)); @Override protected Collection parse(Object object) { @@ -58,7 +59,10 @@ public class EpisodeMetrics { return emptySet(); } - return cache.computeIfAbsent(object, super::parse); + return cache.computeIfAbsent(object, o -> { + Collection sxe = super.parse(o); + return sxe == null ? emptySet() : sxe; + }); } private Set parse(Episode e) { @@ -88,7 +92,7 @@ public class EpisodeMetrics { // Match episode airdate public final SimilarityMetric AirDate = new DateMetric(getDateMatcher()) { - private final Map cache = synchronizedMap(new HashMap(64, 4)); + private final Map> cache = synchronizedMap(new HashMap<>(64, 4)); @Override public SimpleDate parse(Object object) { @@ -101,7 +105,9 @@ public class EpisodeMetrics { return null; } - return cache.computeIfAbsent(object, super::parse); + return cache.computeIfAbsent(object, o -> { + return Optional.ofNullable(super.parse(o)); + }).orElse(null); } }; @@ -701,7 +707,7 @@ public class EpisodeMetrics { }; - protected final Map transformCache = synchronizedMap(new HashMap(64, 4)); + protected final Map transformCache = synchronizedMap(new HashMap<>(64, 4)); protected final Transliterator transliterator = Transliterator.getInstance("Any-Latin;Latin-ASCII;[:Diacritic:]remove"); @@ -716,7 +722,7 @@ public class EpisodeMetrics { // 3. remove obvious release info // 4. apply transliterator // 5. remove or normalize special characters - return normalizePunctuation(transliterator.transform(stripFormatInfo(removeEmbeddedChecksum(normalizeFileName(object))))).toLowerCase(); + return normalizePunctuation(transliterator.transform(stripFormatInfo(removeEmbeddedChecksum(normalizeFileName(o))))).toLowerCase(); }); } diff --git a/source/net/filebot/subtitle/SubtitleMetrics.java b/source/net/filebot/subtitle/SubtitleMetrics.java index 89e40d38..77fbce09 100644 --- a/source/net/filebot/subtitle/SubtitleMetrics.java +++ b/source/net/filebot/subtitle/SubtitleMetrics.java @@ -183,7 +183,7 @@ public class SubtitleMetrics extends EpisodeMetrics { return emptyMap(); } - private final Map> cache = synchronizedMap(new HashMap>(64, 4)); + private final Map> cache = synchronizedMap(new HashMap<>(64, 4)); private Map getVideoProperties(File file) { return cache.computeIfAbsent(file, f -> {