package com.bootstrap.storage; import com.bootstrap.storage.util.JsonUtils; import com.couchbase.lite.CouchbaseLiteException; import com.couchbase.lite.Database; import com.couchbase.lite.Document; import com.couchbase.lite.UnsavedRevision; import com.fasterxml.jackson.databind.ObjectMapper; import net.tribe7.common.base.Joiner; import java.util.Map; import rx.Observable; import rx.Subscriber; public abstract class BaseRepository<T> { protected final Database database; protected final ObjectMapper objectMapper; private final Class<T> clazz; public BaseRepository(final Database database, final ObjectMapper objectMapper, final Class<T> clazz) { this.database = database; this.objectMapper = objectMapper; this.clazz = clazz; } public Observable<T> loadByKey(final String key) { return Observable.create(new Observable.OnSubscribe<T>() { @Override public void call(final Subscriber<? super T> subscriber) { final Document document = database.getExistingDocument(createPrefixedKey(key)); if (document != null) { final T item = objectMapper.convertValue(document.getProperties(), clazz); subscriber.onNext(item); } subscriber.onCompleted(); } }); } public Observable<T> save(final String key, final T item) { return Observable.create(new Observable.OnSubscribe<T>() { @Override public void call(final Subscriber<? super T> subscriber) { final Document document = database.getDocument(createPrefixedKey(key)); try { final Map<String, Object> properties = objectMapper.convertValue(item, JsonUtils.MAP_TYPE_REFERENCE); document.update(new Document.DocumentUpdater() { @Override public boolean update(final UnsavedRevision newRevision) { newRevision.getProperties().putAll(properties); return true; } }); subscriber.onNext(item); subscriber.onCompleted(); } catch (CouchbaseLiteException e) { subscriber.onError(e); } } }); } public Observable<Boolean> delete(final String key) { return Observable.create(new Observable.OnSubscribe<Boolean>() { @Override public void call(final Subscriber<? super Boolean> subscriber) { try { final Document document = database.getDocument(createPrefixedKey(key)); if (document.getCurrentRevision() != null) { subscriber.onNext(document.delete()); } else { subscriber.onNext(false); } subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } } }); } protected String createPrefixedKey(final String key) { return Joiner.on(":").skipNulls().join(getPrefix(), key); } protected abstract String getPrefix(); }