package org.wikipedia.database.async; import android.content.ContentValues; import android.database.Cursor; import android.support.annotation.NonNull; import org.wikipedia.database.DbUtil; import org.wikipedia.database.column.CodeEnumColumn; import org.wikipedia.database.column.IdColumn; import org.wikipedia.database.column.LongColumn; import org.wikipedia.database.column.StrColumn; import org.wikipedia.model.CodeEnum; import org.wikipedia.model.EnumCode; public abstract class AsyncColumns<Status extends EnumCode, Dat, Row extends AsyncRow<Status, Dat>> { @NonNull private final IdColumn id; /** A key used to uniquely identify a row and often to associate a row with a row in another * table. No constraints are made on referent keys except that they must be nonnull unique. */ @NonNull private final StrColumn key; /** The status code indicating an outstanding transaction. */ @NonNull private final CodeEnumColumn<Status> status; /** The timestamp for the last successful transaction in milliseconds or * {@link AsyncConstant#NO_TIMESTAMP} for never transacted. */ @NonNull private final LongColumn timestamp; /** A unique identification for a transaction in progress or * {@link AsyncConstant#NO_TRANSACTION_ID} for not in progress. */ @NonNull private final LongColumn transactionId; @NonNull private final String[] selection; @NonNull private final String[] content; public AsyncColumns(@NonNull String tbl, @NonNull String namePrefix, @NonNull CodeEnum<Status> codeEnum) { id = new IdColumn(tbl); key = new StrColumn(tbl, namePrefix + "Key", "text not null unique"); status = new CodeEnumColumn<>(tbl, namePrefix + "Status", codeEnum); timestamp = new LongColumn(tbl, namePrefix + "Timestamp", "integer not null"); transactionId = new LongColumn(tbl, namePrefix + "TransactionId", "integer not null"); selection = DbUtil.qualifiedNames(key); content = DbUtil.qualifiedNames(key, status, timestamp, transactionId); } @NonNull public IdColumn id() { return id; } @NonNull public StrColumn key() { return key; } @NonNull public CodeEnumColumn<Status> status() { return status; } @NonNull public LongColumn timestamp() { return timestamp; } @NonNull public LongColumn transactionId() { return transactionId; } @NonNull public String[] selection() { return selection; } @NonNull public String[] content() { return content; } @NonNull public String key(@NonNull Cursor cursor) { return key.val(cursor); } @NonNull public Status status(@NonNull Cursor cursor) { return status.val(cursor); } public long timestamp(@NonNull Cursor cursor) { return timestamp.val(cursor); } public long transactionId(@NonNull Cursor cursor) { return transactionId.val(cursor); } @NonNull public ContentValues toContentValues(@NonNull Row row) { ContentValues values = new ContentValues(); values.put(key.getName(), row.key()); values.put(status.getName(), row.statusCode()); values.put(timestamp.getName(), row.timestamp()); values.put(transactionId.getName(), row.transactionId()); return values; } public abstract Row val(@NonNull Cursor cursor); }