blob: bec4501f7a5857b658c041f78d3a2ae0836d2259 [file] [log] [blame]
/**
*
*/
package org.unicode.cldr.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import org.unicode.cldr.test.CheckCLDR.Options;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRLocale;
import org.unicode.cldr.util.CLDRLocale.SublocaleProvider;
import org.unicode.cldr.util.XMLSource;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
/**
* @author srl
*
* Factory must implement CLDRLocale.SublocaleProvider
*/
public class SimpleTestCache extends TestCache {
private static final boolean DEBUG = false;
/**
* Hash the options map
*
* @param o
* @return
*/
private Cache<CheckCLDR.Options, TestResultBundle> cache = CacheBuilder.newBuilder().maximumSize(CLDRConfig.getInstance()
.getProperty("CLDR_TESTCACHE_SIZE", 12)).softValues().build();
/*
* (non-Javadoc)
*
* @see org.unicode.cldr.test.TestCache#notifyChange(org.unicode.cldr.util.CLDRLocale, java.lang.String)
*/
@Override
public void valueChanged(String xpath, XMLSource source) {
CLDRLocale locale = CLDRLocale.getInstance(source.getLocaleID());
valueChanged(xpath, locale);
}
private void valueChanged(String xpath, final CLDRLocale locale) {
if (DEBUG) System.err.println("BundDelLoc " + locale + " @ " + xpath);
for (CLDRLocale sub : ((SublocaleProvider) getFactory()).subLocalesOf(locale)) {
valueChanged(xpath, sub);
}
if (cache.asMap().isEmpty()) {
return;
}
// Filter the cache to only keep the items where the locale matches
List<Options> toRemove = new ArrayList<>();
for (Options k : cache.asMap().keySet()) {
if (k.getLocale().equals(locale)) {
toRemove.add(k);
}
}
if (!DEBUG) {
// no logging is done, simply invalidate all items
cache.invalidateAll(toRemove);
} else {
// avoid concurrent remove
for (CheckCLDR.Options k : toRemove) {
cache.invalidate(k);
System.err.println("BundDel " + k);
}
}
}
@Override
public String toString() {
StringBuilder stats = new StringBuilder();
stats.append("{" + this.getClass().getSimpleName() + super.toString() + " Size: " + cache.size() + " (");
int good = 0;
int total = 0;
for (Entry<Options, TestResultBundle> k : cache.asMap().entrySet()) {
Options key = k.getKey();
TestResultBundle bundle = k.getValue();
if (bundle != null) good++;
if (DEBUG && true) stats.append("," + k.getKey() + "=" + key);
total++;
}
stats.append(" " + good + "/" + total + "}");
return stats.toString();
}
@Override
public TestResultBundle getBundle(CheckCLDR.Options options) {
TestResultBundle b = cache.getIfPresent(options);
if (DEBUG && b != null) System.err.println("Bundle refvalid: " + options + " -> " + (b != null));
if (DEBUG) System.err.println("Bundle " + b + " for " + options + " in " + this.toString());
if (b == null) {
// ElapsedTimer et = new ElapsedTimer("New test bundle " + locale + " opt " + options);
b = new TestResultBundle(options);
// System.err.println(et.toString());
cache.put(options, b);
}
return b;
}
}