package com.qubling.sidekick.search;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import com.qubling.sidekick.R;
import com.qubling.sidekick.fetch.Fetcher;
import com.qubling.sidekick.instance.Instance;
import com.qubling.sidekick.model.AuthorModel;
import com.qubling.sidekick.model.GravatarModel;
import com.qubling.sidekick.model.ModuleModel;
import com.qubling.sidekick.model.ReleaseModel;
import com.qubling.sidekick.search.Search.OnSearchActivity;
import android.app.Activity;
import android.util.Log;
public class Schema implements OnSearchActivity {
private static final String METACPAN_API_USER_AGENT_SUFFIX = " (Android)";
private static int schemaIdCounter = 0;
private final GravatarModel gravatarModel;
private final AuthorModel authorModel;
private final ReleaseModel releaseModel;
private final ModuleModel moduleModel;
private int schemaId;
private int runningSearches = 0;
private Activity activity;
private HttpClient httpClient;
public Schema(Activity activity) {
schemaId = ++schemaIdCounter;
gravatarModel = new GravatarModel(this);
authorModel = new AuthorModel(this);
releaseModel = new ReleaseModel(this);
moduleModel = new ModuleModel(this);
this.activity = activity;
}
private void setupHttpClient() {
try {
String userAgent = activity.getString(R.string.app_name)
+ "/"
+ activity.getString(R.string.app_version)
+ METACPAN_API_USER_AGENT_SUFFIX;
httpClient = (HttpClient) Class.forName("android.net.http.AndroidHttpClient")
.getMethod("newInstance", String.class).invoke(null, userAgent);
Log.i("HttpClientManager", "Using AndroidHttpClient");
}
catch (Throwable t) {
Log.i("HttpClientManager", "Falling back to DefaultHttpClient");
httpClient = new DefaultHttpClient();
}
}
public void closeHttpClient() {
try {
Class<?> androidHttpClient = Class.forName("android.net.http.AndroidHttpClient");
if (androidHttpClient.isInstance(httpClient)) {
Method close = androidHttpClient.getMethod("close");
close.invoke(httpClient);
}
}
catch (ClassNotFoundException e) {
// ignore
}
catch (NoSuchMethodException e) {
// ignore
}
catch (InvocationTargetException e) {
// ignore
}
catch (IllegalAccessException e) {
// ignore
}
httpClient = null;
}
public GravatarModel getGravatarModel() {
return gravatarModel;
}
public AuthorModel getAuthorModel() {
return authorModel;
}
public ReleaseModel getReleaseModel() {
return releaseModel;
}
public ModuleModel getModuleModel() {
return moduleModel;
}
public Activity getActivity() {
return activity;
}
public HttpClient getHttpClient() {
return httpClient;
}
public <SomeInstance extends Instance<SomeInstance>> Search<SomeInstance> doFetch(Fetcher<SomeInstance> fetcher, Fetcher.OnFinished<SomeInstance> listener) {
Search<SomeInstance> search = new Search<SomeInstance>(activity, fetcher, listener);
search.addOnSearchActivityListener(this);
return search;
}
@Override
public synchronized void onSearchStart() {
// Log.d("Schema", "onSearchStart()");
if (runningSearches == 0) setupHttpClient();
runningSearches++;
}
@Override
public synchronized void onSearchComplete() {
// Log.d("Schema", "onSearchComplete()");
runningSearches--;
if (runningSearches == 0) closeHttpClient();
}
@Override
public String toString() {
return "Session #" + schemaId;
}
}