package org.ohmage.db.test; public abstract class MockArrayCursor<T> extends EmptyMockCursor { protected static final int COLUMN_IGNORE = -1; private final T[] mObjects; private int mPointer = -1; private String[] mProjection; public MockArrayCursor(String[] projection, T... objects) { mProjection = projection; mObjects = objects; } @Override public int getCount() { if(mObjects == null) return 0; return mObjects.length; } @Override public boolean moveToFirst() { mPointer = 0; return true; } @Override public boolean moveToNext() { mPointer++; return pointerValid(); } @Override public boolean isAfterLast() { return mPointer >= getCount(); } @Override public boolean moveToPosition(int position) { mPointer = position; return pointerValid(); } private boolean pointerValid() { return mPointer < getCount() && mPointer >= 0; } public void setProjection(String[] projection) { mProjection = projection; } protected T getObject() { if(pointerValid()) return mObjects[mPointer]; return null; } @Override public final int getColumnIndex(String columnName) { columnName = getColumnString(columnName); if(mProjection == null) return getLocalColumnIndex(columnName); for(int i=0;i<mProjection.length;i++) if(mProjection[i].equals(columnName) || mProjection[i].endsWith("."+columnName)) return i; return COLUMN_IGNORE; } /** * Gets the column index without a projection * @param columnName * @return */ protected abstract int getLocalColumnIndex(String columnName); /** * If there is a projection set, this function maps the column index to * the index that I expect if there is no projection * @param columnIndex * @return */ private int mapColumnIndex(int columnIndex) { if(mProjection != null) return getLocalColumnIndex(getColumnString(mProjection[columnIndex])); return columnIndex; } private String getColumnString(String columnName) { if(columnName.contains(".")) { return columnName.split("\\.")[1]; } return columnName; } @Override public long getLong(int columnIndex) { columnIndex = mapColumnIndex(columnIndex); if(getObject() != null) { return getLongValid(columnIndex); } return getLongDefault(columnIndex); } protected abstract long getLongValid(int columnIndex); protected long getLongDefault(int columnIndex) { return 0; } @Override public double getDouble(int columnIndex) { columnIndex = mapColumnIndex(columnIndex); if(getObject() != null) return getDoubleValid(columnIndex); return getDoubleDefault(columnIndex); } protected abstract double getDoubleValid(int columnIndex); protected double getDoubleDefault(int columnIndex) { return 0.0; } @Override public String getString(int columnIndex) { columnIndex = mapColumnIndex(columnIndex); if(getObject() != null) return getStringValid(columnIndex); return getStringDefault(columnIndex); } protected abstract String getStringValid(int columnIndex); protected String getStringDefault(int columnIndex) { return ""; } @Override public float getFloat(int columnIndex) { columnIndex = mapColumnIndex(columnIndex); if(getObject() != null) return getFloatValid(columnIndex); return getFloatDefault(columnIndex); } protected abstract float getFloatValid(int columnIndex); protected float getFloatDefault(int columnIndex) { return 0.0f; } @Override public int getInt(int columnIndex) { columnIndex = mapColumnIndex(columnIndex); if(getObject() != null) return getIntValid(columnIndex); return getIntDefault(columnIndex); } protected abstract int getIntValid(int columnIndex); protected int getIntDefault(int columnIndex) { return 0; } }