- 浏览: 54969 次
- 性别:
- 来自: 北京
最新评论
-
ytqwz:
楼主,现在完成的怎么样了
流程图状态机DEMO(附件wf-statemachine-demo.rar下载) -
wersion:
我觉得可以参考下这个 http://www.oschina.n ...
jquery 简易的流程图编辑控件 新版(20100907) -
stephenyindezhi:
联系972002139
jquery 简易的流程图编辑控件 新版(20100907) -
stephenyindezhi:
功能都操作不了啊,我急需这个东西,是我没看懂吗
jquery 简易的流程图编辑控件 新版(20100907) -
西北汉子:
没有意思
jquery 简易的流程图编辑控件 新版(20100907)
这是我写的一个DEOM,目的在于对
jquery 简易的流程图编辑控件 新版(20100907)
的一个流程支持而写的状态机DEMO
表达式使用IK EXPRESSION,以后会支持EL,也可能会支持JS,或者其他的脚本语言
没有测试,默认实现还有错误,以后会更新稳定版本的
下面是其中的部分代码:
package keng.core.workflow.state.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Stack; import java.util.concurrent.TimeoutException; import keng.core.util.StringUtil; import keng.core.workflow.state.ISMActionProcessor; import keng.core.workflow.state.ISMContext; import keng.core.workflow.state.ISMListener; import keng.core.workflow.state.ISMNode; import keng.core.workflow.state.ISMTransition; import keng.core.workflow.state.ISMTransitionMatcher; import keng.core.workflow.state.IStateMachine; import keng.core.workflow.state.StateMachineException; /** * 默认的状态机实现 * * @author 5Di * */ public class DefaultStateMachine implements IStateMachine { /** * 自动节点的默认动作 */ public static final String ACTION_DEFAULT = "send"; /** * 进入循环后的最大循环次数 */ public static final int MAX_DEEPTH = 6; // -------------------- Stack<ISMNode> register = new Stack<ISMNode>(); ISMTransitionMatcher matcher; ISMContext context; ISMActionProcessor processor; List<ISMListener> listeners; /** * 根节点 */ ISMNode nodeMap; boolean strict = false; public DefaultStateMachine(ISMNode nodeMap, ISMContext context) { this.context = context; this.nodeMap = nodeMap; } public DefaultStateMachine(ISMNode nodeMap, ISMContext context, ISMTransitionMatcher matcher) { this.nodeMap = nodeMap; this.context = context; this.matcher = matcher; } public DefaultStateMachine(ISMNode nodeMap, ISMContext context, ISMTransitionMatcher matcher, boolean strict) { this.context = context; this.nodeMap = nodeMap; this.matcher = matcher; this.strict = strict; } @Override public boolean transit(ISMNode node, String action, String state) throws StateMachineException, TimeoutException { if (action == null || action.isEmpty()) throw new IllegalArgumentException("action can not be empty!"); if (StringUtil.isEmpty(state)) throw new IllegalArgumentException("state can not be empty!"); if (node == null) throw new IllegalArgumentException("node can not be null!"); List<ISMTransition> transitions = node.getTransitions(); if (transitions == null || transitions.isEmpty()) throw new StateMachineException("transitions can not be empty !"); // 检查节点图,限制自动节点的转化深度 if (node.isAuto()) if (!checkNodeMap(node)) throw new TimeoutException("die cycle"); boolean b = false; for (ISMTransition transition : transitions) { boolean bool = transit(transition, action, state, node); if (bool) { b = true; if (register.indexOf(node) == -1) register.push(node); this.fireNodeTransit(node, state, transition.getToState()); if (node.isAuto()) this.fireAutoNodeTransit(node, state, transition.getToState()); } } transitNextAutoNodes(node); return b; } /** * 转换 parent的直接下级自动节点<br /> * 当遇到非自动节点时,自动结束 * * @param parent * @throws StateMachineException * @throws TimeoutException */ void transitNextAutoNodes(ISMNode parent) throws StateMachineException, TimeoutException { List<ISMNode> children = parent.getNextAutoNodes(); if (children != null && !children.isEmpty()) { for (ISMNode child : children) { String action = child.getAction(); if (action == null || action.isEmpty()) action = ACTION_DEFAULT; transit(child, action, child.getState()); } } } /** * * @param transition * @param action * @param state * @param node * @return * @throws StateMachineException * @throws TimeoutException * * @return 该transition 是否被执行 */ boolean transit(ISMTransition transition, String action, String state, ISMNode node) throws StateMachineException, TimeoutException { boolean b = matcher.match(context, transition, action, state, strict); this.fireTransitionMatch(action, state, transition, b); if (!b) return false; else { this.fireTransitionMatched(action, state, transition); } // process action processor.process(transition); node.setState(transition.getToState()); return true; } /** * 检查节点图,防止进入死循环<br /> * * @param node * @return 是否成功 */ public boolean checkNodeMap(ISMNode node) { int i = 0; Iterator<ISMNode> it = register.iterator(); while (it.hasNext()) { i = node.equals(it.next()) ? i + 1 : i; } return i <= MAX_DEEPTH; } @Override public boolean removeListener(ISMListener listener) { if (listeners == null || listeners.isEmpty()) return false; if (!listeners.contains(listener)) return false; listeners.remove(listener); return true; } @Override public void addListener(ISMListener listener) { if (listeners == null) listeners = new ArrayList<ISMListener>(); listeners.add(listener); } @Override public boolean existsListener(ISMListener listener) { if (listeners == null || listeners.isEmpty()) return false; return listeners.contains(listener); } /** * 响应事件 * * @param node * @param fromState * @param toState */ void fireNodeTransit(ISMNode node, String fromState, String toState) { if (listeners == null || listeners.isEmpty()) return; for (ISMListener listener : listeners) listener.onNodeTransit(node, fromState, toState); } /** * * @param node * @param fromState * @param toState */ void fireAutoNodeTransit(ISMNode node, String fromState, String toState) { if (listeners == null || listeners.isEmpty()) return; for (ISMListener listener : listeners) listener.onAutoNodeTransit(node, fromState, toState); } /** * 响应事件 * * @param action * @param state * @param transition * @param matched */ void fireTransitionMatch(String action, String state, ISMTransition transition, boolean matched) { if (listeners == null || listeners.isEmpty()) return; for (ISMListener listener : listeners) listener.onTransitionMatch(action, state, transition, matched); } /** * 响应事件 * * @param action * @param state * @param transition */ void fireTransitionMatched(String action, String state, ISMTransition transition) { if (listeners == null || listeners.isEmpty()) return; for (ISMListener listener : listeners) listener.onTransitionMatched(action, state, transition); } }
package keng.core.workflow.state; import java.util.concurrent.TimeoutException; /** * 状态机模型 * * @author 5Di * */ public interface IStateMachine { /** * 执行<br /> * 挨个try transition ,遇到第一个成功,理解返回<br /> * 执行逻辑:先匹配action 和 fromState ,然后calculate condition <br /> * 匹配策略,先匹配action,再匹配fromState,最后是condition<br /> * * @param action * 当前执行的行为 * * @param state * 当前的状态 * @param node * 当前操作的节点 * * @return 是否被执行(如果自动执行的子节点返回了false,也会返回false),false并不说明没有成功,因为如果步骤进入了死循环( * 系统自动执行的的步骤之间会进入死循环) ,在这种情况下不会抛出异常,而是直接返回false */ public boolean transit(String action, String state, ISMNode node) throws StateMachineException, TimeoutException; }
package keng.core.workflow.state; /** * 状态机条件 * * @author 5Di * */ public interface ISMTransition { /** * 条件 * * @return */ public ISMCondition getCondition(); /** * 动作 * * @return */ public String getAction(); /** * 处理器 * * @return */ public ISMActionProcessor getActionProcessor(); /** * 原始状态 * * @return */ public String getFromState(); /** * 目标状态 * * @return */ public String getToState(); }
package keng.core.workflow.state; import java.util.Map; import keng.core.workflow.model.WfStep; import keng.core.workflow.model.WorkFlow; /** * 上下文环境 * @author 5Di * */ public interface ISMContext extends Map<String,Object>{ public WorkFlow getWorkFlow(); public String getAction(); public WfStep getStep(); }
package keng.core.workflow.state;
/** * Action处理器<br /> * 当Transit Transition 的时候,会执行相应的Action处理器,一般实现类会执行特定的业务代码 * * @author 5Di * */ public interface ISMActionProcessor { /** * 处理 * * @return */ public Object process() throws StateMachineException; public void beforeProcess() throws StateMachineException; public void afterProcess() throws StateMachineException; }
其他的还有:ISMNode.java,ISMCondition.java.. 就不贴出来了
下面是DefaultStateMachine.java 是IStateMachine.java的默认实现
package keng.core.workflow.state.impl; import java.util.List; import java.util.Stack; import java.util.concurrent.TimeoutException; import keng.core.util.StringUtil; import keng.core.workflow.state.ISMActionProcessor; import keng.core.workflow.state.ISMCondition; import keng.core.workflow.state.ISMContext; import keng.core.workflow.state.ISMNode; import keng.core.workflow.state.ISMTransition; import keng.core.workflow.state.ISMTransitionMatcher; import keng.core.workflow.state.IStateMachine; import keng.core.workflow.state.StateMachineException; /** * 默认的状态机实现 * * @author 5Di * */ public class DefaultStateMachine implements IStateMachine { Stack<ISMNode> register = new Stack<ISMNode>(); ISMTransitionMatcher matcher; ISMContext context; /** * 根节点 */ ISMNode root; boolean strict = false; public DefaultStateMachine(ISMNode root, ISMContext context) { this.context = context; this.root = root; } public DefaultStateMachine(ISMNode root, ISMContext context, ISMTransitionMatcher matcher) { this.root = root; this.context = context; this.matcher = matcher; } public DefaultStateMachine(ISMNode root, ISMContext context, ISMTransitionMatcher matcher, boolean strict) { this.context = context; this.root = root; this.matcher = matcher; this.strict = strict; } @Override public boolean transit(String action, String state, ISMNode node) throws StateMachineException, TimeoutException { if (StringUtil.isEmpty(action)) throw new IllegalArgumentException("action can not be empty!"); if (StringUtil.isEmpty(state)) throw new IllegalArgumentException("state can not be empty!"); if (node == null) throw new IllegalArgumentException("node can not be null!"); List<ISMTransition> transitions = node.getTransitions(); if (transitions == null || transitions.isEmpty()) throw new StateMachineException("transitions can not be empty !"); // check che node if (checkNodeMap(node)) return false; // Match the transition ISMTransition transition = matchTransition(action, state, transitions); boolean b = false; ISMCondition condition = transition.getCondition(); if (condition == null) if (!strict) b = true; else throw new StateMachineException( "transition's condition can not be null!"); b = condition.calculate(context, strict); if (!b) throw new TimeoutException("no transition was matched!"); // process action ISMActionProcessor processor = transition.getActionProcessor(); processor.process(); register.push(node); // auto process next auto steps List<ISMNode> children = node.getChildren(); if (children != null && !children.isEmpty()) { for (ISMNode child : children) { transit(action, state, child); } } node.setState(transition.getToState()); return true; } /** * 匹配transition <br /> * 使用<code>keng.core.workflow.state.ISMTransitionMatcher.match</code>匹配 * * @param action * @param state * @param transitions * @return */ ISMTransition matchTransition(String action, String state, List<ISMTransition> transitions) { if (matcher == null) matcher = new DefaultSMTransitionMatcher(); transitions = matcher.sort(transitions); int i, len = transitions.size(); for (i = 0; i < len; i++) { ISMTransition transition = transitions.get(i); if (matcher.match(action, state, transition)) return transition; } return null; } /** * 检查节点图,是否进入了死循环<br /> * 目前还不完备,只是检查了已经执行过的node * * @param node * @return 如果已经执行,返回true */ public boolean checkNodeMap(ISMNode node) { return register.indexOf(node) != -1; } }
目前还处于DEMO 状态,如果大家有想要说的,尽管拍砖,共同进步
最后,给大家提供两个工作流方面的资料
《工作流模型分析》和《工作流管理联盟规范》
- wf-statemachine-demo.rar (8.5 KB)
- 下载次数: 63
- 工作流模型分析_workflow_model_fox999.pdf (163.4 KB)
- 下载次数: 61
- 工作流管理联盟规范(接口1)XPDL.pdf (617.7 KB)
- 下载次数: 48
发表评论
-
统一认证平台设计方案
2011-02-15 18:53 0fdsafdada -
Ruby 学习笔记 第一~~~~
2010-12-26 21:50 864Roby 学习笔记 1>: 关于类 class ... -
uncaught exception: [Exception... "Component returned failure code: 0x804b000f [
2010-12-10 10:33 1195直入正题吧: uncaught exception: [Ex ... -
JQuery学习笔记
2010-12-05 13:03 1039JQuery学习笔记 在回北京的火车上,闲来无事 ... -
DotX项目中工作流的现状与未来目标
2010-09-15 19:40 964目前的工作流开发状态如下图,基于WEB的流程图编辑器的支持目前 ... -
关于jquery widget插件模式的几点思考
2010-09-12 14:53 1927widget是jqueryui 提供的内 ... -
工作流中的有限状态机 以及 近期动态(共计三个项目)
2010-09-12 14:07 1557关于状态机的定义: ... -
对jQuery做的修改
2010-09-07 21:55 1384jQuery 基本库确实给我们带来了很多的方便,但是因为其fn ... -
jquery 简易的流程图编辑控件 新版(20100907)
2010-09-07 12:33 17684上次 发了一篇:jquery 简易的流程图编辑控件 ... -
jquery 简易的流程图编辑控件
2010-07-15 18:29 3353已经更新: jquery 简易的流程图编辑控件 新版(2010 ...
相关推荐
管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程.doc
液态状态机 (LSM) 是一种使用时间神经元进行计算的方法,与标准人工神经网络不同,它可用于直接对固有时间数据进行分类。 它也被提出作为某些大脑功能的自然模型。 通过这段代码,我们表明通常由 Maass 等人定义的...
微信小程序Demo-demo-附完整源代码.rar 资源介绍 本资源是一个完整的小程序示例,名为“Demo-demo”,包含了微信小程序的所有基本功能和页面。它非常适合初学者和开发者用来学习和实践微信小程序的开发技巧。该资源...
1 下载固件 upd pcl6 x32 5 9 0 18326 以及 M1520 MFP Series FW Update 20130923 并卸载惠普打印机的各种驱动 2 解压至C盘根目录 3 选择USB模式 4 关闭电源 连接USB至电脑 选择 HP Universal Printing PCL6...
状态机演示程序。开始时,开始按钮点亮,点击下一步,表示状态的布尔灯顺序点亮,点击下一步,按照状态三、二、一变化。
通用有限状态机(FSM: Finite-state machine)自动代码生成器. 可以根据配置文件,自动生成状态机代码(C++)。配置文件中只需要定义状态,跃迁条件。然后完善每个状态的动作即可。省去开发过程中手写状态机的麻烦。...
stateflow逻辑系统建模的部分程序-stateflow.rar 文件中包含流程图、在动作中执行事件、状态执行顺序三个文件夹和一个word文档,简介如下: 流程图包含: stateflow_xuanzejiegou.mdl--------用stateflow搭建...
**微信小程序Demo-PigRaising-master:一个全面且可定制的养猪管理应用** 微信小程序Demo-PigRaising-master是一个基于微信平台的养猪管理应用,旨在帮助养殖户更高效、便捷地管理猪场的日常事务。本应用提供了从...
python入门教程-09-状态码介绍.ev4.rar
labview状态机查询机制,各种状态的跳转机制
状态机设计-英文-如何编写状态机-case
入门要安装Python状态机,请在您的终端中运行以下命令: $ pip install python-statemachine 定义您的状态机: >>> from statemachine import StateMachine, State>>> class TrafficLightMachine ( StateMachine ):....
Atom-atom-state-machine-cat-preview.zip,用于编写(和预览)漂亮的状态机图表的atom包atom状态机cat预览包,atom是一个用web技术构建的开源文本编辑器。
基于状态机的伪造源地址验证,刘冰洋,毕军,源地址伪造使得很多互联网安全问题更加难以治理。本文提出了SMA,一种基于状态机的自治域级别的源地址验证方法。在SMA中,每个有序
状态栏打字机.rar状态栏打字机.rar状态栏打字机.rar状态栏打字机.rar状态栏打字机.rar状态栏打字机.rar
一本很不错的英文资料,老外写的关于FPGA 状态机的编程思想。 ABSTRACT This paper details efficient Verilog coding styles to infer synthesizable state machines. HDL considerations such as advantages and ...
主要介绍了,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2018年中国母婴用户生活状态白皮书-2019.1-37页.rar
MyStateMachine:状态机,根据需求实现AbstractStateMachine|StateMachine|AbstractUntypedStateMachine StateListener:自定义监听器,可实现相应方法或使用注解定义监听事件 StateMaker:自定义决策类,用于实现多...