package cn.trinea.android.common.dao.impl;
import java.util.HashMap;
import java.util.Map;
import android.content.ContentValues;
import android.database.Cursor;
import cn.trinea.android.common.constant.DbConstants;
import cn.trinea.android.common.dao.HttpCacheDao;
import cn.trinea.android.common.entity.HttpResponse;
import cn.trinea.android.common.util.SqliteUtils;
import cn.trinea.android.common.util.StringUtils;
import cn.trinea.android.common.util.TimeUtils;
/**
* HttpCacheDaoImpl
*
* @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-11-5
*/
public class HttpCacheDaoImpl implements HttpCacheDao {
private SqliteUtils sqliteUtils;
public HttpCacheDaoImpl(SqliteUtils sqliteUtils) {
this.sqliteUtils = sqliteUtils;
}
@Override
public long insertHttpResponse(HttpResponse httpResponse) {
ContentValues contentValues = httpResponseToCV(httpResponse);
if (contentValues == null) {
return -1;
}
synchronized (HttpCacheDaoImpl.class) {
return sqliteUtils.getDb().replace(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null, contentValues);
}
}
@Override
public HttpResponse getHttpResponse(String url) {
if (StringUtils.isEmpty(url)) {
return null;
}
StringBuilder appWhere = new StringBuilder();
appWhere.append(DbConstants.HTTP_CACHE_TABLE_URL).append("=?");
String[] appWhereArgs = {url};
synchronized (HttpCacheDaoImpl.class) {
Cursor cursor = sqliteUtils.getDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null,
appWhere.toString(), appWhereArgs, null, null, null);
if (cursor == null) {
return null;
}
HttpResponse httpResponse = null;
if (cursor.moveToFirst()) {
httpResponse = cursorToHttpResponse(cursor, url);
}
if (!cursor.isClosed()) {
cursor.close();
}
return httpResponse;
}
}
@Override
public Map<String, HttpResponse> getHttpResponsesByType(int type) {
StringBuilder whereClause = new StringBuilder();
whereClause.append(DbConstants.HTTP_CACHE_TABLE_TYPE).append("=?");
String[] whereClauseArgs = {Integer.toString(type)};
synchronized (HttpCacheDaoImpl.class) {
Cursor cursor = sqliteUtils.getDb().query(DbConstants.HTTP_CACHE_TABLE_TABLE_NAME, null,
whereClause.toString(), whereClauseArgs, null, null, null);
if (cursor == null) {
return null;
}
Map<String, HttpResponse> httpResponseMap = new HashMap<String, HttpResponse>();
if (cursor.getCount() > 0) {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
String url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX);
if (StringUtils.isEmpty(url)) {
continue;
}
HttpResponse httpResponse = cursorToHttpResponse(cursor, url);
if (httpResponse != null) {
httpResponseMap.put(url, httpResponse);
}
}
}
if (!cursor.isClosed()) {
cursor.close();
}
return httpResponseMap;
}
}
@Override
public int deleteAllHttpResponse() {
return sqliteUtils.getDb().delete(DbConstants.HTTP_CACHE_TABLE_TYPE, null, null);
}
/**
* convert cursor to HttpResponse
*
* @param cursor
* @param url
* @return
*/
private HttpResponse cursorToHttpResponse(Cursor cursor, String url) {
if (cursor == null) {
return null;
}
if (url == null) {
url = cursor.getString(DbConstants.HTTP_CACHE_TABLE_URL_INDEX);
}
if (StringUtils.isEmpty(url)) {
return null;
}
HttpResponse httpResponse = new HttpResponse(url);
httpResponse.setResponseBody(cursor.getString(DbConstants.HTTP_CACHE_TABLE_RESPONSE_INDEX));
httpResponse.setExpiredTime(cursor.getLong(DbConstants.HTTP_CACHE_TABLE_EXPIRES_INDEX));
httpResponse.setType(cursor.getInt(DbConstants.HTTP_CACHE_TABLE_TYPE_INDEX));
return httpResponse;
}
/**
* convert HttpResponse to ContentValues
*
* @param httpResponse
* @return
*/
private static ContentValues httpResponseToCV(HttpResponse httpResponse) {
if (httpResponse == null || StringUtils.isEmpty(httpResponse.getUrl())) {
return null;
}
ContentValues values = new ContentValues();
values.put(DbConstants.HTTP_CACHE_TABLE_URL, httpResponse.getUrl());
values.put(DbConstants.HTTP_CACHE_TABLE_RESPONSE, httpResponse.getResponseBody());
values.put(DbConstants.HTTP_CACHE_TABLE_EXPIRES, httpResponse.getExpiredTime());
values.put(DbConstants.HTTP_CACHE_TABLE_CREATE_TIME, TimeUtils.getCurrentTimeInString());
values.put(DbConstants.HTTP_CACHE_TABLE_TYPE, httpResponse.getType());
return values;
}
}