package by.istin.android.xcore.processor.impl; import by.istin.android.xcore.gson.ContentValuesAdapter; import by.istin.android.xcore.source.DataSourceRequest; import by.istin.android.xcore.source.IDataSource; import by.istin.android.xcore.utils.IOUtils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonIOException; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public abstract class AbstractGsonProcessor<Result> extends AbstractGsonDBProcessor<Result, InputStream>{ private final Class<?> clazz; private final Class<? extends Result> resultClassName; private final Gson gson; private ContentValuesAdapter contentValuesAdapter; public AbstractGsonProcessor(Class<? extends Result> resultClassName) { this(null, resultClassName, null); } public AbstractGsonProcessor(Class<?> clazz, Class<? extends Result> resultClassName) { this(clazz, resultClassName, new ContentValuesAdapter(clazz)); } public AbstractGsonProcessor(Class<?> clazz, Class<? extends Result> resultClassName, ContentValuesAdapter contentValuesAdapter) { super(); this.clazz = clazz; this.resultClassName = resultClassName; if (clazz == null) { gson = new GsonBuilder().create(); } else { this.contentValuesAdapter = contentValuesAdapter; gson = createGsonWithContentValuesAdapter(contentValuesAdapter); } } @Override public Result execute(DataSourceRequest dataSourceRequest, IDataSource<InputStream> dataSource, InputStream inputStream) throws Exception { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader, 8192); try { return process(getGson(), bufferedReader); } catch (JsonIOException exception){ throw new IOException(exception); } finally { IOUtils.close(inputStream); IOUtils.close(inputStreamReader); IOUtils.close(bufferedReader); } } protected Result process(Gson gson, BufferedReader bufferedReader) { return getGson().fromJson(bufferedReader, resultClassName); } public ContentValuesAdapter getContentValuesAdapter() { return contentValuesAdapter; } public void setContentValuesAdapter(ContentValuesAdapter contentValuesAdaper) { this.contentValuesAdapter = contentValuesAdaper; } public Class<?> getClazz() { return clazz; } public Gson getGson() { return gson; } }