class HBaseDataStore implements DataStore {

    @Override
    public Document get(final Table table, String id) throws DataStoreException {
        HTableInterface hTable = null;
        try {
            Get get = new Get(Bytes.toBytes(id + ":" + table.getName()))
                    .addColumn(COLUMN_FAMILY, DATA_FIELD_NAME)
                    .addColumn(COLUMN_FAMILY, TIMESTAMP_FIELD_NAME);
            hTable = tableWrapper.getTable(table);
            Result getResult = hTable.get(get);
            if (!getResult.isEmpty()) {
                byte[] data = getResult.getValue(COLUMN_FAMILY, DATA_FIELD_NAME);
                byte[] timestamp = getResult.getValue(COLUMN_FAMILY, TIMESTAMP_FIELD_NAME);
                long time = Bytes.toLong(timestamp);
                return new Document(id, time, mapper.readTree(data));
            } else {
                throw new DataStoreException(DataStoreException.ErrorCode.STORE_NO_DATA_FOUND_FOR_ID,
                        String.format("No data found for ID: %s", id));
            }
        } catch (DataStoreException ex) {
            throw ex;
        } catch (IOException ex) {
            throw new DataStoreException(DataStoreException.ErrorCode.STORE_SINGLE_GET,
                    ex.getMessage(), ex);
        } catch (Exception ex) {
            throw new DataStoreException(DataStoreException.ErrorCode.STORE_SINGLE_GET,
                    ex.getMessage(), ex);
        } finally {
            if (null != hTable) {
                try {
                    hTable.close();
                } catch (IOException e) {
                    logger.error("Error closing table: ", e);
                }
            }
        }
    }

    public  HBaseDataStore(HbaseTableConnection tableWrapper, ObjectMapper mapper);

}