package com.lateensoft.pathfinder.toolkit.db.dao.table; import android.content.ContentValues; import android.content.Context; import com.google.common.collect.Lists; import com.lateensoft.pathfinder.toolkit.dao.DataAccessException; import com.lateensoft.pathfinder.toolkit.db.dao.OwnedObject; import com.lateensoft.pathfinder.toolkit.db.dao.OwnedWeakTableDAO; import com.lateensoft.pathfinder.toolkit.db.dao.Table; import com.lateensoft.pathfinder.toolkit.model.party.EncounterParticipant; import org.jetbrains.annotations.Nullable; import java.util.Hashtable; import java.util.List; public class EncounterParticipantDAO extends OwnedWeakTableDAO<Long, Long, EncounterParticipant> { public static final String TABLE = "EncounterParticipant"; private static final String ENCOUNTER_ID = "encounter_id"; private static final String CHARACTER_ID = "character_id"; private static final String INITIATIVE_SCORE = "InitiativeScore"; private static final String TURN_ORDER = "TurnOrder"; private CharacterModelDAO characterDAO; public EncounterParticipantDAO(Context context) { super(context); characterDAO = new CharacterModelDAO(context); } @Override protected Table initTable() { return new Table(TABLE, ENCOUNTER_ID, CHARACTER_ID, INITIATIVE_SCORE, TURN_ORDER); } @Override protected String getOwnerIdSelector(Long characterId) { return TABLE + "." + ENCOUNTER_ID + "=" + characterId; } @Override protected String getIdSelector(OwnedObject<Long, Long> rowId) { return andSelectors(getOwnerIdSelector(rowId.getOwnerId()), TABLE + "." + CHARACTER_ID + "=" + rowId.getObject()); } @Override @Nullable protected String getBaseSelector() { return String.format("%s.%s=%s.%s", TABLE, CHARACTER_ID, CharacterModelDAO.TABLE, CharacterModelDAO.CHARACTER_ID); } @Override protected List<String> getTablesForQuery() { return Lists.newArrayList(TABLE, CharacterModelDAO.TABLE); } @Override protected String[] getColumnsForQuery() { return getTable().union(characterDAO.getTable(), CHARACTER_ID, CharacterModelDAO.CHARACTER_ID); } @Override protected OwnedObject<Long, Long> getIdFromRowData(OwnedObject<Long, EncounterParticipant> rowData) { return new OwnedObject<Long, Long>(rowData.getOwnerId(), rowData.getObject().getId()); } @Override public OwnedObject<Long, Long> add(OwnedObject<Long, EncounterParticipant> rowData) throws DataAccessException { OwnedObject<Long, Long> id = null; boolean characterExists = characterDAO.exists(rowData.getObject().getId()); try { beginTransaction(); if (!characterExists) { characterDAO.add(rowData.getObject()); } id = super.add(rowData); setTransactionSuccessful(); } finally { endTransaction(); } return id; } @Override public void update(OwnedObject<Long, EncounterParticipant> rowData) throws DataAccessException { try { beginTransaction(); characterDAO.update(rowData.getObject()); super.update(rowData); setTransactionSuccessful(); } finally { endTransaction(); } } @Override protected ContentValues getContentValues(OwnedObject<Long, EncounterParticipant> rowData) { EncounterParticipant object = rowData.getObject(); ContentValues values = new ContentValues(); values.put(CHARACTER_ID, object.getId()); values.put(ENCOUNTER_ID, rowData.getOwnerId()); values.put(INITIATIVE_SCORE, object.getInitiativeScore()); values.put(TURN_ORDER, object.getTurnOrder()); return values; } @Override protected EncounterParticipant buildFromHashTable(Hashtable<String, Object> hashTable) { EncounterParticipant.Builder builder = new EncounterParticipant.Builder(); characterDAO.populateBuilderFromHashTable(hashTable, builder); populateBuilderFromHashTable(hashTable, builder); return builder.build(); } public void populateBuilderFromHashTable(Hashtable<String, Object> hashTable, EncounterParticipant.Builder builder) { builder.setInitiativeScore(((Long) hashTable.get(INITIATIVE_SCORE)).intValue()); builder.setTurnOrder(((Long) hashTable.get(TURN_ORDER)).intValue()); } }