| 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{ | 
|         } | 
|     } | 
|   | 
| } |