package com.tevinjeffrey.rmp.common; import com.tevinjeffrey.rmp.client.RMPClient; import com.tevinjeffrey.rmp.scraper.RMPScraper; import rx.Observable; import rx.Subscriber; import rx.functions.Func1; import rx.schedulers.Schedulers; public class RMP { private final RMPClient mRMPClient; private final RMPScraper mRMPScraper; public static final String RMP_BASE_URL = "http://www.ratemyprofessors.com"; public RMP(RMPClient mRMPClient, RMPScraper mRMPScraper) { this.mRMPClient = mRMPClient; this.mRMPScraper = mRMPScraper; } public Observable<Professor> getProfessor(final Parameter params) { Observable<Professor> professorFromClient = mRMPClient.findProfessor(params) //Since this is first in the chain, don't try an error just yet. .onErrorResumeNext(Observable.<Professor>empty()) .subscribeOn(Schedulers.io()); Observable<Professor> professorFromScraper = mRMPScraper.findBestProfessor(params) .subscribeOn(Schedulers.io()); return Observable.concat(professorFromClient, professorFromScraper) .takeFirst(new Func1<Professor, Boolean>() { @Override public Boolean call(Professor professor) { return true; } }) .filter(new Func1<Professor, Boolean>() { @Override public Boolean call(Professor professor) { return professor != null; } }); } }