package co.smartreceipts.android.persistence.database.tables.adapters; import android.content.ContentValues; import android.database.Cursor; import android.support.annotation.NonNull; import com.google.common.base.Preconditions; import co.smartreceipts.android.model.Column; import co.smartreceipts.android.model.ColumnDefinitions; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.model.factory.ColumnBuilderFactory; import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata; import co.smartreceipts.android.persistence.database.operations.OperationFamilyType; import co.smartreceipts.android.persistence.database.tables.keys.PrimaryKey; import co.smartreceipts.android.sync.model.SyncState; /** * Implements the {@link DatabaseAdapter} contract for the {@link co.smartreceipts.android.persistence.database.tables.AbstractColumnTable} * for CSVs and PDFs */ public final class ColumnDatabaseAdapter implements DatabaseAdapter<Column<Receipt>, PrimaryKey<Column<Receipt>, Integer>> { private final ColumnDefinitions<Receipt> mReceiptColumnDefinitions; private final String mIdColumnName; private final String mTypeColumnName; private final SyncStateAdapter mSyncStateAdapter; public ColumnDatabaseAdapter(@NonNull ColumnDefinitions<Receipt> receiptColumnDefinitions, @NonNull String idColumnName, @NonNull String typeColumnName) { this(receiptColumnDefinitions, idColumnName, typeColumnName, new SyncStateAdapter()); } public ColumnDatabaseAdapter(@NonNull ColumnDefinitions<Receipt> receiptColumnDefinitions, @NonNull String idColumnName, @NonNull String typeColumnName, @NonNull SyncStateAdapter syncStateAdapter) { mReceiptColumnDefinitions = Preconditions.checkNotNull(receiptColumnDefinitions); mIdColumnName = Preconditions.checkNotNull(idColumnName); mTypeColumnName = Preconditions.checkNotNull(typeColumnName); mSyncStateAdapter = Preconditions.checkNotNull(syncStateAdapter); } @NonNull @Override public Column<Receipt> read(@NonNull Cursor cursor) { final int idIndex = cursor.getColumnIndex(mIdColumnName); final int typeIndex = cursor.getColumnIndex(mTypeColumnName); final int id = cursor.getInt(idIndex); final String type = cursor.getString(typeIndex); final SyncState syncState = mSyncStateAdapter.read(cursor); return new ColumnBuilderFactory<>(mReceiptColumnDefinitions).setColumnId(id).setColumnName(type).setSyncState(syncState).build(); } @NonNull @Override public ContentValues write(@NonNull Column<Receipt> column, @NonNull DatabaseOperationMetadata databaseOperationMetadata) { final ContentValues values = new ContentValues(); values.put(mTypeColumnName, column.getName()); if (databaseOperationMetadata.getOperationFamilyType() == OperationFamilyType.Sync) { values.putAll(mSyncStateAdapter.write(column.getSyncState())); } else { values.putAll(mSyncStateAdapter.writeUnsynced(column.getSyncState())); } return values; } @NonNull @Override public Column<Receipt> build(@NonNull Column<Receipt> column, @NonNull PrimaryKey<Column<Receipt>, Integer> primaryKey, @NonNull DatabaseOperationMetadata databaseOperationMetadata) { return new ColumnBuilderFactory<>(mReceiptColumnDefinitions).setColumnId(primaryKey.getPrimaryKeyValue(column)).setColumnName(column.getName()).setSyncState(mSyncStateAdapter.get(column.getSyncState(), databaseOperationMetadata)).build(); } }