package org.aksw.jena_sparql_api.lookup; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import com.google.common.base.Function; public class LookupServiceTransformKey<KI, KO, V> implements LookupService<KI, V> { private LookupService<KO, V> delegate; private Function<KI, KO> keyMapper; public LookupServiceTransformKey(LookupService<KO, V> delegate, Function<KI, KO> keyMapper) { super(); this.delegate = delegate; this.keyMapper = keyMapper; } @Override public Map<KI, V> apply(Iterable<KI> keys) { Map<KO, KI> keyMap = new LinkedHashMap<KO, KI>(); for(KI ki : keys) { KO ko = keyMapper.apply(ki); keyMap.put(ko, ki); } Map<KO, V> tmp = delegate.apply(keyMap.keySet()); Map<KI, V> result = new LinkedHashMap<KI, V>(); for(Entry<KO, V> entry : tmp.entrySet()) { KO ko = entry.getKey(); V v = entry.getValue(); boolean isMapped = keyMap.containsKey(ko); if(!isMapped) { throw new RuntimeException("should not happen"); } KI ki = keyMap.get(ko); result.put(ki, v); } return result; } public static <KI, KO, V> LookupServiceTransformKey<KI, KO, V> create(LookupService<KO, V> base, Function<KI, KO> keyMapper) { LookupServiceTransformKey<KI, KO, V> result = new LookupServiceTransformKey<KI, KO, V>(base, keyMapper); return result; } }