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.Collections; import java.util.Comparator; import java.util.List; import org.arong.egdownloader.db.DbTemplate; import org.arong.egdownloader.model.Picture; import org.arong.egdownloader.ui.ComponentConst; 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实现 * @author 阿荣 * @since 2014-05-29 */ public class PictureDom4jDbTemplate implements DbTemplate<Picture> { /** * <?xml version="1.0" encoding="UTF-8"?> * <pictures> * <picture id="" tid="" num="" name="" url="" realUrl="" size="" time="" saveAsName="" isCompleted="" isRunning=""/> * </pictures> */ private static boolean locked; private static Document dom; static{ updateDom(); } public static void updateDom(){ try { dom = Dom4jUtil.getDOM(ComponentConst.PICTURE_XML_DATA_PATH); } catch (DocumentException e) { FileUtil.ifNotExistsThenCreate(ComponentConst.DATA_PATH); String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><pictures></pictures>"; 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.PICTURE_XML_DATA_PATH)); while((length = br.read(buffer)) != -1){ //若读到的不是末尾 bw.write(buffer, 0, length); } bw.flush(); dom = Dom4jUtil.getDOM(ComponentConst.PICTURE_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(Picture t) { if(t == null){ return false; } while(locked){ store(t); } locked = true; Element ele = picture2Element(t); Dom4jUtil.appendElement(dom.getRootElement(), ele); try { Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; } catch (Exception e) { locked = false; return false; } return true; } public boolean store(List<Picture> pics) { if(pics == null || pics.size() == 0){ return false; } while(locked){ store(pics); } locked = true; for (Picture t : pics) { Element ele = picture2Element(t); Dom4jUtil.appendElement(dom.getRootElement(), ele); } try { Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; } catch (Exception e) { locked = false; return false; } return true; } public boolean update(Picture t) { if(t == null){ return false; } while(locked){ update(t); } locked = true; Node node = dom.selectSingleNode("/pictures/picture[@id='" + t.getId() + "']"); if(node != null){ try { Dom4jUtil.deleteElement(dom.getRootElement(), (Element)node); Dom4jUtil.appendElement(dom.getRootElement(), picture2Element(t)); Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; return true; } catch (Exception e) { locked = false; return false; } } locked = false; return false; } public boolean update(List<Picture> pics) { if(pics == null || pics.size() == 0){ return false; } while(locked){ update(pics); } locked = true; Node node = null; boolean update = false; for (Picture t : pics) { node = dom.selectSingleNode("/pictures/picture[@id='" + t.getId() + "']"); if(node != null){ Dom4jUtil.deleteElement(dom.getRootElement(), (Element)node); Dom4jUtil.appendElement(dom.getRootElement(), picture2Element(t)); update = true; } } if(update){ try { Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; return true; } catch (Exception e) { locked = false; return false; } } locked = false; return false; } public boolean delete(Picture t) { if(t == null){ return false; } while(locked){ delete(t); } locked = true; Node node = dom.selectSingleNode("/pictures/picture[@id='" + t.getId() + "']"); if(node != null){ try { Dom4jUtil.deleteElement(dom.getRootElement(), (Element)node); Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; return true; } catch (Exception e) { locked = false; return false; } } locked = false; return false; } public boolean delete(List<Picture> pics) { if(pics == null || pics.size() == 0){ return false; } while(locked){ delete(pics); } locked = true; Node node = null; boolean delete = false; for (Picture t : pics) { node = dom.selectSingleNode("/pictures/picture[@id='" + t.getId() + "']"); if(node != null){ Dom4jUtil.deleteElement(dom.getRootElement(), (Element)node); delete = true; } } if(delete){ try { Dom4jUtil.writeDOM2XML(ComponentConst.PICTURE_XML_DATA_PATH, dom); locked = false; return true; } catch (Exception e) { locked = false; return false; } } locked = false; return false; } public List<Picture> query() { @SuppressWarnings("unchecked") List<Node> nodes = dom.selectNodes("/pictures/picture"); if(nodes != null && nodes.size() > 0){ List<Picture> pics = new ArrayList<Picture>(); for (Node node : nodes) { pics.add(node2Picture(node)); } return pics; } return null; } public List<Picture> query(Object id) { @SuppressWarnings("unchecked") List<Node> nodes = dom.selectNodes("/pictures/picture[@id='" + id.toString() + "']"); if(nodes != null && nodes.size() > 0){ List<Picture> pics = new ArrayList<Picture>(); for (Node node : nodes) { pics.add(node2Picture(node)); } return pics; } return null; } public List<Picture> query(String name, String value) { @SuppressWarnings("unchecked") List<Node> nodes = dom.selectNodes("/pictures/picture[@" + name + "='" + value + "']"); List<Picture> pics = null; if(nodes != null && nodes.size() > 0){ pics = new ArrayList<Picture>(); for (Node node : nodes) { pics.add(node2Picture(node)); } //排序 Collections.sort(pics, new Comparator<Picture>() { public int compare(Picture o1, Picture o2) { return o1.getNum().compareTo(o2.getNum()); } }); } return pics; } public Picture get(Object id) { Node node = dom.selectSingleNode("/pictures/picture[@id='" + id.toString() + "']"); if(node != null){ return node2Picture(node); } return null; } public boolean exsits(String name, String value) { Node node = dom.selectSingleNode("/pictures/picture[@" + name + "='" + value + "']"); if(node != null){ return true; } return false; } public static Element picture2Element(Picture t){ Element ele = DocumentHelper.createElement("picture"); ele.addAttribute("id", t.getId()); ele.addAttribute("tid", t.getTid()); ele.addAttribute("num", t.getNum()); ele.addAttribute("name", t.getName()); ele.addAttribute("url", t.getUrl()); // ele.addAttribute("realUrl", t.getRealUrl()); ele.addAttribute("size", t.getSize() + ""); ele.addAttribute("time", t.getTime()); ele.addAttribute("saveAsName", t.isSaveAsName() + ""); ele.addAttribute("isCompleted", t.isCompleted() + ""); // ele.addAttribute("isRunning", t.isRunning() + ""); return ele; } public static Picture node2Picture(Node node){ Element ele = (Element)node; Picture pic = new Picture(); pic.setId(ele.attributeValue("id")); pic.setTid(ele.attributeValue("tid")); pic.setName(ele.attributeValue("name")); pic.setNum(ele.attributeValue("num")); pic.setUrl(ele.attributeValue("url")); // pic.setRealUrl(ele.attributeValue("realUrl")); pic.setSize(ele.attributeValue("size") == null ? 1 : Integer.parseInt(ele.attributeValue("size"))); pic.setTime(ele.attributeValue("time")); pic.setCompleted("true".equals(ele.attributeValue("isCompleted")) ? true : false); // pic.setRunning("true".equals(ele.attributeValue("isRunning")) ? true : false); pic.setSaveAsName("true".equals(ele.attributeValue("saveAsName")) ? true : false); return pic; } }