dom创建和解析及更新删除xml

package com.intelitune.quartz;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class XmlDomParse {

    private static XmlDomParse xmlDom = null;
    private Document document;

    public Document getDocument() {
        return document;
    }

    /**
     * 构造方法私有化
     */
    private XmlDomParse() {// 单例模式
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 初始化工厂
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();// 得到dom解析
            document = builder.parse(this.getClass().getResource("/").getPath() + "quartz.xml");// 加载xml文件
            System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml  解析完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 单例模式创建XmlDomParse实例,通过getInstance()可以获取XmlDomParse实例<br>
     *
     * @return xmlDom , XmlDomParse实例。通过该实例可以调用方法来操作XML文件<br>
     */
    public static XmlDomParse getInstance() {
        if (xmlDom == null) {
            xmlDom = new XmlDomParse();
        }
        return xmlDom;
    }

    /**
     * 在修改document后,可以使用jdk提供的Transformer将dom树转换成xml。<br>
     *
     * @param document
     *            quartz.xml的dom树<br>
     */
    public void doc2XmlFile(Document document) {
        // 在修改document后,可以使用jdk提供的Transformer讲dom树转换成xml。
        Source xmlSource = new DOMSource(document);
        TransformerFactory factory = TransformerFactory.newInstance(); // 初始化工厂
        try {
            Transformer transformer = factory.newTransformer();
            Result result = new StreamResult(new File(this.getClass().getResource("/").getPath() + "quartz.xml"));
            //System.out.println(this.getClass().getResource("/").getPath() + "quartz.xml  更新完成");
            transformer.transform(xmlSource, result); // 保存dom至目的文件
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据传入的的jobName和jobGroup,检查JobDetail中是否存在name和group与之相同的实例<br>
     *
     * @param jobName
     *            想要找的name<br>
     * @param jobGroup
     *            想要找的group<br>
     * @return 返回true时存在该JobDetail实例,返回false表示不存在<br>
     */

    // 已知一个Trigger的jobName及jobGroup,判定该jobname是否有相应的jobdetail在XML中存在
    public synchronized boolean checkJobDetail(String jobName, String jobGroup) {
        JobDetailBean jobDetailBean = getJobDetailBean(jobName, jobGroup);
        if (jobDetailBean!=null) {
            if (jobDetailBean.getName() != null && !(jobDetailBean.getName().trim().equals(""))&&
                    jobDetailBean.getGroup() != null && !(jobDetailBean.getGroup().trim().equals(""))&&
                            jobDetailBean.getJobClass() != null&& !(jobDetailBean.getJobClass().trim().equals(""))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据Trigger的name和group属性值判断该Trigger是否已经存在
     *
     * @param name
     * @param group
     * @return 如果找到满足该条件的返回true,没有找到返回false
     */
    public synchronized boolean checkTrigger(String name, String group) {
        boolean nameFlag = false;
        boolean groupFlag = false;
        NodeList tagNodes = document.getElementsByTagName("simple");
        for (int i = 0; i < tagNodes.getLength(); i++) {
            NodeList target = tagNodes.item(i).getChildNodes();
            for (int j = 0; j < target.getLength(); j++) {
                if (target.item(j).getNodeName().equals("name") && target.item(j).getTextContent().equals(name)) {
                    nameFlag = true;
                }
                if (target.item(j).getNodeName().equals("group") && target.item(j).getTextContent().equals(group)) {
                    groupFlag = true;
                }
                if (nameFlag && groupFlag) {
                    return true;
                }
            }
        }
        return false;
    }

    public synchronized boolean updateTrigger(JobExecutionContext jct) {
        Logger log = Logger.getLogger(jct.getJobDetail().getJobClass());
        log.info("当前正在执行的作业是  " + jct.getJobDetail().getFullName() +"  "+ DateString.date2String(new Date()));
        JobDetail jobDetail = jct.getJobDetail();
        SimpleTrigger trigger = (SimpleTrigger) jct.getTrigger();
        JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(jobDetail.getName(), jobDetail.getGroup());
        TriggerBean triggerBean = xmlDom.getTriggerBean(jobDetail.getName(), jobDetail.getGroup());
        triggerBean.setNextFireTime(DateString.date2String(trigger.getNextFireTime()));
        triggerBean.setPreviousFireTime(DateString.date2String(trigger.getPreviousFireTime()));
        triggerBean.setSuccessTriggered((Integer.parseInt(triggerBean.getSuccessTriggered()) + 1) + "");
        xmlDom.updateJob(jobDetailBean, triggerBean);
        return false;
    }

    public synchronized List<JobAndSimpleTrigger> getJobAndSimpleTriggers() {
        List<JobAndSimpleTrigger> jastList = new ArrayList<JobAndSimpleTrigger>();
        NodeList jobNodes = xmlDom.getDocument().getElementsByTagName("job-detail");// 得到标签名为job-detail的所有集合
        for (int i = 0; i < jobNodes.getLength(); i++) {// 遍历节点名称为job-detail的所有集合
            NodeList childNodes = jobNodes.item(i).getChildNodes();// 得到job-detail的所有子节点集合
            for (int j = 0; j < childNodes.getLength(); j++) {// 遍历集合
                if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                    if (childNodes.item(j).getNodeName().equals("name")) {// 得到节点名称为name的节点
                        NodeList brolist = childNodes.item(j).getParentNode().getChildNodes();// 得到name的所有兄弟节点
                        for (int k = 0; k < brolist.getLength(); k++) {
                            if (brolist.item(k).getNodeName().equals("group")) {
                                JobDetailBean jobDetailBean = xmlDom.getJobDetailBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());

                                TriggerBean triggerBean = xmlDom.getTriggerBean(childNodes.item(j).getTextContent(), brolist.item(k).getTextContent());
                                JobAndSimpleTrigger jast = new JobAndSimpleTrigger(jobDetailBean, triggerBean);
                                jastList.add(jast);
                            }
                        }
                    }
                }
            }
        }
        return jastList;
    }

    /**
     * 修改一个Job,不能修改其JobDetail的name和group 策略就是先删除后再次创建<br>
     * 封装jobDetail中的数据到jobDetailBean中<br>
     * 封装trigger中的数据到triggerBean中<br>
     *
     * @param jobDetailBean
     *            封装jobDetail数据<br>
     * @param triggerBean
     *            封装trigger数据<br>
     */
    public synchronized void updateJob(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
        deleteJob(jobDetailBean.getName(), jobDetailBean.getGroup());
        createJobElement(jobDetailBean, triggerBean);
    }

    /**
     * 根据name和group可以指定一个唯一的JobDetail<br>
     * 对xml进行操作,删除关于这个JobDetail的所有工作Job节点信息<br>
     *
     * @param name
     *            JobDetail中的name<br>
     * @param group
     *            JobDetail中的group<br>
     */

    // 删除整个job及其所有子节点
    public synchronized void deleteJob(String name, String group) {
        NodeList nameList = document.getElementsByTagName("name");// 得到name的节点集合
        for (int i = 0; i < nameList.getLength(); i++) {
            if (nameList.item(i).getTextContent().equals(name)) {// 找到name节点的文本值为name的那个name节点
                Node node = nameList.item(i).getParentNode();// 得到他的父亲节点job-detail
                NodeList list = node.getChildNodes();
                for (int j = 0; j < list.getLength(); j++) {
                    if (list.item(j).getTextContent().equals(group)) {
                        // System.out.println(nameList.item(i).getTextContent()+"======"+list.item(j).getTextContent());
                        Node targetJob = nameList.item(i).getParentNode().getParentNode();// 得到我们要找的最大的父节点Job
                        // System.out.println(targetJob.getNodeName()+"123456789");
                        for (int k = 0; k < targetJob.getChildNodes().getLength(); k++) {
                            Node targetNode1 = targetJob.getChildNodes().item(k);// 得到我们要找的二级节点
                            for (int l = 0; l < targetNode1.getChildNodes().getLength(); l++) {
                                Node targetNode2 = targetNode1.getChildNodes().item(l);// 得到我们要找的三级节点
                                for (int m = 0; m < targetNode2.getChildNodes().getLength(); m++) {
                                    Node targetNode3 = targetNode2.getChildNodes().item(m);
                                    for (int n = 0; n < targetNode3.getChildNodes().getLength(); n++) {
                                        targetNode3.removeChild(targetNode3.getChildNodes().item(n));
                                    }
                                    targetNode2.removeChild(targetNode3);
                                }
                                targetNode1.removeChild(targetNode2);
                            }
                            targetJob.removeChild(targetNode1);
                        }
                        targetJob.getParentNode().removeChild(targetJob);
                    }
                }
            }
        }
        doc2XmlFile(getDocument());
    }

    /**
     * 根据jobName、jobGroup在xml中找到相应的信息,保存到JobDetailBean中,
     * 通过该方法可以找到想要找的JobDetailBean实例<br>
     *
     * @param jobName
     *            JobDetail中的name<br>
     * @param jobGroup
     *            JobDetail中的group<br>
     * @return 通过该方法可以找到想要找的JobDetailBean实例
     */

    // tagName其实就是name标签 从XML文件中查找满足条件的JobDetail,并返回
    public synchronized JobDetailBean getJobDetailBean(String jobName, String jobGroup) {
        NodeList tagNodes = document.getElementsByTagName("name");// 得到name标签的集合
        JobDetailBean jobDetailBean = new JobDetailBean();// 创建一个JobDetailBean类型实例
        for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历name标签集合
            if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足name标签的文本内容是和jobDetailName相同,执行下面的语句
                Node parentNode = tagNodes.item(i).getParentNode();// 得到name所在的父节点JobDetail
                NodeList jobDetailNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签name的所有兄弟节点
                for (int j = 0; j < jobDetailNodes.getLength(); j++) {
                    if (jobDetailNodes.item(j).getTextContent().equals(jobGroup)) {
                        // System.out.println("name :"+tagNodes.item(i).getTextContent()+" group :"+jobDetailNodes.item(j).getTextContent());
                        NodeList target = jobDetailNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
                        for (int k = 0; k < target.getLength(); k++) {
                            if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
                                                                                    // (short)1
                                // System.out.println(target.item(k).getNodeName()+"  jobdetail");
                                if (target.item(k).getNodeName().equals("name")) {
                                    jobDetailBean.setName(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("group")) {
                                    jobDetailBean.setGroup(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("description")) {
                                    jobDetailBean.setDescription(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("job-class")) {
                                    jobDetailBean.setJobClass(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("job-state")) {
                                    jobDetailBean.setJobState(target.item(k).getTextContent());
                                }
                            }
                        }
                    }
                }
            }
        }
        return jobDetailBean;
    }

    /**
     * 从XML文件中查找满足条件的Trigger并返回<br>
     *
     * @param jobName
     *            JobDetail中的name<br>
     * @param jobGroup
     *            JobDetail中的group<br>
     * @return 通过该方法可以找到想要找的TriggerBean实例
     */
    public synchronized TriggerBean getTriggerBean(String jobName, String jobGroup) {
        NodeList tagNodes = document.getElementsByTagName("job-name");// 得到job-name标签的集合
        TriggerBean triggerBean = new TriggerBean();// 创建一个TriggerBean类型实例
        for (int i = 0; i < tagNodes.getLength(); i++) {// 遍历job-name标签集合
            if (tagNodes.item(i).getTextContent().equals(jobName)) {// 当满足job-name标签的文本内容是和jobDetailName相同,执行下面的语句
                Node parentNode = tagNodes.item(i).getParentNode();// 得到job-name等于相应值所在的父节点
                NodeList triggerNodes = parentNode.getChildNodes();// 得到该节点的所有子节点,也就是标签job-name的所有兄弟节点
                for (int j = 0; j < triggerNodes.getLength(); j++) {
                    if (triggerNodes.item(j).getTextContent().equals(jobGroup)) {
                        // System.out.println("job-name :"+tagNodes.item(i).getTextContent()+" job-group :"+triggerNodes.item(j).getTextContent());
                        NodeList target = triggerNodes.item(j).getParentNode().getChildNodes();// 所有的兄弟节点
                        for (int k = 0; k < target.getLength(); k++) {
                            if (target.item(k).getNodeType() == Node.ELEMENT_NODE) {// 得到该父节点下所有元素节点
                                // System.out.println(target.item(k).getNodeName()+"  trigger");
                                if (target.item(k).getNodeName().equals("name")) {
                                    triggerBean.setName(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("group")) {
                                    triggerBean.setGroup(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("job-name")) {
                                    triggerBean.setJobName(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("job-group")) {
                                    triggerBean.setJobGroup(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("description")) {
                                    triggerBean.setDescription(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("start-time")) {
                                    triggerBean.setStartTime(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("end-time")) {
                                    triggerBean.setEndTime(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("next-fire-time")) {
                                    triggerBean.setNextFireTime(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("previous-fire-time")) {
                                    triggerBean.setPreviousFireTime(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("repeat-count")) {
                                    triggerBean.setRepeatCount(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("repeat-interval")) {
                                    triggerBean.setRepeatInterval(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("priority")) {
                                    triggerBean.setPriority(target.item(k).getTextContent());
                                } else if (target.item(k).getNodeName().equals("success-triggered")) {
                                    triggerBean.setSuccessTriggered(target.item(k).getTextContent());
                                }
                            }
                        }
                    }
                }
            }
        }
        return triggerBean;
    }

    // 往Quartz.xml中加入新的调度任务
    // 每次创建都是一个从<job><job-detail></job-detail><trigger></trigger></job>的标签

    /**
     * 在表单的表单域中的内容全部填充到JobDetailBean,和TriggerBean中,调用该方法就可以将该Job任务保存到xml中<br>
     *
     */
    public synchronized void createJobElement(JobDetailBean jobDetailBean, TriggerBean triggerBean) {
        Node root = document.getDocumentElement();// 获得根节点<quartz>
        // 在XML中创建JobDetail相关数据的配置信息
        Element job = document.createElement("job");// 创建job标签
        Element jobDetail = document.createElement("job-detail");// 创建job-detail标签
        Element job_Name = document.createElement("name");// 创建name标签
        Text text = document.createTextNode(jobDetailBean.getName());// 创建name的文本
        job_Name.appendChild(text);// 将文本添加到name标签中
        jobDetail.appendChild(job_Name);// 将name添加为job-detail的子标签

        Element job_Group = document.createElement("group");
        text = document.createTextNode(jobDetailBean.getGroup());
        job_Group.appendChild(text);
        jobDetail.appendChild(job_Group);

        Element jobclass = document.createElement("job-class");
        text = document.createTextNode(jobDetailBean.getJobClass());
        jobclass.appendChild(text);
        jobDetail.appendChild(jobclass);

        Element jobState = document.createElement("job-state");
        text = document.createTextNode(jobDetailBean.getJobState());
        jobState.appendChild(text);
        jobDetail.appendChild(jobState);

        Element desc = document.createElement("description");
        text = document.createTextNode(StringUtils.isEmpty(jobDetailBean.getDescription()) ? "" : jobDetailBean.getDescription());
        desc.appendChild(text);
        jobDetail.appendChild(desc);
        job.appendChild(jobDetail);// 将job-detail标签添加为job的子标签

        // 通过前面已经配置了JobDetail,通过JobDatail中的name和group等于Trigger中的jobname、jobgroup找到相应的job,
        // 然后在Job下面创建子标记<cron>或<simple>,再创建Trigger相关数据的配置
        
        Element trigger = document.createElement("trigger");// 创建trigger节点
        Element simple = document.createElement("simple");
        Element name = document.createElement("name");
        text = document.createTextNode(triggerBean.getName());
        name.appendChild(text);
        simple.appendChild(name);

        Element group = document.createElement("group");
        text = document.createTextNode(triggerBean.getGroup());
        group.appendChild(text);
        simple.appendChild(group);

        Element jobNameElement = document.createElement("job-name");
        text = document.createTextNode(triggerBean.getJobName());
        jobNameElement.appendChild(text);
        simple.appendChild(jobNameElement);

        Element jobGroupElement = document.createElement("job-group");
        text = document.createTextNode(triggerBean.getJobGroup());
        jobGroupElement.appendChild(text);
        simple.appendChild(jobGroupElement);

        Element description = document.createElement("description");
        text = document.createTextNode(StringUtils.isEmpty(triggerBean.getDescription()) ? "" : triggerBean.getDescription());
        description.appendChild(text);
        simple.appendChild(description);

        Element startTime = document.createElement("start-time");
        text = document.createTextNode(triggerBean.getStartTime());
        startTime.appendChild(text);
        simple.appendChild(startTime);

        Element priority = document.createElement("priority");
        text = document.createTextNode(triggerBean.getPriority());
        priority.appendChild(text);
        simple.appendChild(priority);
        
        Element repeatCount = document.createElement("repeat-count");
        text = document.createTextNode(triggerBean.getRepeatCount());
        repeatCount.appendChild(text);
        simple.appendChild(repeatCount);
    
        Element repeatInterval = document.createElement("repeat-interval");
        text = document.createTextNode(triggerBean.getRepeatInterval());
        repeatInterval.appendChild(text);
        simple.appendChild(repeatInterval);
    
        Element successTriggered = document.createElement("success-triggered");
        text = document.createTextNode(triggerBean.getSuccessTriggered());
        successTriggered.appendChild(text);
        simple.appendChild(successTriggered);
    
        
        Element endTime = document.createElement("end-time");
        text = document.createTextNode(StringUtils.isEmpty(triggerBean.getEndTime()) ? "" : triggerBean.getEndTime());
        endTime.appendChild(text);
        simple.appendChild(endTime);
    
    
        Element nextFireTime = document.createElement("next-fire-time");
        text = document.createTextNode(StringUtils.isEmpty(triggerBean.getNextFireTime()) ? "" : triggerBean.getNextFireTime());
        nextFireTime.appendChild(text);
        simple.appendChild(nextFireTime);
    
    
        Element preFireTime = document.createElement("previous-fire-time");
        text = document.createTextNode(triggerBean.getPreviousFireTime());
        preFireTime.appendChild(text);
        simple.appendChild(preFireTime);
        
        trigger.appendChild(simple);
        
        job.appendChild(trigger);
        root.appendChild(job);
        doc2XmlFile(getDocument());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值