package com.nilhcem.bblfr.jobs.splashscreen.importdata; import android.text.TextUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.nilhcem.bblfr.core.prefs.Preferences; import com.nilhcem.bblfr.model.JsonToDatabaseDao; import java.io.IOException; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import rx.Observable; import timber.log.Timber; public abstract class BaseImport<T> { protected final Preferences mPrefs; private final Class<T> mClazz; private final OkHttpClient mClient; private final ObjectMapper mMapper; private final JsonToDatabaseDao<T> mDao; public BaseImport(Preferences prefs, OkHttpClient client, ObjectMapper mapper, JsonToDatabaseDao<T> dao, Class<T> clazz) { mPrefs = prefs; mClient = client; mMapper = mapper; mDao = dao; mClazz = clazz; } public Observable<Boolean> importData() { return getProperJson(getUrl()).map(this::convertToJsonData).map(this::saveToDatabase); } protected abstract String getUrl(); private Observable<String> getProperJson(String url) { return Observable.fromCallable(() -> { String json = null; Request request = new Request.Builder() .url(url) .build(); Response response; try { response = mClient.newCall(request).execute(); // Response starts with "var data = {", which we should remove. json = response.body().string().replaceFirst("[^{]*", ""); } catch (IOException e) { Timber.e(e, "Error importing baggers"); } return json; }); } T convertToJsonData(String json) { T jsonData = null; if (!TextUtils.isEmpty(json)) { try { jsonData = mMapper.readValue(json, mClazz); } catch (IOException e) { Timber.e(e, "Error converting to a json object"); } } return jsonData; } protected Boolean saveToDatabase(T data) { Boolean success = Boolean.FALSE; if (mPrefs.shouldResetData()) { mDao.deleteExistingData(); } if (data != null) { mDao.saveJsonToDatabase(data); success = Boolean.TRUE; } return success; } }