package com.qubling.sidekick.fetch.cpan; import java.io.IOException; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import com.qubling.sidekick.fetch.SerialUpdateFetcher; import com.qubling.sidekick.fetch.UpdateFetcher; import com.qubling.sidekick.instance.Instance; import com.qubling.sidekick.model.Model; import com.qubling.sidekick.search.ResultsForUpdate; import com.qubling.sidekick.util.HttpUtils; import android.util.Log; public abstract class CPANDirectFetcher<SomeInstance extends Instance<SomeInstance>> extends CPANFetcher<SomeInstance> implements UpdateFetcher<SomeInstance> { /** * An enumeration of direct retrieval URLs on MetaCPAN. * * @author sterling * */ public enum FetchSection { MODULE_POD(METACPAN_API_POD_URL), MODULE_FETCH(METACPAN_API_MODULE_URL), RELEASE_FETCH(METACPAN_API_RELEASE_URL); private String baseUrl; FetchSection(String baseUrl) { this.baseUrl = baseUrl; } public String getBaseUrl() { return baseUrl; } } private FetchSection fetchSection; public CPANDirectFetcher(Model<SomeInstance> model, FetchSection fetchSection) { super(model); this.fetchSection = fetchSection; } @Override protected void execute() { // Log.d("CPANDirectFetcher", "START execute()"); for (SomeInstance instance : getResultSet()) { fetchOne(instance); } // Log.d("CPANDirectFetcher", "END execute()"); } protected String getRemainderUrl(SomeInstance instance) { return instance.getKey(); } protected void fetchOne(SomeInstance instance) { String fetchContent; try { HttpGet fetchRequest = new HttpGet(fetchSection.getBaseUrl() + getRemainderUrl(instance)); HttpResponse fetchResponse = getHttpClient().execute(fetchRequest); fetchContent = HttpUtils.slurpContent(fetchResponse); consumeResponse(fetchContent, instance); } catch (IOException e) { Log.e("CPANDirectFetcher", "Cannot fetch from " + fetchSection.getBaseUrl() + instance.getKey() + ": " + e.getMessage(), e); } } public abstract void consumeResponse(String content, SomeInstance instance); @Override public void setIncomingResultSet(ResultsForUpdate<SomeInstance> input) { setResultSet(input); } public FetchSection getFetchSection() { return fetchSection; } @Override public String toString() { return getModel() + ":CPANDirectFetcher(" + fetchSection + ";" + getResultSet() + ")"; } @Override public SerialUpdateFetcher<SomeInstance> thenDoFetch(UpdateFetcher<SomeInstance> fetcher) { return super.thenDoFetch(fetcher); } }