package org.wikipedia.database.async; import android.support.annotation.NonNull; import org.wikipedia.database.BaseDao; import org.wikipedia.database.DatabaseClient; import org.wikipedia.model.EnumCode; import java.util.Collection; public abstract class AsyncDao<Status extends EnumCode, Dat, Row extends AsyncRow<Status, Dat>> extends BaseDao<Row> { protected AsyncDao(@NonNull DatabaseClient<Row> client) { super(client); } public void startTransaction(@NonNull Collection<Row> rows) { for (Row row : rows) { startTransaction(row); } } public void completeTransaction(@NonNull Row row) { long timestamp = System.currentTimeMillis(); completeTransaction(row, timestamp); } /** @return true if completable. */ public synchronized boolean completeTransaction(@NonNull Row row, long timestamp) { if (completableTransaction(row)) { row.completeTransaction(timestamp); return true; } return false; } public void failTransaction(@NonNull Collection<Row> rows) { for (Row row : rows) { failTransaction(row); } } protected void resetTransaction(@NonNull Row row, @NonNull Status status) { row.resetTransaction(status); upsert(row); } protected void startTransaction(@NonNull Row row) { row.startTransaction(); upsert(row); } protected synchronized void failTransaction(@NonNull Row row) { if (completableTransaction(row)) { row.failTransaction(); upsert(row); } } private boolean completableTransaction(@NonNull Row row) { Row query = queryPrimaryKey(row); return row.completable(query); } }