/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.gecko.sync.repositories.android; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.simple.JSONArray; import org.mozilla.gecko.sync.CommandProcessor.Command; import org.mozilla.gecko.sync.repositories.NullCursorException; import org.mozilla.gecko.sync.repositories.domain.ClientRecord; import android.content.Context; import android.database.Cursor; public class ClientsDatabaseAccessor { public static final String PROFILE_ID = "default"; // Generic profile id for now, until multiple profiles are implemented. public static final String LOG_TAG = "ClientsDatabaseAccessor"; private ClientsDatabase db; // Need this so we can properly stub out the class for testing. public ClientsDatabaseAccessor() {} public ClientsDatabaseAccessor(Context context) { db = new ClientsDatabase(context); } public void store(ClientRecord record) { db.store(getProfileId(), record); } public void store(Collection<ClientRecord> records) { for (ClientRecord record : records) { this.store(record); } } public void store(String accountGUID, Command command) throws NullCursorException { db.store(accountGUID, command.commandType, command.args.toJSONString()); } public ClientRecord fetchClient(String accountGUID) throws NullCursorException { final Cursor cur = db.fetchClientsCursor(accountGUID, getProfileId()); try { if (!cur.moveToFirst()) { return null; } return recordFromCursor(cur); } finally { cur.close(); } } public Map<String, ClientRecord> fetchAllClients() throws NullCursorException { final HashMap<String, ClientRecord> map = new HashMap<String, ClientRecord>(); final Cursor cur = db.fetchAllClients(); try { if (!cur.moveToFirst()) { return Collections.unmodifiableMap(map); } while (!cur.isAfterLast()) { ClientRecord clientRecord = recordFromCursor(cur); map.put(clientRecord.guid, clientRecord); cur.moveToNext(); } return Collections.unmodifiableMap(map); } finally { cur.close(); } } public List<Command> fetchAllCommands() throws NullCursorException { final List<Command> commands = new ArrayList<Command>(); final Cursor cur = db.fetchAllCommands(); try { if (!cur.moveToFirst()) { return Collections.unmodifiableList(commands); } while (!cur.isAfterLast()) { Command command = commandFromCursor(cur); commands.add(command); cur.moveToNext(); } return Collections.unmodifiableList(commands); } finally { cur.close(); } } public List<Command> fetchCommandsForClient(String accountGUID) throws NullCursorException { final List<Command> commands = new ArrayList<Command>(); final Cursor cur = db.fetchCommandsForClient(accountGUID); try { if (!cur.moveToFirst()) { return Collections.unmodifiableList(commands); } while(!cur.isAfterLast()) { Command command = commandFromCursor(cur); commands.add(command); cur.moveToNext(); } return Collections.unmodifiableList(commands); } finally { cur.close(); } } protected static ClientRecord recordFromCursor(Cursor cur) { String accountGUID = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_ACCOUNT_GUID); String clientName = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_NAME); String clientType = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_TYPE); ClientRecord record = new ClientRecord(accountGUID); record.name = clientName; record.type = clientType; return record; } protected static Command commandFromCursor(Cursor cur) { String commandType = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_COMMAND); JSONArray commandArgs = RepoUtils.getJSONArrayFromCursor(cur, ClientsDatabase.COL_ARGS); return new Command(commandType, commandArgs); } public int clientsCount() { try { final Cursor cur = db.fetchAllClients(); try { return cur.getCount(); } finally { cur.close(); } } catch (NullCursorException e) { return 0; } } private String getProfileId() { return ClientsDatabaseAccessor.PROFILE_ID; } public void wipeDB() { db.wipeDB(); } public void wipeClientsTable() { db.wipeClientsTable(); } public void wipeCommandsTable() { db.wipeCommandsTable(); } public void close() { db.close(); } }