﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java神谕-随笔分类-JBPM</title><link>http://www.blogjava.net/javaora/category/3413.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:25:12 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:25:12 GMT</pubDate><ttl>60</ttl><item><title>Hibernate的subclass用法</title><link>http://www.blogjava.net/javaora/archive/2005/10/03/14688.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Mon, 03 Oct 2005 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/10/03/14688.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/14688.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/10/03/14688.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/14688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/14688.html</trackback:ping><description><![CDATA[　　看到jBPM中大量使用了subclass的用法，应该说这个是比较OO的，设计的非常合理。<BR>　　(一)、首先先去看看Hibernate的subclass：<BR>　　1.对于“每一个类继承树对应一个表”的策略来说，就需要使用&lt;subclass&gt;定义。<BR>　　&lt;subclass&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="className"&nbsp; //子类的全名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discriminator-value="discriminator-value"　//辨别标识，一个用于区分每个独立的子类的值<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy="proxyInterface" //指定一个类或接口，在延迟加载时作为代理使用<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazy="true|false"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dynamic-update="true|false"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamic-insert="true|false"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entity-name="entityName"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node="element-name"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property ..../&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;<BR>　　2.每个子类都应该定义它自己的持久化属性和子类。&lt;version&gt;和&lt;id&gt;属性可以从根父类继承下去。在一棵继承树上的每个子类都必须定义一个唯一的discriminator-value。如果没有指定，就会使用Java类的全限定名。<BR>　　3.必须在子类的影射中指定extends属性来指定已影射的超类。<BR><BR>　(二)在jBPM中的使用<BR>　1.在jBPM的definition组的类机构中就采用上述的技术。其中ModuleDefinition是作为抽象父类存在的，而ContextDefinition、FileDefinition、LoggingDefinition、SchedulerDefinition、MgmtDefinition类是做为subclass存在的。<BR>　2.在父类中使用了discriminator鉴别器的技术：在继承策略中的“<STRONG>一个对象继承树应对应一个表</STRONG>”的策略中，&lt;discriminator&gt;元素是必须的。鉴别器字段包含标志值，用于告知持久层应该为某个特定的行创建哪一个类别的实例。例如：<BR>&nbsp; 父类的影射片段：<BR>&nbsp;&nbsp;&nbsp; &lt;discriminator type="char" column="CLASS_"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- M : org.jbpm.module.def.ModuleDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- C : org.jbpm.context.def.ContextDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- F : org.jbpm.file.def.FileDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- L : org.jbpm.logging.def.LoggingDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- I : org.jbpm.scheduler.def.SchedulerDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- T : org.jbpm.taskmgmt.def.TaskMgmtDefinition --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; :&nbsp; --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; :&nbsp; --&gt;<BR>　3.<STRONG>鉴别器字段的实际值是根据&lt;class&gt;和&lt;subclass&gt;元素中的discriminator-value属性得来的</STRONG>。<BR>　例如：<BR>　　父影射文件：<BR>　　&lt;class name="org.jbpm.module.def.ModuleDefinition" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table="JBPM_MODULEDEFINITION"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract="true" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; discriminator-value="M"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazy="false"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子影射文件：<BR>　　&lt;subclass name="org.jbpm.context.def.ContextDefinition" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends="org.jbpm.module.def.ModuleDefinition" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; discriminator-value="C" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lazy="false"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;<BR><img src ="http://www.blogjava.net/javaora/aggbug/14688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-10-03 10:22 <a href="http://www.blogjava.net/javaora/archive/2005/10/03/14688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm包的JbpmConfiguration类</title><link>http://www.blogjava.net/javaora/archive/2005/10/02/14641.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 02 Oct 2005 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/10/02/14641.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/14641.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/10/02/14641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/14641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/14641.html</trackback:ping><description><![CDATA[<P>　　有一阵没有看jBPM的source了，正好这几天是国庆，口袋也没有多少米，没有出去旅游的计划，所以，又重新研究分析一下src。希望从中可以学习到有用的东东！<BR>　　JbpmConfiguration，从名字上就知道是获取jBPM的相关配置信息。不过这里写的是一个公共的获取properties的方法。<BR>　　首先声明了一个static properties（静态属性）的实例properties,然后使用静态方法getProperties（），为properties获得具体的值（取org.jbpm.jbpm.properties）。<BR>　　然后是N多获取方法：<BR>　　public static String getString(String key)<BR>　　public static String getString( String key, String defaultValue )　//如果没有这个值，默认返回的是defaultValue<BR>　　public static long getLong( String key, long defaultValue )<BR>　　public static boolean getBoolean(String key, boolean defaultValue)<BR>　　public static Object getObject(String key)<BR>　　public static Object getObject(String key, Object defaultValue)&nbsp;&nbsp;&nbsp; <BR>　　这些为获取String、long、boolean、Object提供基础的支持，为以后的操作提供了很多的方便。</P><img src ="http://www.blogjava.net/javaora/aggbug/14641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-10-02 10:52 <a href="http://www.blogjava.net/javaora/archive/2005/10/02/14641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Task management 任务管理</title><link>http://www.blogjava.net/javaora/archive/2005/09/22/13759.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Thu, 22 Sep 2005 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/22/13759.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13759.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/22/13759.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13759.html</trackback:ping><description><![CDATA[<P>Task management 任务管理<BR>The core business of jBPM is the ability to persist the execution of a process. A situation in which this feature is extremely useful is the management of tasks and tasklists for people. jBPM allows to specify a piece of software describing an overall process which can have wait states for human tasks.<BR>jBPM的核心逻辑是有能力持久化流程的执行。一个为人们用来管理任务和任务列表的特征的情形是非常有用的。jBPM允许指定一些软件描述一个全面的流程，它可以为人任务拥有等待状态。</P>
<P>9.1. Tasks 任务<BR>Tasks are part of the process definition and they define how task instances must be created and assigned during process executions.<BR>任务是流程定义的一部分，并且他们定义了任务实例如何在流程执行中必须被创建并且委派。</P>
<P>Tasks can be defined in task-nodes and in the process-definition. The most common way is to define one or more tasks in a task-node. In that case the task-node represents a task to be done by the user and the process execution should wait until the actor completes the task. When the actor completes the task, process execution should continue. When more tasks are specified in a task-node, the default behaviour is to wait for all the tasks to complete. <BR>任务可以在task-nodes和process-definition中被定义。最常用的方式是在task-node中定义一个或多个任务。如果是那样的话，task-node表现一个任务被用户执行并且流程执行应该等待知道actor完成这个任务。当这个actor完成这个任务，流程定义应该继续。当更多任务在task-node被定义，缺省的行为是等待所有任务的完成。</P>
<P>Tasks can also be specified on the process-definition. Tasks specified on the process definition can be looked up by name and referenced from within task-nodes or used from inside actions. In fact, all tasks (also in task-nodes) that are given a name can be looked up by name in the process-definition. <BR>任务也被定义在process-definition中。指定在流程定义上的任务可以通过名称查询并且参考从内部的task-nodes或者从内部actions中使用。事实上，所有的给定名称任务（也在task-nodes）可以在流程定义中通过名字查询。</P>
<P>Task names must be unique in the whole process definition. Tasks can be given a priority. This priority will be used as the initial priority for each task instance that is created for this task. TaskInstances can change this initial priority afterwards.<BR>任务名称在整个流程定义中是非重复。任务可以被指定一个优先权。这个优先权将被使用在初始化优先权为每个为任务创建的流程实例。任务实例然后可以修改初始化优先权</P>
<P>9.2. Task instances<BR>A task instance can be assigned to an actorId (java.lang.String). All task instances are stored in one table of the database (JBPM_TASKINSTANCE). By querying this table for all task instances for a given actorId, you get the task list for that perticular user. <BR>一个任务实例可以被委派给一个actorId(java.lang.String).所有任务实例被储存在数据库的一个表中(JBPM_TASKINGSTANCE)。通过给定的actorId来对所有的任务实例查询这个表，你为特定用户得到任务列表。</P>
<P>The jBPM task list mechanism can combine jBPM tasks with other tasks, even when those tasks are unrelated to a process execution. That way jBPM developers can easily combine jBPM-process-tasks with tasks of other applications in one centralized task-list-repository. </P>
<P>这个jBPM任务列表机制可以组合jBPM任务和其他任务，甚至当这些任务于流程执行无关。那种方法jBPM开发者可以很容易的在一个集中的任务列表仓库中组合jBPM流程任务和其他应用程序。</P>
<P>9.2.1. Task instance life cycle<BR>The task instance lifecycle is straightforward: After creation, task instances can optionally be started. Then, task instances can be ended, which means that the task instance is marked as completed.<BR>任务实例生命周期是简单的：创建之后，任务实例可以随意地开始。接着，任务实例可以被终结，这意味着任务实例内标志为完成。</P>
<P>Note that for flexibility, assignment is not part of the life cycle. So task instances can be assigned or not assigned. Task instance assignment does not have an influence on the task instance life cycle.</P>
<P>注意对适应性、委派不是生命周期的组成部分。所以任务实例可以被委派或者不委派。任务实例委派在生命周期任务实例中没有影响。</P>
<P>Task instances are typically created by the process execution entering a task-node (with the method TaskMgmtInstance.createTaskInstance(...)). Then, a user interface component will query the database for the tasklists using the TaskMgmtSession.findTaskInstancesByActorId(...). Then, after collecting input from the user, the UI component calls TaskInstance.assign(String), TaskInstance.start() or TaskInstance.end(...). </P>
<P>TaskMgmtInstance.createTaskInstance(...) <BR>TaskMgmtSession.findTaskInstancesByActorId(...)<BR>TaskInstance.assign(String)<BR>TaskInstance.start()<BR>TaskInstance.end()<BR><BR>A task instance maintains it's state by means of date-properties : create, start and end. Those properties can be accessed by their respective getters on the TaskInstance.<BR>一个任务实例维护它的状态借助于日期属性：create,start 和end. 这些属性可以在任务实例中通过他们分别的getter获得通道。</P>
<P>Currently, completed task instances are marked with an end date so that they are not fetched with subsequent（随后） queries for tasks lists. But they remain in the JBPM_TASKINSTANCE table. JBPM_TASKINSTANCE.</P>
<P>9.2.2. Task instances and graph execution 任务实例和图形执行<BR>Task instances are the items in an actor's tasklist. Task instances can be signalling. A signalling task instance is a task instance that, when completed, can send a signal to its token to continue the process execution. Task instances can be blocking, meaning that the related token (=path of execution) is not allowed to leave the task-node before the task instance is completed. By default task instances are signalling and non-blocking. </P>
<P>In case（以防） more than one task instance are associated with a task-node, the process developer can specify how completion of the task instances affects continuation of the process. Following is the list of values that can be given to the signal-property of a task-node.</P>
<P><STRONG>last</STRONG>: This is the default. Proceeds execution when the last task instance is completed. When no tasks are created on entrance of this node, execution is continued.<BR><STRONG>last-wait</STRONG>: Proceeds execution when the last task instance is completed. When no tasks are created on entrance of this node, execution waits in the task node till tasks are created.<BR><STRONG>first:</STRONG> Proceeds execution when the first task instance is completed. When no tasks are created on entrance of this node, execution is continued.<BR><STRONG>first-wait</STRONG>: Proceeds execution when the first task instance is completed. When no tasks are created on entrance of this node, execution waits in the task node till tasks are created.<BR><STRONG>unsynchronized</STRONG>: Execution always continues, regardless wether tasks are created or still unfinished.<BR>never: Execution never continues, regardless wether tasks are created or still unfinished.<BR>Task instance creation might be based upon a runtime calculation. In that case, add an ActionHandler on the node-enter event of the task-node and set the attribute create-tasks="false". Here is an example of such an action handler implementation: </P>
<P>public class CreateTasks implements ActionHandler {<BR>&nbsp; public void execute(ExecutionContext executionContext) throws Exception {<BR>&nbsp;&nbsp;&nbsp; Token token = executionContext.getToken();<BR>&nbsp;&nbsp;&nbsp; TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; TaskNode taskNode = (TaskNode) executionContext.getNode();<BR>&nbsp;&nbsp;&nbsp; Task changeNappy = taskNode.getTask("change nappy");</P>
<P>&nbsp;&nbsp;&nbsp; // now, 2 task instances are created for the same task.<BR>&nbsp;&nbsp;&nbsp; tmi.createTaskInstance(changeNappy, token);<BR>&nbsp;&nbsp;&nbsp; tmi.createTaskInstance(changeNappy, token);<BR>&nbsp; }<BR>}<BR>As shown in the example the tasks to be created can be specified in the task-node. They could also be specified in the process-definition and fetched from the <STRONG>TaskMgmtDefinition</STRONG>. TaskMgmtDefinition extends the ProcessDefinition with task management information.</P>
<P>The API method for marking task instances as completed is <STRONG>TaskInstance.end().</STRONG> Optionally, you can specify a transition in the end method. In case the completion of this task instance triggers continuation of the execution, the task-node is left over（延迟） the specified transition.</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/javaora/aggbug/13759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-22 18:02 <a href="http://www.blogjava.net/javaora/archive/2005/09/22/13759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>script脚本</title><link>http://www.blogjava.net/javaora/archive/2005/09/20/13527.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Tue, 20 Sep 2005 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/20/13527.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13527.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/20/13527.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13527.html</trackback:ping><description><![CDATA[<P>script脚本：<BR>一个script是一个执行BeanShell脚本的action。缺省地，所有流程定义变量都是合法的并且无脚本变量将被写入流程变量。下列脚本变量也是合法的：<BR>executionContext<BR>token<BR>node<BR>task<BR>taskInstance</P>
<P>&lt;process-definition&gt;<BR>&nbsp; &lt;event type="node-enter"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;script&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("this script is enering node"+node);<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/script&gt;<BR>&nbsp; &lt;/event&gt;<BR>&nbsp; ...<BR>&lt;/process-definition&gt;</P>
<P>为定制缺省加载行为并且储存变量进script，变量元素可以被用来作为script的子元素。那样，脚本表达式不得不被放入一个脚本的子元素:expression</P>
<P>&lt;prcession-definition&gt;<BR>&nbsp; &lt;event type="process-end"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;expression&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = b+c;<BR>&nbsp;&nbsp;&nbsp; &lt;/expression&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;variable name="XXX" access="write" mapped-name="a"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;variable name="YYY" access="read" mapped-name="b"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;variable name="ZZZ" access="read" mapped-name="c"/&gt;<BR>&nbsp; &lt;/event&gt;<BR>&lt;/prcession-definition&gt;</P>
<P>在脚本开始之前，这个流程变量YYY和ZZZ将分别作为脚本变量b和c使其合法。所有脚本完成之后，脚本变量值a被存储进流程变量XXX.</P>
<P>如果access变量属性包含"read"，这个流程变量在脚本赋值之前将被加载作为一个脚本变量。如果access变量属性包含"write"，这个流程变量在脚本赋值以后将被加载作为一个脚本变量。</P><img src ="http://www.blogjava.net/javaora/aggbug/13527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-20 15:42 <a href="http://www.blogjava.net/javaora/archive/2005/09/20/13527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nodetype节点类型</title><link>http://www.blogjava.net/javaora/archive/2005/09/20/13496.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Tue, 20 Sep 2005 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/20/13496.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13496.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/20/13496.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13496.html</trackback:ping><description><![CDATA[<P>Nodetype task-node 节点类型 任务节点<BR>A task node represents one or more tasks that are to be performed by humans. So when execution arrives in a task node, task instances will be created in the task lists of the workflow participants. After that, the node will behave as a wait state. So when the users perform their task, the task completion will trigger the resuming of the execution. In other words, that leads to a new signal being called on the token. <BR>　　一个任务节点表现为被人所运行的一个或多个任务。所以当执行到达一个任务节点，任务实例将被创建在工作流创建者业务列表中。毕竟，这个节点将作为一个等待状态。所以当用户运行他们的任务，这个任务完成将触发执行的恢复。换言之，那导致一个新的标记在那个toke上被呼叫。</P>
<P>7.3.3. Nodetype state&nbsp; 节点类型　状态<BR>A state is a bare-bones wait state. The difference with a task node is that no task instances will be created in any task list. This can be usefull if the process should wait for an external system. E.g. upon entry of the node (via an action on the node-enter event), a message could be sent to the external system. After that, the process will go into a wait state. When the external system send a response message, this can lead to a token.signal(), which triggers resuming of the process execution.<BR>　　一个状态是裸骨等待状态。这个不同一个任务节点的是没有任务实例将被创建在任务任务列表中。这可以是有用的，如果流程应当为外部系统等待。例如，在节点实体之上（依靠在节点进入事件的一个动作），一个消息将被发送到外部系统。毕竟，这个流程将进入等待状态。当外部系统发送一个返回信息，这可以导致token.signal(),这将触发一个流程执行的恢复。</P>
<P>7.3.4. Nodetype decision　节点类型　决定<BR>Actually there are 2 ways to model a decision. The distinction between the two is based on *who* is making the decision. Should the decision made by the process (read: specified in the process definition). Or should an external entity provide the result of the decision.<BR>　　实际上这里有两种方法来创建一个决定。两者的区别是基谁在做这个决定。　应该被流程来决定。（限定在流程定义中）或者应该一个外部实体支持决定的结果。</P>
<P>When the decision is to be taken by the process, a decision node should be used. There are basically 2 ways to specify the decision criteria. Simplest is by adding condition elements on the transitions. Conditions are beanshell script expressions that return a boolean. At runtime the decision node will loop over its leaving transitions (in the order as specified in the xml), and evaluate each condition. The first transition for which the conditions resolves to 'true' will be taken. Alternatively, an implementation of the DecisionHandler can be specified. Then the decision is calculated in a java class and the selected leaving transition is returned by the decide-method of the DecisionHandler implementation.<BR>　　当这个决定被流程执行，一个决定节点应该被使用。这里有两个基本方法来限定决定标准。最简单是在跃迁上增加条件因素。条件是Beanshell脚本表达式返回一个boolean值。在运行时这个决定节点将循环离开跃迁（顺序和xml定义的一样）。一个DecisionHandler的实现被定义是可选择的。那么，决定被计算在java类中并且选择离开跃迁被DecisionHandler实现的决定方法返回。</P>
<P>When the decision is taken by an external party (meaning: not part of the process definition), you should use multiple transitions leaving a state or wait state node. Then the leaving transition can be provided in the external trigger that resumes execution after the wait state is finished. E.g. Token.signal(String transitionName) and TaskInstance.end(String transitionName). <BR>　　当这个决定被外部执行（意味着：不是流程定义部分），你应该使用多跃迁离开一个状态或等待节点。那么这个离开跃迁在外部的除法器可以被支持恢复执行，在等待状态完成后。例如，Token.signal(String transitionName) 和TaskInstance.end(String transitionName).<BR>7.3.5. Nodetype fork 节点类型　叉<BR>A fork splits one path of execution into multiple concurrent paths of execution. The default fork behaviour is to create a child token for each transition that leaves the fork, creating a parent-child relation between the token that arrives in the fork.<BR>一个叉分离一个路径执行到多个并行的执行路径。这个缺省的叉行为是为每个离开叉跃迁创建一个子token，创建一个到达叉中父－子关系。</P>
<P>7.3.6. Nodetype join 节点类型　合并<BR>The default join assumes that all tokens that arrive in the join are children of the same parent. This situation is created when using the fork as mentioned above and when all tokens created by a fork arrive in the same join. A join will end every token that enters the join. Then the join will examine the parent-child relation of the token that enters the join. When all sibling tokens have arrived in the join, the parent token will be propagated over the (unique!) leaving transition. When there are still sibling tokens active, the join will behave as a wait state.<BR>缺省的合并假设所有的token到达合并点，这些都都是相同父的子。这个情形被创建如我们以上提到的使用叉并且当所有被fork创建的所有token到达相同的join.　一个join将结束每个进入join的token.　那么这个join将检查进入join的token父－子关系。当所有的兄弟姐们tokens激活，这个离开的跃迁join将传播。当这里还有兄弟tokens激活，这个join将作为一个等待状态。</P>
<P>7.3.7. Nodetype node　节点类型　节点<BR>The type node serves the situation where you want to write your own code in a node. The nodetype node expects one subelement action. The action is executed when the execution arrives in the node. The code you write in the actionhandler can do anything you want but it is also responsible for propagating the execution. <BR>节点类型服务在你想写你自己的代码在节点中。这个节点类型节点期待一个子元素行为。这个行为被执行当所有执行到达这个节点。在actionHandler中你写的代码可以做你想做的任何事情，当时它是也是一个责任为执行传播。</P>
<P>This node can be used if you want to use a JavaAPI to implement some functional logic that is important for the business analyst. By using a node, the node is visible in the graphical representation of the process. For comparison, actions --covered next-- will allow you to add code that is invisible in the graphical representation of the process, in case that logic is not important for the business analyst. <BR>这个节点可以被使用，如果你将使用JavaAPI来实现一些功能逻辑，对逻辑分析是重要的. 作为使用一个node,node 是可以视的在流程图形表现中。为对比，actions-convered next--将允许在流程图形表现中增加不可见的代码，万一对你逻辑分析是不重要的</P>
<P><BR>&nbsp;</P><img src ="http://www.blogjava.net/javaora/aggbug/13496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-20 10:25 <a href="http://www.blogjava.net/javaora/archive/2005/09/20/13496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.indentity.xml包之 IdentityXmlParser类</title><link>http://www.blogjava.net/javaora/archive/2005/09/19/13456.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Mon, 19 Sep 2005 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/19/13456.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13456.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/19/13456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13456.html</trackback:ping><description><![CDATA[<P>三个字段：<BR>1. List&nbsp; entities<BR>2. Map user<BR>3. Map groups<BR>这个类主要从一个流文件中获得<BR>users用户列表&nbsp;&nbsp;Map列表 &nbsp;name&lt;key&gt;,user&lt;value&gt;。 user : name email password<BR>组列表&nbsp;&nbsp; Map列表 &nbsp;name&lt;key&gt;,group&lt;value&gt;。 group : name type<BR>父组列表 <BR>memberships列表<BR><BR>这个类主要用来解析XML流中的用户 组 父组 以及会员等等操作的。</P><img src ="http://www.blogjava.net/javaora/aggbug/13456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-19 21:51 <a href="http://www.blogjava.net/javaora/archive/2005/09/19/13456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Token-ProcessInstance-ProcessDefinition-ContextInstance-TaskInstance杂记</title><link>http://www.blogjava.net/javaora/archive/2005/09/19/13377.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Mon, 19 Sep 2005 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/19/13377.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13377.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/19/13377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13377.html</trackback:ping><description><![CDATA[<P>Class Token<BR>represents one path of execution and maintains a pointer to a node in the ProcessDefinition. Most common way to get a hold of the token objects is with ProcessInstance.getRootToken() or ProcessInstance.findToken(String). <BR>在流程定义中表现一个执行路径和维持一个指示器给一个节点。<BR>ProcessInstance.getRootToken() <BR>ProcessInstance.findToken(String)</P>
<P>signal() <BR>&nbsp;&nbsp;&nbsp; provides a signal to the token. this method activates this token and leaves the current state over the default transition.<BR>&nbsp;&nbsp;&nbsp; 准备一个信号给标记。这个方法激活这个标记并且离开当前的状态越过缺省的跃迁。<BR>------------------------------------<BR>Class ProcessInstance<BR>is one execution of a ProcessDefinition. To create a new process execution of a process definition, just use the ProcessInstance(ProcessDefinition). <BR>是一个流程定义的执行。<BR>ProcessInstance(ProcessDefinition)<BR>---------------------------------------<BR>Class ProcssDefinition<BR>创建一个ProcessDefinition<BR>parseParResource(String parResource)<BR>parseParZipInputStream(ZipInputStream zipInputStream)<BR>parseXmlInputStream(InputStream inputStream)<BR>parseXmlReader(Reader reader)<BR>parseXmlResource(String resource)<BR>parseXmlString(String string)<BR>-----------------------------<BR>Class ContextInstance<BR>maintains all the key-variable pairs for a process instance. You can obtain a ContextInstance from a processInstance from a process instance like this : <BR>&nbsp;ProcessInstance processInstance = ...;<BR>&nbsp;ContextInstance contextInstance = processInstance.getContextInstance();<BR>为流程实例维持所有的key-variable对。</P>
<P>ContextInstance&nbsp; contextInstance = ProcessInstance.getContextInstance();<BR>contextInstance.setVariable("amount",new Integer(500));<BR>contextInstance.setVariable("reason","I met my deadline");</P>
<P>--------------------------<BR>任务节点：<BR>&lt;task-node name="t"&gt;<BR>&nbsp; &lt;task name="change nappy"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;assignment&nbsp; class="org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler"/&gt;<BR>&nbsp; &lt;/task&gt;<BR>&nbsp; &lt;transition to="end"&gt;<BR>&lt;/task-node&gt;</P>
<P>TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();</P>
<P>taskInstance.end(); //标志这个任务已经结束</P>
<P>--------------------------------------------</P><img src ="http://www.blogjava.net/javaora/aggbug/13377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-19 11:49 <a href="http://www.blogjava.net/javaora/archive/2005/09/19/13377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity.security包</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13311.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13311.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13311.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13311.html</trackback:ping><description><![CDATA[<P>security安全包应该是identity身份模块中很重要的组成部分，其中主要包含以下类：<BR>一、AuthenticatedUser认证用户类：其中很简单，就是gettter和setter 方法，设置和获取authenticatedUser。<BR>&nbsp;　　其中的authenticatedUser是一个ThreadLocal。<BR>二、IdentityLoginModule身份登陆模块类：<BR>　　实现LoginModule接口。这个类和javax.security.auth.*等包结合非常紧密。<BR>三、IdentityPolicy身份政策类：扩展Policy类。<BR>四、IdentityService身份服务接口：验证用户和获取User<BR>五、Password和Usename　JavaBean<BR>------------------------------------------------------------<BR><BR>补充知识：<BR>１.<STRONG>ThreadLocal<BR>This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its <TT>get</TT> or <TT>set</TT> method) has its own, independently initialized copy of the variable. <TT>ThreadLocal</TT> instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). <BR></STRONG>这支持支持thread-local 变量。这些变量不同于它们常用的对应物，在那每一个线程获得一个(依靠get或set方法)拥有它自己的，独立地初始化复制这个变量。ThreadLocal实例是典型地私有静态字段，它希望联系状态使用线程(例如；一个用户ID或事务ID)。<BR><STRONG><BR></STRONG></P><img src ="http://www.blogjava.net/javaora/aggbug/13311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 21:26 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity.assignment包分析</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13307.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13307.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13307.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13307.html</trackback:ping><description><![CDATA[<P>JBpm赋值包：<BR>一、ExpressionAssignmentException类：表达式赋值异常类 扩展了RuntimeException<BR>二、ExpressionAssignmentHandler类： 表达式赋值处理器类 实现AssignmentHandler接口。<BR>　　主要字段：<BR>　　　1.String expression;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.ExecutionContext executionContext<BR>&nbsp;　　&nbsp;&nbsp; 3.TermTokenizer tokenizer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.Entity entity<BR>&nbsp;　　语法：syntax : first-term --&gt; next-term --&gt; next-term --&gt; ... --&gt; next-term<BR>　　　first-term ::= previous |<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swimlane(swimlane-name) |<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; variable(variable-name) |<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user(user-name) |<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group(group-name)<BR><BR>* next-term ::= group(group-type) |<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; member(role-name)<BR><BR>三、ExpressionSession接口<BR>四、TermTokenizer类："--&gt;"</P><img src ="http://www.blogjava.net/javaora/aggbug/13307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 14:08 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity.hibernate包之PermissionUserType类</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13304.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13304.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13304.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13304.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13304.html</trackback:ping><description><![CDATA[PermissionUserType类是一个Hibernate组合用户自定义数据类型：<BR>实现了抽象接口CompositeUserType：<BR>其中实现的是一个String[] 数据类型，其中将Java的Permission对象和这个数据类型绑定在一起。<BR><BR>hbm.xml影射文件中<BR>&lt;set&nbsp;name="permissions" cascade="all" table="JBPM_ID_PERMISSIONS"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="ENTITY_" foreign-key="none" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element type="org.jbpm.identity.hibernate.PermissionUserType"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="CLASS_"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="NAME_"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ACTION_"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/element&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/set&gt;&nbsp;&nbsp;&nbsp;<BR>一些特殊的组合，使用Hibernate的组合用户自定义类型，在使用上还是很方便的。目前的开发中似乎这个用的比较少，可是在特定场合下可能用的比较多的。<img src ="http://www.blogjava.net/javaora/aggbug/13304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 13:45 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.indentity.hibernate包之IdentitySessionFactory类</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13302.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13302.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13302.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13302.html</trackback:ping><description><![CDATA[IdentitySessionFactory类基本上类似于Hibernate 的SessionFactory，Jbpm中很多采用了类似于SessionFactory的机制。其中有获取IndentitySession的几个方法。其中还有一个evictCachedIdentities()也不知道有什么用法，可能是将缓存中的数据进行清空的操作。<img src ="http://www.blogjava.net/javaora/aggbug/13302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 12:16 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity.hibernate包之IdentitySession类</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13301.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13301.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13301.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13301.html</trackback:ping><description><![CDATA[一、这个类实现了IndentityService接口和ExpressionSession接口：<BR>1.IndentityService接口：<BR>校验用户方法：Object verify(String userName, String pwd);<BR>根据用户id获得User：User getUserById(Object userId);<BR>2.ExpressionSession接口：<BR>&nbsp;Group getGroupByName(String groupName);<BR>User getUserByName(String userName);<BR>二、包含字段：<BR>　　Session session<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction transaction<BR>三、方法：<BR>１.其中的verify(String userName,String pwd)的处理是通过传递用户名和密码获得一个User列表，如果为空或者size()为０，返回异常，否则get(0)获得对象（User）。<BR>２.采用了Session的get方法获取一个User<BR>３.其中实现事务的开始、确认、回滚方法<BR>４.实现了用户、组、实体的保存加载等方法<BR>５.还有一堆的获得List的方法：<BR><img src ="http://www.blogjava.net/javaora/aggbug/13301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 12:05 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity.hibernate包之一类IdentitySchema.java</title><link>http://www.blogjava.net/javaora/archive/2005/09/18/13298.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sun, 18 Sep 2005 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/18/13298.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13298.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/18/13298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13298.html</trackback:ping><description><![CDATA[　　IdentitySchema 类主要用来生成SQL脚本&lt;删除、创建、清除&gt;建立数据表以及其他相关的数据库表的操作：<BR>　　delimiter 定界符<BR>Fields：<BR>&nbsp; private static final String IDENTITY_TABLE_PREFIX = "JBPM_ID_";<BR>&nbsp; Configuration configuration = null;<BR>&nbsp; Properties properties = null;<BR>&nbsp; Dialect dialect = null;<BR>&nbsp; Mapping mapping = null;&nbsp;<BR>&nbsp; String[] createSql = null;　//创建SQL脚本<BR>&nbsp; String[] dropSql = null; //删除SQL脚本<BR>&nbsp; String[] cleanSql = null; //清除SQL脚本<BR><BR>　　通过这个类可以创建数据库表结构，通过Hibernate的configuration.generateSchemaCreationScript(dialect)来创建SQL表结构schema的SQL脚本，通过Jbpm特定的execute方法（JDBC），将传入的SQL脚本执行executeUpdate执行表结构的操作。<BR>　　要完成这个操作，要先修改hibernate.cfg.xml配置文件。<BR><img src ="http://www.blogjava.net/javaora/aggbug/13298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-18 11:42 <a href="http://www.blogjava.net/javaora/archive/2005/09/18/13298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.jbpm.identity包</title><link>http://www.blogjava.net/javaora/archive/2005/09/17/13256.html</link><dc:creator>java世界畅谈</dc:creator><author>java世界畅谈</author><pubDate>Sat, 17 Sep 2005 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/javaora/archive/2005/09/17/13256.html</guid><wfw:comment>http://www.blogjava.net/javaora/comments/13256.html</wfw:comment><comments>http://www.blogjava.net/javaora/archive/2005/09/17/13256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/javaora/comments/commentRss/13256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/javaora/services/trackbacks/13256.html</trackback:ping><description><![CDATA[<P>(org.jbpm.identity)身份包包含有如下几个类：<BR>一、Entity&nbsp;实体类：这个类作为users&lt;用户&gt;groups&lt;组&gt;和memberships&lt;成员&gt;的超类，用来管理名称和权限的增加删除和获取。其中用到了jdk的Permission类。目前还不知道这个对具体权限的控制有什么作用？<BR>二、Group组类：这个类是Entity的继承子类，这个类主要用于区分层次组、安全角色和其他。&nbsp;&nbsp;<BR>&nbsp; (1)主要包含以下几个Filed：<BR>&nbsp;&nbsp;&nbsp;&nbsp; protected String type = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp; protected&nbsp;Group parent = null; //父就是自己<BR>&nbsp;&nbsp;&nbsp;&nbsp; protected Set&nbsp;children&nbsp;= null; //子是一个集合，其中的元素也是Group<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;Set memberships = null; //会员<BR>&nbsp;&nbsp; (2)JBpm的类内部方法的命名还是很不错的：<BR>&nbsp; &nbsp; public Set getUsersForMembershipName(String membershipName) 很容易理解为通过membershipName来获得所有的用户。 这个内不仅仅是简单的JavaBean的setter和getter，而是进行一些引申的操作，例如获取用户以及addXXX等操作。<BR>&nbsp;&nbsp; (3)与之相对应的hibernate Mapping文件Group.hbm.xml其中也有几个地方，值得注意，其实这个在Jbpm中是大量使用的：<BR>&nbsp; <CLASS <BR name="org.jbpm.identity.Group">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table="JBPM_ID_GROUP"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; discriminator-value="G"&gt;<BR>&nbsp;&nbsp;&nbsp; ....<BR>&nbsp; <DISCRIMINATOR column="CLASS_" type="char" /><BR>&nbsp; 这里表示的是在JBPM_ID_GROUP表中的CLASS_字段等于G的为Group的影射对象。这里我们在使用一个表的不同类型(一个字段对应不同的值)就可以表示不同的类型对象。这一点很值得我们学习的。其他值得我们关注的是它采用的集合类型的操作方式，在我们以前的开发中这种做法并值得采用的。<BR>三、Membership成员类：它是用户和组之间的一个联系的桥梁。会员的名称代表角色的名称。一个会员可能是一个组织的位置，所以权限往往于会员联系。会员的名字能用来做角色的名字。不同的会员来担当不同的角色。<BR>protected&nbsp; String role = null;<BR>protected Group group = null;<BR>protected User user = null;<BR>&nbsp;这个类没有采用传统的构造子复用的方式，而是用很了很多的create()方法，有些方法让人感觉有些茫然不知所措，不过直接相关的代码，也就明白了。<BR>　　其中影射文件也使用了discriminator(鉴别者)的功能，以及many-to-one和set集合的做法<BR>四、User类：包含有三个字段：password email&nbsp; 以及Set memeberships。<BR>　　以下是通过两种方式获得Groups的方法，一个是通过组的类别，一种是通过成员名称（角色名称）<BR>　　public Set getGroupsForGroupType(String groupType)<BR>　　public Set getGroupsForMembershipName(String membershipName)<BR><BR>　　通过观察，我们发现这里其实有以下几个对象：Entity Group Memebership User Permission。其中Group、Memebership、User都是Entity都是子类和父类的关系。Entity和Permission是一对多的关系，表示一个实体拥有各种不同的权限，同样其他的Group等子类，也与Permission都是一对多的关系。Group 和Memeber是一对多的，一个组具有不同的角色（成员）。Membership与User和Group是多对一的关系。User和Membership之间是一对多的关系。<BR><BR>其中涉及的表有：<BR>jbpm_id_group;<BR>jbpm_id_membership;<BR>jbpm_id_user;<BR><BR></P><img src ="http://www.blogjava.net/javaora/aggbug/13256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/javaora/" target="_blank">java世界畅谈</a> 2005-09-17 21:33 <a href="http://www.blogjava.net/javaora/archive/2005/09/17/13256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>