package hu.sztaki.ilab.longneck.process.block; import hu.sztaki.ilab.longneck.Field; import hu.sztaki.ilab.longneck.Record; import hu.sztaki.ilab.longneck.process.AbstractSourceInfoContainer; import hu.sztaki.ilab.longneck.process.CheckError; import hu.sztaki.ilab.longneck.process.VariableSpace; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.collections.map.LRUMap; /** Apply caching for translate block. */ public class TranslateCache extends AbstractSourceInfoContainer implements AtomicBlock { private int size = 100; //default size of cache private Translate translate; @SuppressWarnings("unchecked") // unchecked warning supressed /** key: block.applyTo[0]."["record.field.value"]" */ private Map<String, Field> cache = (Map<String, Field>) (Collections.synchronizedMap(new LRUMap(size))); public int getSize() { return size; } public void setSize(int size) { this.size = size; } public Translate getTranslate() { return translate; } public void setTranslate(Translate translate) { this.translate = translate; } public synchronized Field getCacheElement(String key) { return cache.get(key); } public synchronized void putCacheElement(String key, Field value) { cache.put(key, value); } @Override public void apply(Record record, VariableSpace parentScope) throws CheckError { String applyToName = translate.getApplyTo().get(0); //currently only the first one is considered String examine = BlockUtils.getValue(translate.getFrom(), record, parentScope); String key = asCacheKey(applyToName, examine); Field f = getCacheElement(key); if (f == null) { translate.apply(record, parentScope); putCacheElement(key, new Field(record.get(applyToName))); } else { for (String fName : translate.getApplyTo()) { BlockUtils.setValue(fName, f.getValue(), record, parentScope); } } } @Override public void setApplyTo(List<String> fieldNames) { // NOPMD } private String asCacheKey(String applyTo, String fieldValue) { StringBuilder sb = new StringBuilder(applyTo); sb.append(".["); sb.append(fieldValue); sb.append("]"); return sb.toString(); } @SuppressWarnings("unchecked") @Override public TranslateCache clone() { TranslateCache translateCache = (TranslateCache) super.clone(); translateCache.cache = (Map<String, Field>) (Collections.synchronizedMap(new LRUMap(size))); translateCache.translate = translate.clone(); return translateCache; } }