package io.datakernel.cube.attributes; import io.datakernel.async.CompletionCallback; import io.datakernel.async.ForwardingCompletionCallback; import java.util.List; import java.util.Map; public abstract class AbstractAttributeResolver<K, A> implements AttributeResolver { @Override public abstract Class<?>[] getKeyTypes(); protected abstract K toKey(Object[] keyArray); @Override public abstract Map<String, Class<?>> getAttributeTypes(); protected abstract Object[] toAttributes(A attributes); protected abstract A resolveAttributes(K key); protected void prepareToResolveAttributes(List<Object> results, KeyFunction keyFunction, AttributesFunction attributesFunction, CompletionCallback callback) { doResolveAttributes(results, keyFunction, attributesFunction, callback); } private void doResolveAttributes(List<Object> results, KeyFunction keyFunction, AttributesFunction attributesFunction, CompletionCallback callback) { for (Object result : results) { K key = toKey(keyFunction.extractKey(result)); A attributes = resolveAttributes(key); if (attributes != null) { attributesFunction.applyAttributes(result, toAttributes(attributes)); } } callback.postComplete(); } @Override public final void resolveAttributes(final List<Object> results, final KeyFunction keyFunction, final AttributesFunction attributesFunction, final CompletionCallback callback) { prepareToResolveAttributes(results, keyFunction, attributesFunction, new ForwardingCompletionCallback(callback) { @Override protected void onComplete() { doResolveAttributes(results, keyFunction, attributesFunction, callback); } }); } }