1.初始化一流程
// a workflow implement which does not read in the
//current user from any context,but allow one to be specified via the constructor
Workflow workflow = new BasicWorkflow("starter");
// Configuration object that is responsible for all 'static' workflow information. 就是指配置文件中的相关信息
// DefaultConfiguration 是Configuration接口的一个默认实现
// DefaultConfiguration类中的最主要方法 public void load(URL url) throws FactoryException
// 如果url不为null ,就通过url.openStream()来得到 I nputStream.
// 如果url为null, 先得到 当前线程的classloader, ClassLoader classLoader = //Thread.currentThread().getContextClassLoader(); 再通过classLoader得到osworkflow.xml配置文件 的//inputStream, is = classLoader.getResourceAsStream("osworkflow.xml"); 从这一句源码中我们也可得知我
//们不应该更改osworkflow的 名字,注意osworklfow.xml的位置是classes文件夹下。
//is = classLoader.getResourceAsStream("/osworkflow.xml");
//is = classLoader.getResourceAsStream("META-INF/osworkflow.xml");
// is = classLoader.getResourceAsStream("/META-INF/osworkflow.xml");
//从源码中以上三语句我们也可得知osworkflow.xml可以放在4个地方()。
// 如果 我们在开始一流程时,不写下面的两句语句也是可以的,这可以从源码中得到验证
// 在AbstractWorkflow.java中(BasicWorkflow继承自AbstractWorkflow,实现Workflow,而AbstractWorkflow 也是//interface Workflow的一个实现。此处也是一种模式的应用,因为AbstractWorkflow还是其它类的父类),
//BasicWorkflow 中有一方法 Configuration getConfiguration(),当其它地方要用到configuration这一属性
//时,都是通过这一方法来调用的。如果直接拿configuration的话,就会在每个使用的地方进行判断,出现代码
//冗余,并且如果到时逻辑变了,维护起来也困难。而通过getConfiguration的话,判断就只出现在一个地方。下面就先看一下其中的逻辑。
// .....Configuration config = (configuration != null) ? configuration : DefaultConfiguration.INSTANCE;
// if (!config.isInitialized())
// ......config.load(null); 其中对load();这一方法,我已经在上面进行逻辑分析.
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
HashMap map = new HashMap();
map.put("type",type);
workflowId = workflow.initialize("leave",0, map); // 褪初始化一个定义为leave的流程,
2. com.opensymphony.workflow.loader分析
这个包定义了与工作流定义密切相关的类,包括与工作流定义中对应元素的java类(),相关的factory类和一些工具类
java.lang.Object
com.opensymphony.workflow.loader.AbstractWorkflowFactory
com.opensymphony.workflow.loader.XMLWorkflowFactory
com.opensymphony.workflow.loader.JDBCWorkflowFactory
AbstractWorkflowFactory是基类,定义了工作流定义的管理,以及工作流描述类(WorkflowDescriptor)的创建。factory类对应配置文件中的<factory>元素。和XMLWorkflowFactory处于同一层 的还有URLWorkflowFactory,它们都会使用WorkflowLoader来加载指定的工作流定义。是分析工作定义产生WorkflowDescriptor.
代码:
在 public WorkflowDescriptor getWorkflow(String name, boolean validate)中最后将后调用 如下 的private method.
private void loadWorkflow(WorkflowConfig c, boolean validate) throws FactoryException {
try {
c.descriptor = WorkflowLoader.load(c.url, validate);
} catch (Exception e) {
throw new FactoryException("Error in workflow descriptor: " + c.url, e);
}
对于JDBCWorkflowFactory:Workflow Factory that stores workflows in a database. The database requires a property called 'datasource' which is the JNDI name of the datasource for this factory.
和XMLWorkflowFactory一大不同点就是用 数据库来管理 工作流定义,它支持移除工作流定义。为了使用它Also required is a database table called OS_WORKFLOWDEFS with two columns, WF_NAME which contains the workflow name, and WF_DEFINITION which will contain the xml workflow descriptor, the latter can be either a TEXT or BINARY type. xml定义可以以text 或 二进制进行保存。 在通过workflow name得到 WorkflowDescriptor 时,仍是调用 WorkflowLoader.load(is, validate)来得到WorkflowDescripto,is 是工作流定义从数据库中取出后的一个ByteArrayInputStream.
// a workflow implement which does not read in the
//current user from any context,but allow one to be specified via the constructor
Workflow workflow = new BasicWorkflow("starter");
// Configuration object that is responsible for all 'static' workflow information. 就是指配置文件中的相关信息
// DefaultConfiguration 是Configuration接口的一个默认实现
// DefaultConfiguration类中的最主要方法 public void load(URL url) throws FactoryException
// 如果url不为null ,就通过url.openStream()来得到 I nputStream.
// 如果url为null, 先得到 当前线程的classloader, ClassLoader classLoader = //Thread.currentThread().getContextClassLoader(); 再通过classLoader得到osworkflow.xml配置文件 的//inputStream, is = classLoader.getResourceAsStream("osworkflow.xml"); 从这一句源码中我们也可得知我
//们不应该更改osworkflow的 名字,注意osworklfow.xml的位置是classes文件夹下。
//is = classLoader.getResourceAsStream("/osworkflow.xml");
//is = classLoader.getResourceAsStream("META-INF/osworkflow.xml");
// is = classLoader.getResourceAsStream("/META-INF/osworkflow.xml");
//从源码中以上三语句我们也可得知osworkflow.xml可以放在4个地方()。
// 如果 我们在开始一流程时,不写下面的两句语句也是可以的,这可以从源码中得到验证
// 在AbstractWorkflow.java中(BasicWorkflow继承自AbstractWorkflow,实现Workflow,而AbstractWorkflow 也是//interface Workflow的一个实现。此处也是一种模式的应用,因为AbstractWorkflow还是其它类的父类),
//BasicWorkflow 中有一方法 Configuration getConfiguration(),当其它地方要用到configuration这一属性
//时,都是通过这一方法来调用的。如果直接拿configuration的话,就会在每个使用的地方进行判断,出现代码
//冗余,并且如果到时逻辑变了,维护起来也困难。而通过getConfiguration的话,判断就只出现在一个地方。下面就先看一下其中的逻辑。
// .....Configuration config = (configuration != null) ? configuration : DefaultConfiguration.INSTANCE;
// if (!config.isInitialized())
// ......config.load(null); 其中对load();这一方法,我已经在上面进行逻辑分析.
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
HashMap map = new HashMap();
map.put("type",type);
workflowId = workflow.initialize("leave",0, map); // 褪初始化一个定义为leave的流程,
2. com.opensymphony.workflow.loader分析
这个包定义了与工作流定义密切相关的类,包括与工作流定义中对应元素的java类(),相关的factory类和一些工具类
java.lang.Object
com.opensymphony.workflow.loader.AbstractWorkflowFactory
com.opensymphony.workflow.loader.XMLWorkflowFactory
com.opensymphony.workflow.loader.JDBCWorkflowFactory
AbstractWorkflowFactory是基类,定义了工作流定义的管理,以及工作流描述类(WorkflowDescriptor)的创建。factory类对应配置文件中的<factory>元素。和XMLWorkflowFactory处于同一层 的还有URLWorkflowFactory,它们都会使用WorkflowLoader来加载指定的工作流定义。是分析工作定义产生WorkflowDescriptor.
代码:
在 public WorkflowDescriptor getWorkflow(String name, boolean validate)中最后将后调用 如下 的private method.
private void loadWorkflow(WorkflowConfig c, boolean validate) throws FactoryException {
try {
c.descriptor = WorkflowLoader.load(c.url, validate);
} catch (Exception e) {
throw new FactoryException("Error in workflow descriptor: " + c.url, e);
}
对于JDBCWorkflowFactory:Workflow Factory that stores workflows in a database. The database requires a property called 'datasource' which is the JNDI name of the datasource for this factory.
和XMLWorkflowFactory一大不同点就是用 数据库来管理 工作流定义,它支持移除工作流定义。为了使用它Also required is a database table called OS_WORKFLOWDEFS with two columns, WF_NAME which contains the workflow name, and WF_DEFINITION which will contain the xml workflow descriptor, the latter can be either a TEXT or BINARY type. xml定义可以以text 或 二进制进行保存。 在通过workflow name得到 WorkflowDescriptor 时,仍是调用 WorkflowLoader.load(is, validate)来得到WorkflowDescripto,is 是工作流定义从数据库中取出后的一个ByteArrayInputStream.