package com.dy.rtuMw.server.rtuData; 
 | 
  
 | 
import org.apache.logging.log4j.LogManager; 
 | 
import org.apache.logging.log4j.Logger; 
 | 
  
 | 
import java.text.ParseException; 
 | 
  
 | 
/** 
 | 
 * 部分实现Task 
 | 
 */ 
 | 
public abstract class TaskSurpport implements Task { 
 | 
  
 | 
    private static final Logger log = LogManager.getLogger(TaskSurpport.class.getName()) ; 
 | 
     
 | 
    //当前所处理的上行数据所属RTU的地址 
 | 
    //public String rtuAddr_inRootTk ;//只在根root任务对象上会付此值 
 | 
    //本节点配置 
 | 
    protected TaskConfig conf ; 
 | 
    //根任务 
 | 
    protected TaskSurpport root ; 
 | 
    //本任务的子任务 
 | 
    protected TaskSurpport[] subTasks ; 
 | 
    //本任务的处理结果 
 | 
    protected Object[] taskResult ; 
 | 
  
 | 
    /** 
 | 
     * 执行节点任务 
 | 
     * @param data 需要处理的数据 
 | 
     */ 
 | 
    @Override 
 | 
    public abstract void execute(Object data) throws ParseException; 
 | 
     
 | 
    /** 
 | 
     * 任务采用对象池,以便重用任务对象, 
 | 
     * 重用前要进行对象初始化,清除上次执行任务时遗留的对象属性数据 
 | 
     * 初始化本任务及所有子任务 
 | 
     */ 
 | 
    @Override 
 | 
    public void cleanMeAndSubs() { 
 | 
        //rtuAddr_inRootTk = null ; 
 | 
        taskResult = null ; 
 | 
        if(this.subTasks != null && this.subTasks.length > 0){ 
 | 
            for(int i = 0 ; i < this.subTasks.length; i++){ 
 | 
                this.subTasks[i].cleanMeAndSubs() ; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 得到本任务节点处理产生的中间结果,以供本节点所在树枝的下级任务节点及本树枝的左侧(根在上)所有树枝的节点应用本结果 
 | 
     * @return 
 | 
     */ 
 | 
    @Override 
 | 
    public Object[] getMyResults(){ 
 | 
        return taskResult ; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * 得到指定任务节点处理产生的中间结果,以供本节点所在树枝的下级任务节点及本树枝的左侧(根在上)所有树枝的节点应用本结果 
 | 
     * @param id 指定任务ID 
 | 
     * @return 
 | 
     */ 
 | 
    public Object[] getTaskResults(String id){ 
 | 
        if(root != null){ 
 | 
            return this.getTaskResults(root, id) ; 
 | 
        } 
 | 
        return null ; 
 | 
    } 
 | 
    private Object[] getTaskResults(TaskSurpport task, String id){  
 | 
        if(task != null && task.conf != null && task.conf.id != null && task.conf.id.equals(id)){ 
 | 
            return task.getMyResults() ; 
 | 
        }else{ 
 | 
            if(task.subTasks != null && task.subTasks.length > 0){ 
 | 
                Object[] rs = null ; 
 | 
                for(int i = 0 ; i < task.subTasks.length; i++){ 
 | 
                    rs = getTaskResults(task.subTasks[i], id) ; 
 | 
                    if(rs != null){ 
 | 
                        return rs ; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return null ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 转下级任务节点处理,首先要实体化所有子节点。 
 | 
     * @param data 需要处理的数据 
 | 
     */ 
 | 
    @Override 
 | 
    public void toNextTasks(Object data) { 
 | 
        try { 
 | 
            if(subTasks != null && subTasks.length > 0){ 
 | 
                for(int i = 0 ; i < subTasks.length ; i++){ 
 | 
                    if(subTasks[i].conf.enable){ 
 | 
                        subTasks[i].execute(data) ; 
 | 
                    }else{ 
 | 
                        //本节点不起作用,直接进入本节的子节点 
 | 
                        subTasks[i].toNextTasks(data) ; 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            log.error("向下级任务传递工作时出错," , e); 
 | 
        }finally{ 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 转下级某个任务节点处理  
 | 
     * @param data 需要处理的数据 
 | 
     * @param id 指定任务ID 
 | 
     */ 
 | 
    public void toNextOneTask(Object data, String id){ 
 | 
        try { 
 | 
            if(subTasks != null && subTasks.length > 0){ 
 | 
                for(int i = 0 ; i < subTasks.length ; i++){ 
 | 
                    if(subTasks[i].conf.id.equals(id)){ 
 | 
                        if(subTasks[i].conf.enable){ 
 | 
                            subTasks[i].execute(data) ; 
 | 
                        }else{ 
 | 
                            //本节点不起作用,直接进入本节的子节点 
 | 
                            subTasks[i].toNextTasks(data) ; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            log.error("向指定子任务(" + id + ")传递任务时出错," , e); 
 | 
        }finally{ 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |