package org.arong.egdownloader.db.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.arong.egdownloader.db.DbTemplate;
import org.arong.egdownloader.model.Setting;
import org.arong.egdownloader.ui.ComponentConst;
import org.arong.util.CodeUtil;
import org.arong.util.Dom4jUtil;
import org.arong.util.FileUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
/**
* 配置文件dom4j dbtemplate实现类
* @author 阿荣
* @since 2014-06-02
*/
public class SettingDom4jDbTemplate implements DbTemplate<Setting> {
private static boolean locked;
private static Document dom;
static{
updateDom();
}
public static void updateDom(){
try {
dom = Dom4jUtil.getDOM(ComponentConst.SETTING_XML_DATA_PATH);
} catch (DocumentException e) {
FileUtil.ifNotExistsThenCreate(ComponentConst.DATA_PATH);
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><settings></settings>";
int length = 0; //每一次读取的长度
char[] buffer = new char[2048]; //设缓冲最大值为2048字符
//字符串转为字符流
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new StringReader(xml));
bw = new BufferedWriter(new FileWriter(ComponentConst.SETTING_XML_DATA_PATH));
while((length = br.read(buffer)) != -1){ //若读到的不是末尾
bw.write(buffer, 0, length);
}
bw.flush();
dom = Dom4jUtil.getDOM(ComponentConst.SETTING_XML_DATA_PATH);
} catch (IOException e1) {
e1.printStackTrace();
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if(bw != null){
try {
bw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if(br != null){
try {
br.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean store(Setting t) {
while(locked){
store(t);
}
locked = true;
Element ele = setting2Element(t);
Dom4jUtil.appendElement(dom.getRootElement(), ele);
try {
Dom4jUtil.writeDOM2XML(ComponentConst.SETTING_XML_DATA_PATH, dom);
locked = false;
} catch (Exception e) {
locked = false;
return false;
}
return true;
}
public boolean store(List<Setting> list) {
return false;
}
public boolean update(Setting t) {
if(t == null)
return false;
while(locked){
update(t);
}
locked = true;
Node node = dom.selectSingleNode("/settings/setting[@id='" + t.getId() + "']");
if(node != null){
try {
Dom4jUtil.deleteElement(dom.getRootElement(), (Element)node);
Dom4jUtil.appendElement(dom.getRootElement(), setting2Element(t));
Dom4jUtil.writeDOM2XML(ComponentConst.SETTING_XML_DATA_PATH, dom);
locked = false;
return true;
} catch (Exception e) {
locked = false;
return false;
}
}
return false;
}
public boolean update(List<Setting> t) {
return false;
}
public boolean delete(Setting t) {
return false;
}
public boolean delete(List<Setting> list) {
return false;
}
public List<Setting> query() {
@SuppressWarnings("unchecked")
List<Node> nodes = dom.selectNodes("/settings/setting");
if(nodes != null && nodes.size() > 0){
List<Setting> settings = new ArrayList<Setting>();
for (Node node : nodes) {
settings.add(node2Setting(node));
}
return settings;
}
return null;
}
public List<Setting> query(Object id) {
return null;
}
public List<Setting> query(String name, String value) {
return null;
}
public Setting get(Object id) {
return null;
}
public boolean exsits(String name, String value) {
return false;
}
private Element setting2Element(Setting t) {
Element ele = DocumentHelper.createElement("setting");
ele.addAttribute("id", t.getId());
ele.addAttribute("defaultSaveDir", t.getDefaultSaveDir());
ele.addAttribute("cookieInfo", t.getCookieInfo());
ele.addAttribute("saveAsName", t.isSaveAsName() + "");
ele.addAttribute("autoDownload", t.isAutoDownload() + "");
ele.addAttribute("downloadOriginal", t.isDownloadOriginal() + "");
ele.addAttribute("maxThread", t.getMaxThread() + "");
/*ele.addAttribute("gidPrefix", t.getGidPrefix());
ele.addAttribute("hentaiHome.uri", t.getHentaiHome().getUri());
ele.addAttribute("hentaiHome.firstParameterName", t.getHentaiHome().getFirstParameterName());
ele.addAttribute("hentaiHome.secondParameterName", t.getHentaiHome().getSecondParameterName() + "");
ele.addAttribute("totalPrefix", t.getTotalPrefix());
ele.addAttribute("namePrefix", t.getNamePrefix());
ele.addAttribute("fileListPrefix", t.getFileListPrefix());
ele.addAttribute("fileListSuffix", t.getFileListSuffix());
ele.addAttribute("fileListPrefix", t.getFileListPrefix());
ele.addAttribute("pageCount", t.getPageCount() + "");
ele.addAttribute("pageParam", t.getPageParam());
ele.addAttribute("sourcePrefix", t.getSourcePrefix());
ele.addAttribute("sourceSuffix", t.getSourceSuffix());
ele.addAttribute("showPicPrefix", t.getShowPicPrefix());
ele.addAttribute("showPicSuffix", t.getShowPicSuffix());
ele.addAttribute("realUrlPrefix", t.getRealUrlPrefix());
ele.addAttribute("realUrlSuffix", t.getRealUrlSuffix());*/
ele.addAttribute("loginUrl", t.getLoginUrl());
ele.addAttribute("tags", t.getTags());
ele.addAttribute("lastCreateTime", t.getLastCreateTime());
ele.addAttribute("lastDownloadTime", t.getLastDownloadTime());
ele.addAttribute("taskHostoryCount", t.getTaskHistoryCount() + "");
ele.addAttribute("pictureHostoryCount", t.getPictureHistoryCount() + "");
/*ele.addAttribute("t_name1", t.getTask_name()[0]);
ele.addAttribute("t_name2", t.getTask_name()[1]);
ele.addAttribute("t_subname1", t.getTask_subname()[0]);
ele.addAttribute("t_subname2", t.getTask_subname()[1]);
ele.addAttribute("t_type1", t.getTask_type()[0]);
ele.addAttribute("t_type2", t.getTask_type()[1]);
ele.addAttribute("t_cover1", t.getTask_coverUrl()[0]);
ele.addAttribute("t_cover2", t.getTask_type()[1]);
ele.addAttribute("t_totalsize1", t.getTask_total_size()[0]);
ele.addAttribute("t_totalsize2", t.getTask_total_size()[1]);
ele.addAttribute("t_language1", t.getTask_language()[0]);
ele.addAttribute("t_language2", t.getTask_language()[1]);
ele.addAttribute("p_intercept1", t.getPicture_intercept()[0]);
ele.addAttribute("p_intercept2", t.getPicture_intercept()[1]);
ele.addAttribute("p_name1", t.getPicture_name()[0]);
ele.addAttribute("p_name2", t.getPicture_name()[1]);
ele.addAttribute("p_showUrl1", t.getPicture_showUrl()[0]);
ele.addAttribute("p_showUrl2", t.getPicture_showUrl()[1]);
ele.addAttribute("p_realUrl1", t.getPicture_realUrl()[0]);
ele.addAttribute("p_realUrl2", t.getPicture_realUrl()[1]);*/
ele.addAttribute("openScript", t.isOpenScript() + "");
ele.addAttribute("createTaskScriptPath", t.getCreateTaskScriptPath());
ele.addAttribute("collectPictureScriptPath", t.getCollectPictureScriptPath());
ele.addAttribute("downloadScriptPath", t.getDownloadScriptPath());
ele.addAttribute("searchScriptPath", t.getSearchScriptPath());
ele.addAttribute("useProxy", t.isUseProxy() + "");
ele.addAttribute("proxyType", t.getProxyType());
ele.addAttribute("proxyIp", t.getProxyIp());
ele.addAttribute("proxyPort", t.getProxyPort());
ele.addAttribute("proxyUsername", t.getProxyUsername());
ele.addAttribute("proxyPwd", CodeUtil.myEncode(t.getProxyPwd()));
return ele;
}
private Setting node2Setting(Node node) {
Element ele = (Element)node;
Setting t = new Setting();
t.setId(ele.attributeValue("id") == null ? t.getId() : ele.attributeValue("id"));
t.setDefaultSaveDir(ele.attributeValue("defaultSaveDir") == null ? t.getDefaultSaveDir() : ele.attributeValue("defaultSaveDir"));
t.setCookieInfo(ele.attributeValue("cookieInfo") == null ? t.getCookieInfo() : ele.attributeValue("cookieInfo"));
t.setSaveAsName("true".equals(ele.attributeValue("saveAsName")) ? true : false);
t.setAutoDownload("true".equals(ele.attributeValue("autoDownload")) ? true : false);
t.setDownloadOriginal("true".equals(ele.attributeValue("downloadOriginal")) ? true : false);
t.setGidPrefix(ele.attributeValue("gidPrefix") == null ? t.getGidPrefix() : ele.attributeValue("gidPrefix"));
t.setMaxThread(ele.attributeValue("maxThread") == null ? 0 : Integer.parseInt(ele.attributeValue("maxThread")));
/*t.getHentaiHome().setUri(ele.attributeValue("hentaiHome.uri"));
t.getHentaiHome().setFirstParameterName(ele.attributeValue("hentaiHome.firstParameterName"));
t.getHentaiHome().setSecondParameterName(ele.attributeValue("hentaiHome.secondParameterName"));
t.setTotalPrefix(ele.attributeValue("totalPrefix"));
t.setNamePrefix(ele.attributeValue("namePrefix"));
t.setFileListPrefix(ele.attributeValue("fileListPrefix"));
t.setFileListSuffix(ele.attributeValue("fileListSuffix"));
t.setFileListPrefix(ele.attributeValue("fileListPrefix"));
t.setPageCount(ele.attributeValue("pageCount") == null ? 0 : Integer.parseInt(ele.attributeValue("pageCount")));
t.setPageParam(ele.attributeValue("pageParam") == null ? t.getPageParam() : ele.attributeValue("pageParam"));
t.setSourcePrefix(ele.attributeValue("sourcePrefix"));
t.setSourceSuffix(ele.attributeValue("sourceSuffix"));
t.setShowPicPrefix(ele.attributeValue("showPicPrefix"));
t.setShowPicSuffix(ele.attributeValue("showPicSuffix"));
t.setRealUrlPrefix(ele.attributeValue("realUrlPrefix"));
t.setRealUrlSuffix(ele.attributeValue("realUrlSuffix"));*/
t.setLoginUrl(ele.attributeValue("loginUrl") == null ? t.getLoginUrl() : ele.attributeValue("loginUrl"));
if(ele.attributeValue("tags") != null){
t.setTags(ele.attributeValue("tags"));
}
t.setTaskHistoryCount(ele.attributeValue("taskHostoryCount") == null ? 0 : Integer.parseInt(ele.attributeValue("taskHostoryCount")));
t.setPictureHistoryCount(ele.attributeValue("pictureHostoryCount") == null ? 0 : Integer.parseInt(ele.attributeValue("pictureHostoryCount")));
t.setLastCreateTime(ele.attributeValue("lastCreateTime"));
t.setLastDownloadTime(ele.attributeValue("lastDownloadTime"));
/*t.getTask_name()[0] = ele.attributeValue("t_name1") == null ? t.getTask_name()[0] : ele.attributeValue("t_name1");
t.getTask_name()[1] = ele.attributeValue("t_name2") == null ? t.getTask_name()[1] : ele.attributeValue("t_name2");
t.getTask_subname()[0] = ele.attributeValue("t_subname1") == null ? t.getTask_subname()[0] : ele.attributeValue("t_subname1");
t.getTask_subname()[1] = ele.attributeValue("t_subname2") == null ? t.getTask_subname()[1] : ele.attributeValue("t_subname2");
t.getTask_type()[0] = ele.attributeValue("t_type1") == null ? t.getTask_type()[0] : ele.attributeValue("t_type1");
t.getTask_type()[1] = ele.attributeValue("t_type2") == null ? t.getTask_type()[1] : ele.attributeValue("t_type2");
t.getTask_coverUrl()[0] = ele.attributeValue("t_coverUrl1") == null ? t.getTask_coverUrl()[0] : ele.attributeValue("t_coverUrl1");
t.getTask_coverUrl()[1] = ele.attributeValue("t_coverUrl2") == null ? t.getTask_coverUrl()[1] : ele.attributeValue("t_coverUrl2");
t.getTask_total_size()[0] = ele.attributeValue("t_totalsize1") == null ? t.getTask_total_size()[0] : ele.attributeValue("t_totalsize1");
t.getTask_total_size()[1] = ele.attributeValue("t_totalsize2") == null ? t.getTask_total_size()[1] : ele.attributeValue("t_totalsize2");
t.getTask_language()[0] = ele.attributeValue("t_language1") == null ? t.getTask_language()[0] : ele.attributeValue("t_language1");
t.getTask_language()[1] = ele.attributeValue("t_language2") == null ? t.getTask_language()[1] : ele.attributeValue("t_language2");
t.getPicture_intercept()[0] = ele.attributeValue("t_intercept1") == null ? t.getPicture_intercept()[0] : ele.attributeValue("t_intercept1");
t.getPicture_intercept()[1] = ele.attributeValue("t_intercept2") == null ? t.getPicture_intercept()[1] : ele.attributeValue("t_intercept2");
t.getPicture_name()[0] = ele.attributeValue("p_name1") == null ? t.getPicture_name()[0] : ele.attributeValue("p_name1");
t.getPicture_name()[1] = ele.attributeValue("p_name2") == null ? t.getPicture_name()[1] : ele.attributeValue("p_name2");
t.getPicture_showUrl()[0] = ele.attributeValue("p_showUrl1") == null ? t.getPicture_showUrl()[0] : ele.attributeValue("p_showUrl1");
t.getPicture_showUrl()[1] = ele.attributeValue("p_showUrl2") == null ? t.getPicture_showUrl()[1] : ele.attributeValue("p_showUrl2");
t.getPicture_realUrl()[0] = ele.attributeValue("p_realUrl1") == null ? t.getPicture_realUrl()[0] : ele.attributeValue("p_realUrl1");
t.getPicture_realUrl()[1] = ele.attributeValue("p_realUrl2") == null ? t.getPicture_realUrl()[1] : ele.attributeValue("p_realUrl2");*/
//t.setOpenScript("true".equals(ele.attributeValue("openScript")) ? true : false);
t.setCreateTaskScriptPath(ele.attributeValue("createTaskScriptPath") == null ? t.getCreateTaskScriptPath() : ele.attributeValue("createTaskScriptPath"));
t.setCollectPictureScriptPath(ele.attributeValue("collectPictureScriptPath") == null ? t.getCollectPictureScriptPath() : ele.attributeValue("collectPictureScriptPath"));
t.setDownloadScriptPath(ele.attributeValue("downloadScriptPath") == null ? t.getDownloadScriptPath() : ele.attributeValue("downloadScriptPath"));
t.setSearchScriptPath(ele.attributeValue("searchScriptPath") == null ? t.getSearchScriptPath() : ele.attributeValue("searchScriptPath"));
t.setUseProxy("true".equals(ele.attributeValue("useProxy")) ? true : false);
t.setProxyType(ele.attributeValue("proxyType"));
t.setProxyIp(ele.attributeValue("proxyIp"));
t.setProxyPort(ele.attributeValue("proxyPort"));
t.setProxyUsername(ele.attributeValue("proxyUsername"));
t.setProxyPwd(CodeUtil.myDecode(ele.attributeValue("proxyPwd")));
return t;
}
}