?? taskmanager.java
字號(hào):
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package biz.tbuy.huliqing.jloading;import biz.tbuy.huliqing.jloading.downloader.Config;import biz.tbuy.huliqing.jloading.downloader.ConfigFactory;import java.io.File;import java.util.List;import javax.swing.JTable;import javax.swing.SwingUtilities;import javax.swing.table.TableModel;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;/** * * @author huliqing */public class TaskManager { private static TaskManager instance = new TaskManager(); private TaskManager(){ try { if (tasksFile == null) tasksFile = new File("tasks.xml"); if (!tasksFile.exists()) { tasksFile.createNewFile(); doc = XmlOper.newDocument(); Element eTasks = doc.createElement("tasks"); doc.appendChild(eTasks); XmlOper.saveDocument(doc, tasksFile); } else { doc = XmlOper.getDocument(tasksFile); } } catch (Exception e) { Elog.log("處理任務(wù)列表文件時(shí)遇到錯(cuò)誤:" + e.getMessage()); } } public static TaskManager getInstance() { return instance; } // 任務(wù)表格 private JTable jTable; private TaskTableModel ttm; private Thread jTable_listener; /** 設(shè)置所監(jiān)視的任務(wù)表格 */ public void setTable(JTable table) { this.jTable = table; this.ttm = getTableModel(); // 定時(shí)更新jTable1(每1000秒) jTable_listener = new Thread(new Runnable(){ Runnable rp = new Runnable() { public void run() { jTable.updateUI(); } }; public void run() { while (true) { SwingUtilities.invokeLater(rp); try { Thread.sleep(1000); } catch (Exception e) { } } } }); jTable_listener.start(); } private TaskTableModel getTableModel() { TableModel tm = jTable.getModel(); if (tm instanceof TaskTableModel) { return ((TaskTableModel) tm); } return null; } /** * 添加新的下載任務(wù),方法同時(shí)生成一個(gè)唯一任務(wù)id * @param name 文件名 * @param url 下載源 * @param save 保存目錄 */ public synchronized void addTask(String name, String url, String save) { String type = url.substring(url.lastIndexOf(".")); if (null == save || "".equals(save)) { File musics = new File("musics"); if (!musics.exists()) { musics.mkdirs(); } save = musics.getAbsolutePath(); } name = name.trim(); save = save + "\\" + name + type; String taskid = String.valueOf(System.currentTimeMillis()) + "_" + String.valueOf(Math.random() * 10000); saveTask(taskid, name, url, save); ttm.addTaskModel(new TaskModel(taskid, name, url, save)); jTable.updateUI(); } /** * 添加新的下載任務(wù), 使用默認(rèn)的保存目錄 * @param name 文件名 * @param url 下載源 * @throws biz.tbuy.huliqing.jloading.JLoadingException */ public void addTask(String name, String url) { addTask(name, url, null); } /** 移除任務(wù),通過任務(wù)id */ public void removeTask(String taskid) { ttm.removeByTaskid(taskid); } /** 開始下載任務(wù) */ public void startTask(TaskModel task) { task.toStart(); } public void pauseTask(TaskModel task) { task.toPause(); } /** 停止任務(wù) */ public void stopTask(TaskModel task) { task.toStop(); } /** 刪除任務(wù) */ public void deleteTasks(List<TaskModel> tasks) { ttm.removeTasks(tasks); // 先從jTable1表格中移除 for (TaskModel tm : tasks) { if (!tm.toDelete()) { removeTask(tm.getTaskid()); // 除出窗格jTable try {// 償試刪除狀態(tài)文件或未完成的下載文件 tm.toStop(); Config config = getConfig(tm.getTaskid()); File processFile = new File(config.getSave() + "_"); config.delete(); processFile.delete(); } catch (Exception e) { } } deleteConfig(tm.getTaskid()); // 刪除任務(wù)列表 } } // -------------------------------------------------- 載入任務(wù)或創(chuàng)建新任務(wù)記錄 private File tasksFile; // 任務(wù)列表文件的保存路徑 private Document doc; // tasksFile的document對(duì)象 /** 載入任務(wù)列表 */ public void loadTasks() { NodeList nTasks = doc.getElementsByTagName("task"); int len = nTasks.getLength(); for (int i = 0; i < len; i++) { Element eTask = (Element) nTasks.item(i); String config = eTask.getAttribute("config"); if (null != config && !"".equals(config)) { // 優(yōu)先使用狀態(tài)文件 try { Config c = ConfigFactory.loadConfig(config); ttm.addTaskModel(new TaskModel(c)); } catch (Exception e) { // 如果狀態(tài)文件仍未建立 String id = eTask.getAttribute("id"); String name = eTask.getAttribute("name"); String url = eTask.getAttribute("url"); String save = eTask.getAttribute("save"); ttm.addTaskModel(new TaskModel(id, name, url, save)); } } else { String id = eTask.getAttribute("id"); String name = eTask.getAttribute("name"); String url = eTask.getAttribute("url"); String save = eTask.getAttribute("save"); ttm.addTaskModel(new TaskModel(id, name, url, save)); } } } /** 保存下載文件的記錄 */ private void saveTask(String id, String name, String url, String save) { try { Element eTasks = doc.getDocumentElement(); Element eTask = doc.createElement("task"); eTask.setAttribute("id", id); eTask.setAttribute("config", (save + "_")); eTask.setAttribute("name", name); eTask.setAttribute("url", url); eTask.setAttribute("save", save); eTasks.appendChild(eTask); XmlOper.saveDocument(doc, tasksFile); } catch (Exception e) { Elog.log("保存創(chuàng)建任務(wù)信息時(shí)遇到錯(cuò)誤:" + this.getClass().getName() + ":saveTask"); } } /** * 通過任務(wù)ID獲取其配置信息(狀態(tài)保存信息),如果Config信息還不存在,則返回null. * Config文件只有在首次運(yùn)行下載任務(wù)之后才會(huì)創(chuàng)建。在任務(wù)首次運(yùn)行之前只會(huì)創(chuàng)建任務(wù) * 的記錄,而不會(huì)創(chuàng)建任務(wù)的狀態(tài)文件(Config) * @param taskid * @return config */ public Config getConfig(String taskid) { String configPath = null; Element e = doc.getDocumentElement(); NodeList nTasks = e.getElementsByTagName("task"); int len = nTasks.getLength(); for (int i = 0; i < len; i++) { Element eTask = (Element) nTasks.item(i); if (eTask.getAttribute("id").equals(taskid)) { configPath = eTask.getAttribute("config"); break; } } if (configPath != null && !configPath.equals("")) { try { return ConfigFactory.loadConfig(configPath); } catch (Exception exception) { return null; } } return null; } /** 更新狀態(tài)文件的路徑保存信息, 只更新相應(yīng)的tasks.xml中的相同id,的config屬性*/ public void updateConfigPath(Config config) { Element e = doc.getDocumentElement(); NodeList nTasks = e.getElementsByTagName("task"); int len = nTasks.getLength(); for (int i = 0; i < len; i++) { Element eTask = (Element) nTasks.item(i); if (eTask.getAttribute("id").equals(config.getId())) { eTask.setAttribute("config", config.getConfigPath()); eTask.setAttribute("save", config.getSave()); break; } } try { XmlOper.saveDocument(doc, tasksFile); // 更新后保存 } catch (Exception ex) { Elog.log("更新Config文件路徑是遇到問題!" + "通常是由于遇到相同文件名時(shí)需要重新命名文件信息所致:" + getClass().getName()); } } /** 通過任務(wù)標(biāo)識(shí)ID刪除任務(wù)記錄 */ public void deleteConfig(String taskid) { Element eTasks = doc.getDocumentElement(); NodeList nTasks = eTasks.getElementsByTagName("task"); int len = nTasks.getLength(); for (int i = 0; i < len; i++) { Element eTask = (Element) nTasks.item(i); if (eTask.getAttribute("id").equals(taskid)) { eTasks.removeChild(eTask); break; } } try { XmlOper.saveDocument(doc, tasksFile); } catch (Exception e) { Elog.log("移除任務(wù)時(shí)遇到問題:" + getClass().getName()); } } }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -