package treehou.se.habit.util; import android.content.Context; import android.support.v4.util.Pair; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import io.realm.Realm; import rx.Observable; import rx.functions.Func1; import rx.schedulers.Schedulers; import se.treehou.ng.ohcommunicator.connector.models.OHServer; import se.treehou.ng.ohcommunicator.connector.models.OHSitemap; import se.treehou.ng.ohcommunicator.services.IServerHandler; import treehou.se.habit.core.db.model.OHRealm; import treehou.se.habit.core.db.model.ServerDB; import treehou.se.habit.core.db.model.SitemapDB; import treehou.se.habit.module.ServerLoaderFactory; public class DatabaseServerLoaderFactory implements ServerLoaderFactory { private OHRealm realm; private ConnectionFactory connectionFactory; @Inject public DatabaseServerLoaderFactory(OHRealm realm, ConnectionFactory connectionFactory) { this.realm = realm; this.connectionFactory = connectionFactory; } @Override public OHServer loadServer(Realm realm, long serverId) { return ServerDB.load(realm, serverId).toGeneric(); } @Override public Observable.Transformer<Realm, OHServer> loadServersRx() { return RxUtil.loadServers(); } /** * Fetches sitemaps from server. * @param context the used to fetch sitemaps. * @return */ public Observable.Transformer<OHServer, Pair<OHServer, List<OHSitemap>>> serverToSitemap(Context context) { return observable -> observable.flatMap(new Func1<OHServer, Observable<List<OHSitemap>>>() { @Override public Observable<List<OHSitemap>> call(OHServer server) { IServerHandler serverHandler = connectionFactory.createServerHandler(server, context); return serverHandler.requestSitemapObservable().subscribeOn(Schedulers.io()) .onErrorReturn(throwable -> new ArrayList<>()); } }, (server, sitemaps) -> { for (OHSitemap sitemap : sitemaps) { sitemap.setServer(server); } return new Pair<>(server, sitemaps); }).doOnNext(RxUtil.saveSitemap()); } public Observable.Transformer<Pair<OHServer,List<OHSitemap>>, Pair<OHServer,List<OHSitemap>>> filterDisplaySitemaps() { return observable -> observable.map(new Func1<Pair<OHServer, List<OHSitemap>>, Pair<OHServer, List<OHSitemap>>>() { @Override public Pair<OHServer, List<OHSitemap>> call(Pair<OHServer, List<OHSitemap>> ohServerListPair) { List<OHSitemap> sitemaps = new ArrayList<>(); for(OHSitemap sitemap : ohServerListPair.second){ SitemapDB sitemapDB = realm.realm().where(SitemapDB.class) .equalTo("name", sitemap.getName()) .equalTo("server.name", ohServerListPair.first.getName()) .findFirst(); if(sitemapDB == null || sitemapDB.getSettingsDB() == null || sitemapDB.getSettingsDB().isDisplay()){ sitemaps.add(sitemap); } } return new Pair<>(ohServerListPair.first, sitemaps); } }); } }