package com.badoo.barf.data.repo;
import android.support.annotation.NonNull;
import java.util.HashMap;
import java.util.Map;
import rx.Observable;
/**
* A delegating repository allows for mapping between query types and handlers for those queries. This can be done manually, but it's
* recommended that this class is used alongside the {@link com.badoo.barf.data.repo.annotations.Handles} annotation.
*
* @see com.badoo.barf.data.repo.annotations.Handles
* @see com.badoo.barf.data.repo.annotations.HandlesUtil
*/
public class DelegatingRepository<T> extends BaseRepository<T> {
public final Map<Class<?>, QueryHandler<?, ?>> mRegisteredHandlers = new HashMap<>();
/**
* Register a given query type against a handler.
*/
public <Result> void registerHandler(Class<Query<Result>> type, QueryHandler<Query<Result>, Result> handler) {
mRegisteredHandlers.put(type, handler);
}
@NonNull
@Override
protected <Result> Observable<Result> createObservable(@NonNull Query<Result> query) {
final QueryHandler handler = mRegisteredHandlers.get(query.getClass());
if (handler == null) {
throw new IllegalArgumentException(String.format("No handler is registered for query %s", query.getClass()));
}
// Safe due to check at #registerHandler
//noinspection unchecked
return handler.handleQuery(query);
}
public interface QueryHandler<Q extends Query, R> {
Observable<R> handleQuery(Q query);
}
}