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.PaymentMethod; import co.smartreceipts.android.model.factory.PaymentMethodBuilderFactory; import co.smartreceipts.android.persistence.database.operations.DatabaseOperationMetadata; import co.smartreceipts.android.persistence.database.operations.OperationFamilyType; import co.smartreceipts.android.persistence.database.tables.PaymentMethodsTable; 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.PaymentMethodsTable} */ public final class PaymentMethodDatabaseAdapter implements DatabaseAdapter<PaymentMethod, PrimaryKey<PaymentMethod, Integer>> { private final SyncStateAdapter mSyncStateAdapter; public PaymentMethodDatabaseAdapter() { this(new SyncStateAdapter()); } public PaymentMethodDatabaseAdapter(@NonNull SyncStateAdapter syncStateAdapter) { mSyncStateAdapter = Preconditions.checkNotNull(syncStateAdapter); } @NonNull @Override public PaymentMethod read(@NonNull Cursor cursor) { final int idIndex = cursor.getColumnIndex(PaymentMethodsTable.COLUMN_ID); final int methodIndex = cursor.getColumnIndex(PaymentMethodsTable.COLUMN_METHOD); final int id = cursor.getInt(idIndex); final String method = cursor.getString(methodIndex); final SyncState syncState = mSyncStateAdapter.read(cursor); return new PaymentMethodBuilderFactory().setId(id).setMethod(method).setSyncState(syncState).build(); } @NonNull @Override public ContentValues write(@NonNull PaymentMethod paymentMethod, @NonNull DatabaseOperationMetadata databaseOperationMetadata) { final ContentValues values = new ContentValues(); values.put(PaymentMethodsTable.COLUMN_METHOD, paymentMethod.getMethod()); if (databaseOperationMetadata.getOperationFamilyType() == OperationFamilyType.Sync) { values.putAll(mSyncStateAdapter.write(paymentMethod.getSyncState())); } else { values.putAll(mSyncStateAdapter.writeUnsynced(paymentMethod.getSyncState())); } return values; } @NonNull @Override public PaymentMethod build(@NonNull PaymentMethod paymentMethod, @NonNull PrimaryKey<PaymentMethod, Integer> primaryKey, @NonNull DatabaseOperationMetadata databaseOperationMetadata) { return new PaymentMethodBuilderFactory().setId(primaryKey.getPrimaryKeyValue(paymentMethod)).setMethod(paymentMethod.getMethod()).setSyncState(mSyncStateAdapter.get(paymentMethod.getSyncState(), databaseOperationMetadata)).build(); } }