This is an automated email from the ASF dual-hosted git repository. jhyde pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 8658804e0a1b5c2fe9c78fa8e40655db06531ac8 Author: Julian Hyde <[email protected]> AuthorDate: Mon Dec 16 15:57:53 2019 -0800 In DiffRepository, replace a synchronized Map with a Guava cache --- .../org/apache/calcite/test/DiffRepository.java | 62 +++++++++++++++------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/core/src/test/java/org/apache/calcite/test/DiffRepository.java b/core/src/test/java/org/apache/calcite/test/DiffRepository.java index fefa003..462c79f 100644 --- a/core/src/test/java/org/apache/calcite/test/DiffRepository.java +++ b/core/src/test/java/org/apache/calcite/test/DiffRepository.java @@ -22,6 +22,10 @@ import org.apache.calcite.util.Sources; import org.apache.calcite.util.Util; import org.apache.calcite.util.XmlOutput; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + import org.junit.jupiter.api.Assertions; import org.opentest4j.AssertionFailedError; import org.w3c.dom.CDATASection; @@ -39,10 +43,9 @@ import java.io.IOException; import java.io.Writer; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; +import java.util.Objects; import java.util.Set; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -161,8 +164,8 @@ public class DiffRepository { * the same class to share the same diff-repository: if the repository gets * loaded once per test case, then only one diff is recorded. */ - private static final Map<Class, DiffRepository> MAP_CLASS_TO_REPOSITORY = - new HashMap<>(); + private static final LoadingCache<Key, DiffRepository> REPOSITORY_CACHE = + CacheBuilder.newBuilder().build(CacheLoader.from(Key::toRepo)); //~ Instance fields -------------------------------------------------------- @@ -755,22 +758,11 @@ public class DiffRepository { * @param filter Filters each string returned by the repository * @return The diff repository shared between test cases in this class. */ - public static synchronized DiffRepository lookup( - Class clazz, + public static DiffRepository lookup(Class clazz, DiffRepository baseRepository, Filter filter) { - DiffRepository diffRepository = MAP_CLASS_TO_REPOSITORY.get(clazz); - if (diffRepository == null) { - final URL refFile = findFile(clazz, ".xml"); - final String refFilePath = Sources.of(refFile).file().getAbsolutePath(); - final File logFile = - new File(refFilePath.replace(".xml", "_actual.xml")); - assert !refFilePath.equals(logFile.getAbsolutePath()); - diffRepository = - new DiffRepository(refFile, logFile, baseRepository, filter); - MAP_CLASS_TO_REPOSITORY.put(clazz, diffRepository); - } - return diffRepository; + final Key key = new Key(clazz, baseRepository, filter); + return REPOSITORY_CACHE.getUnchecked(key); } /** @@ -794,4 +786,38 @@ public class DiffRepository { String text, String expanded); } + + /** Cache key. */ + private static class Key { + private final Class clazz; + private final DiffRepository baseRepository; + private final Filter filter; + + Key(Class clazz, DiffRepository baseRepository, Filter filter) { + this.clazz = Objects.requireNonNull(clazz); + this.baseRepository = baseRepository; + this.filter = filter; + } + + @Override public int hashCode() { + return Objects.hash(clazz, baseRepository, filter); + } + + @Override public boolean equals(Object obj) { + return this == obj + || obj instanceof Key + && clazz.equals(((Key) obj).clazz) + && Objects.equals(baseRepository, ((Key) obj).baseRepository) + && Objects.equals(filter, ((Key) obj).filter); + } + + DiffRepository toRepo() { + final URL refFile = findFile(clazz, ".xml"); + final String refFilePath = Sources.of(refFile).file().getAbsolutePath(); + final String logFilePath = refFilePath.replace(".xml", "_actual.xml"); + final File logFile = new File(logFilePath); + assert !refFilePath.equals(logFile.getAbsolutePath()); + return new DiffRepository(refFile, logFile, baseRepository, filter); + } + } }
