/* * CDDL HEADER START * * The contents of this file are subject to the terms of the Common Development * and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at * src/com/vodafone360/people/VODAFONE.LICENSE.txt or * http://github.com/360/360-Engine-for-Android * See the License for the specific language governing permissions and * limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each file and * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the fields * enclosed by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved. * Use is subject to license terms. */ package com.vodafone360.people.database.tables; import java.util.ArrayList; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import com.vodafone360.people.database.DatabaseHelper; import com.vodafone360.people.database.SQLKeys; import com.vodafone360.people.engine.presence.NetworkPresence; import com.vodafone360.people.utils.CloseUtils; import com.vodafone360.people.utils.StringBufferPool; /** * MePresenceCacheTable * * This table is used to store cached Availability/Presence for the Me Contact. * Storing this information ensures that the appropriate values are used when, for example, * regaining connectivity. * * @throws SQLException is thrown when request to create the table fails with an * SQLException * @throws NullPointerException if the passed in database instance is null */ public abstract class MePresenceCacheTable { /** * The name of the table as it appears in the database. */ public static final String TABLE_NAME = "MePresenceCache"; /** * The primary key column String value. */ private static final String ID_STRING = "id"; /** * The User ID column String value. */ private static final String USER_ID_STRING = "UserId"; /** * The Network ID column String value. */ private static final String NETWORK_ID_STRING = "NetworkId"; /** * The Status column String value. */ private static final String STATUS_STRING = "Status"; /** * The User ID column index value. */ private static final int USER_ID = 1; /** * The Network ID column index value. */ private static final int NETWORK_ID = 2; /** * The Network ID column index value. */ private static final int STATUS = 3; /** * The default message for the NullPointerException caused by the null * instance of database passed into PresenceCacheTable methods. */ private static final String DEFAULT_ERROR_MESSAGE = "MePresenceCacheTable: the passed in database is null!"; /** * This method creates the PresenceTable. * * @param writableDb - the writable database * @throws SQLException is thrown when request to create a table fails with * an SQLException * @throws NullPointerException if the passed in database instance is null */ public static void create(SQLiteDatabase writableDb) throws SQLException, NullPointerException { DatabaseHelper.trace(true, "PresenceCacheTable.create()"); if (writableDb == null) { throw new NullPointerException(DEFAULT_ERROR_MESSAGE); } final StringBuffer sb = new StringBuffer(); sb.append("CREATE TABLE IF NOT EXISTS "); sb.append(TABLE_NAME); sb.append(" ("); sb.append(ID_STRING); sb.append(" INTEGER PRIMARY KEY AUTOINCREMENT, "); sb.append(USER_ID_STRING); sb.append(" STRING, "); sb.append(NETWORK_ID_STRING); sb.append(" INT, "); sb.append(STATUS_STRING); sb.append(" INT);"); writableDb.execSQL(sb.toString()); } /** * Retrieves current NetworkPresence values in the cache. * @param readableDatabase Readable object to access db * @return Current cached values or null if there are none. * @throws SQLException if the database layer throws this exception. * @throws NullPointerException if the passed in database instance is null. */ public static ArrayList<NetworkPresence> getCache(SQLiteDatabase readableDatabase) throws SQLException, NullPointerException { Cursor c = null; if (readableDatabase == null) { throw new NullPointerException(DEFAULT_ERROR_MESSAGE); } ArrayList<NetworkPresence> presences = null; try { c = readableDatabase.rawQuery("SELECT * FROM " + TABLE_NAME, null); if(c.getCount() > 0) { presences = new ArrayList<NetworkPresence>(); } while (c.moveToNext()) { String userId = c.getString(USER_ID); int networkId = c.getInt(NETWORK_ID); int statusId = c.getInt(STATUS); presences.add(new NetworkPresence(userId, networkId, statusId)); } } finally { CloseUtils.close(c); c = null; } return presences; } /** * Updates the cache using a lone NetworkPresence value. * The value is inserted if not already present in the table. * @param presence The Network Presence to update * @param writableDatabase writable object to access db * @throws SQLException if the database layer throws this exception. * @throws NullPointerException if the passed in database instance is null. */ public static void updateCache(NetworkPresence presence, SQLiteDatabase writableDatabase) throws SQLException, NullPointerException { if (writableDatabase == null) { throw new NullPointerException(DEFAULT_ERROR_MESSAGE); } ContentValues values = new ContentValues(); int networkId = presence.getNetworkId(); values.put(USER_ID_STRING, presence.getUserId()); values.put(STATUS_STRING, presence.getOnlineStatusId()); StringBuffer where = StringBufferPool.getStringBuffer(NETWORK_ID_STRING); where.append(SQLKeys.EQUALS).append(networkId); int numberOfAffectedRows = writableDatabase. update( TABLE_NAME, values, StringBufferPool.toStringThenRelease(where), null); if(numberOfAffectedRows == 0) { values.put(NETWORK_ID_STRING, networkId); writableDatabase.insert(TABLE_NAME, null, values); } } /** * Updates the cache using a NetworkPresence array. * The values are inserted if not already present in the table. * @param presences The Network Presences to update * @param writableDatabase writable object to access db * @throws SQLException if the database layer throws this exception. * @throws NullPointerException if the passed in database instance is null. */ public static void updateCache(ArrayList<NetworkPresence> presences, SQLiteDatabase writableDatabase) throws SQLException, NullPointerException { if (writableDatabase == null) { throw new NullPointerException(DEFAULT_ERROR_MESSAGE); } if(presences == null) { return; } for(NetworkPresence presence : presences) { updateCache(presence, writableDatabase); } } }