package com.xinxin.everyxday.base.loopj.jsoncache;
import com.xinxin.everyxday.bean.base.CommonResponseHeader;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 缓存策略类基类 负责生成文件地址,存储和获取缓存数据
*/
public class ResponseCachePolicyBase {
protected String getDataCacheFilePath(String requestUrl, int page){
return null;
}
protected boolean isNeedDataCache(String requestUrl, int page){
return false;
}
protected String getResponseHeaderCacheFilePath(String requestUrl, int page){
return null;
}
protected boolean isNeedResponseHeaderCache(String requestUrl, int page){
return false;
}
public void cacheResponseData(String requestUrl, int page,
byte[] responseBytes, CommonResponseHeader responseHeader) {
if (isNeedDataCache(requestUrl, page)) {
String filePath = getDataCacheFilePath(requestUrl, page);
cacheDataToSdcard(filePath, responseBytes);
}
if(isNeedResponseHeaderCache(requestUrl, page)){
String filePath = getResponseHeaderCacheFilePath(requestUrl, page);
cacheResponseHeaderToSdcard(filePath, responseHeader);
}
}
public String getResponseCacheData(String requestUrl, int page) {
if (isNeedDataCache(requestUrl, page)) {
String filePath = getDataCacheFilePath(requestUrl, page);
if(isFileExist(filePath)){
return getCacheDataFromSdcard(filePath);
}
}
return null;
}
public CommonResponseHeader getResponseHeaderCache(String requestUrl, int page) {
if (isNeedResponseHeaderCache(requestUrl, page)) {
String filePath = getResponseHeaderCacheFilePath(requestUrl, page);
if(isFileExist(filePath)){
return getCacheResponseHeaderFromSdcard(filePath);
}
}
return null;
}
private boolean isFileExist(String filePath){
File f = new File(filePath);
if(f != null && f.exists()){
return true;
}
return false;
}
//缓存data数据至本地
protected void cacheDataToSdcard(String filePath, byte[] cacheData) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
fos = new FileOutputStream(new File(filePath));
bos = new BufferedOutputStream(fos);
bos.write(cacheData);
// System.out.println("\r\n write data cache : " + filePath);
// System.out.println("\r\n");
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fos != null){
fos.close();
}
if(bos != null){
bos.flush();
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//获取本地data缓存数据
protected String getCacheDataFromSdcard(String filePath) {
FileInputStream fis = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
fis = new FileInputStream(new File(filePath));
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
String line;
StringBuffer sb = new StringBuffer();
while ((line = br.readLine()) != null) {
sb.append(line);
}
// System.out.println("\r\nread data from cache ....");
// System.out.println("\r\n");
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
if(isr != null){
isr.close();
}
if(br != null){
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
//缓存responseHeader数据至本地
protected void cacheResponseHeaderToSdcard(String filePath, CommonResponseHeader responseHeader) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(new File(filePath));
oos = new ObjectOutputStream(fos);
oos.writeObject(responseHeader);
// System.out.println("\r\n write responseHeader cache : " + filePath);
// System.out.println("\r\n");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
if (oos != null) {
oos.flush();
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//获取本地responseHeader缓存数据
protected CommonResponseHeader getCacheResponseHeaderFromSdcard(String filePath) {
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis = new FileInputStream(new File(filePath));
ois = new ObjectInputStream(fis);
// System.out.println("\r\nread responseHeader from cache ....");
// System.out.println("\r\n");
return (CommonResponseHeader)ois.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ois != null){
ois.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}