package com.qubling.sidekick.fetch;
import java.util.HashSet;
import java.util.Set;
import org.apache.http.client.HttpClient;
import com.qubling.sidekick.instance.Instance;
import com.qubling.sidekick.model.Model;
import com.qubling.sidekick.search.ResultSet;
import com.qubling.sidekick.search.Results;
import com.qubling.sidekick.search.ResultsForUpdate;
import com.qubling.sidekick.search.Schema;
import android.app.Activity;
import android.content.Context;
public abstract class AbstractFetcher<SomeInstance extends Instance<SomeInstance>> implements Fetcher<SomeInstance> {
public static class OnFinishedUi<SomeInstance extends Instance<SomeInstance>> implements OnFinished<SomeInstance> {
private final Activity activity;
private final OnFinished<SomeInstance> listener;
public OnFinishedUi(Activity activity, OnFinished<SomeInstance> listener) {
this.activity = activity;
this.listener = listener;
}
public void onFinishedFetch(final Fetcher<SomeInstance> fetcher, final ResultSet<SomeInstance> results) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onFinishedFetch(fetcher, results);
}
});
}
}
private Set<OnFinished<SomeInstance>> onFinishedListeners;
private ResultSet<SomeInstance> results;
private Model<SomeInstance> model;
public AbstractFetcher(Model<SomeInstance> model) {
this.onFinishedListeners = new HashSet<OnFinished<SomeInstance>>();
this.model = model;
}
public Model<SomeInstance> getModel() {
return model;
}
public Schema getSchema() {
return model.getSchema();
}
protected void setResultSet(ResultSet<SomeInstance> inputResults) {
// Log.d("AbstractFetcher", "setResultSet() " + inputResults);
this.results = inputResults;
}
public ResultSet<SomeInstance> getResultSet() {
if (results == null)
results = new Results<SomeInstance>();
return results;
}
protected Context getContext() {
return model.getSchema().getActivity();
}
public void addOnFinishedListener(OnFinished<SomeInstance> onCompleteListener) {
onFinishedListeners.add(onCompleteListener);
}
public void addOnFinishedListenerUi(Activity activity, OnFinished<SomeInstance> listener) {
onFinishedListeners.add(new OnFinishedUi<SomeInstance>(activity, listener));
}
public void removeOnFinishedListener(OnFinished<SomeInstance> onCompleteListener) {
onFinishedListeners.remove(onCompleteListener);
}
public void notifyOnFinished() {
ResultSet<SomeInstance> results = getResultSet();
for (OnFinished<SomeInstance> listener : onFinishedListeners) {
listener.onFinishedFetch(this, results);
}
}
public final void run() {
// Log.d("AbstractFetcher", "START call()");
execute();
notifyOnFinished();
// Log.d("AbstractFetcher", "END call()");
}
protected abstract void execute();
protected HttpClient getHttpClient() {
return getSchema().getHttpClient();
}
@SuppressWarnings("unchecked")
protected SerialUpdateFetcher<SomeInstance> thenDoFetch(UpdateFetcher<SomeInstance> updateFetcher) {
SerialUpdateFetcher<SomeInstance> serialFetcher = new SerialUpdateFetcher<SomeInstance>(getModel(), (UpdateFetcher<SomeInstance>) this);
updateFetcher.setIncomingResultSet(
new ResultsForUpdate<SomeInstance>(updateFetcher, getResultSet()));
return serialFetcher.thenDoFetch(updateFetcher);
}
@Override
public String toString() {
return model + ":AbstractFetcher()";
}
}