开源工作流Fireflow源码分析之启动流程实例一

//这里使用了回调函数,这里手工处理事务的一种方法

        currentProcessInstance = (IProcessInstance) transactionTemplate.execute(new TransactionCallback() {

            public Object doInTransaction(TransactionStatus arg0) {

                try {

                	//IWorkflowSession是流程操作的入口,需要从runtimeContext获得。

                    IWorkflowSession workflowSession = runtimeContext.getWorkflowSession();

                    

                    //创建流程实例

                    //"LeaveApplicationProcess"是流程定义id

                    // CurrentUserAssignmentHandler.APPLICANT:表示流程创建者,下面会有更详细的说明

                    IProcessInstance processInstance = workflowSession.createProcessInstance(

                    		    "LeaveApplicationProcess",CurrentUserAssignmentHandler.APPLICANT);

                    //运行流程实例

              processInstance.run();



                    return processInstance;

                } catch (EngineException ex) {

                    Logger.getLogger(LeaveApplicationTester.class.getName()).log(Level.SEVERE, null, ex);

                } catch (KernelException ex) {

                    Logger.getLogger(LeaveApplicationTester.class.getName()).log(Level.SEVERE, null, ex);

                }



                return null;

            }

        });		

WorkflowSession.java

	public IProcessInstance createProcessInstance(String workflowProcessName,

			ITaskInstance parentTaskInstance) throws EngineException,

			KernelException {

		return _createProcessInstance(workflowProcessName, parentTaskInstance

				.getId(), parentTaskInstance.getProcessInstanceId(),

				parentTaskInstance.getId());

	}

/**

	 * 创建一个新的流程实例 (create a new process instance )

	 * @param workflowProcessId  流程定义ID

	 * @param creatorId  创建人ID

	 * @param parentProcessInstanceId  父流程实例ID

	 * @param parentTaskInstanceId     父任务实例ID

	 * @return

	 * @throws EngineException

	 * @throws KernelException

	 */

	protected IProcessInstance _createProcessInstance(String workflowProcessId,

			final String creatorId, final String parentProcessInstanceId,

			final String parentTaskInstanceId) throws EngineException,

			KernelException {

		//设置流程ID

		final String wfprocessId = workflowProcessId;

		//得到流程定义文件

		final WorkflowDefinition workflowDef = runtimeContext.getDefinitionService().getTheLatestVersionOfWorkflowDefinition(wfprocessId);

		//得到工作流模型

		final WorkflowProcess wfProcess = workflowDef.getWorkflowProcess();

        //如果工作流模型为null,则抛出异常

		if (wfProcess == null) {

			throw new RuntimeException(

					"Workflow process NOT found,id=[" + wfprocessId

							+ "]");

		}

		//生成流程实列

		IProcessInstance processInstance =  (IProcessInstance) this.execute(new IWorkflowSessionCallback() {



			public Object doInWorkflowSession(RuntimeContext ctx)

					throws EngineException, KernelException {

                //新建一个流程实例

				ProcessInstance processInstance = new ProcessInstance();

				//设置创建者

				processInstance.setCreatorId(creatorId);

				//设置工作流模型ID

				processInstance.setProcessId(wfProcess.getId());

				//设置流程定义版本

				processInstance.setVersion(workflowDef.getVersion());

				//设置工作流模型显示的名称

				processInstance.setDisplayName(wfProcess.getDisplayName());

				//设置工作流名称

				processInstance.setName(wfProcess.getName());

				//设置流程的状态为初始状态

				processInstance.setState(IProcessInstance.INITIALIZED);

				//设置流程实例的创建时间

				processInstance.setCreatedTime(ctx.getCalendarService()

						.getSysDate());

				//如果是当前是子流程,则设置父流程实例id,否则设置值为null

				processInstance

						.setParentProcessInstanceId(parentProcessInstanceId);

				//如果当前是子流程,则设置创建子流程的任务ID

				processInstance.setParentTaskInstanceId(parentTaskInstanceId);

				//将流程实例保存到数据库

				ctx.getPersistenceService().saveOrUpdateProcessInstance(

						processInstance);

				

				return processInstance;

			}

		});

		

		// 初始化流程变量

		processInstance.setProcessInstanceVariables(new HashMap<String, Object>());

		

		List<DataField> datafields = wfProcess.getDataFields();

		for (int i = 0; datafields != null && i < datafields.size(); i++) {

			DataField df =  datafields.get(i);

			if (df.getDataType().equals(DataField.STRING)) {

				if (df.getInitialValue() != null) {

					processInstance.setProcessInstanceVariable(df

							.getName(), df.getInitialValue());

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), "");

				}

			} else if (df.getDataType().equals(DataField.INTEGER)) {

				if (df.getInitialValue() != null) {

					try {

						Integer intValue = new Integer(df

								.getInitialValue());

						processInstance.setProcessInstanceVariable(df

								.getName(), intValue);

					} catch (Exception e) {

					}

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), new Integer(0));

				}

			} else if (df.getDataType().equals(DataField.LONG)) {

				if (df.getInitialValue() != null) {

					try {

						Long longValue = new Long(df.getInitialValue());

						processInstance.setProcessInstanceVariable(df

								.getName(), longValue);

					} catch (Exception e) {

					}

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), new Long(0));

				}

			} else if (df.getDataType().equals(DataField.FLOAT)) {

				if (df.getInitialValue() != null) {

					Float floatValue = new Float(df.getInitialValue());

					processInstance.setProcessInstanceVariable(df

							.getName(), floatValue);

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), new Float(0));

				}

			} else if (df.getDataType().equals(DataField.DOUBLE)) {

				if (df.getInitialValue() != null) {

					Double doubleValue = new Double(df

							.getInitialValue());

					processInstance.setProcessInstanceVariable(df

							.getName(), doubleValue);

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), new Double(0));

				}

			} else if (df.getDataType().equals(DataField.BOOLEAN)) {

				if (df.getInitialValue() != null) {

					Boolean booleanValue = new Boolean(df

							.getInitialValue());

					processInstance.setProcessInstanceVariable(df

							.getName(), booleanValue);

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), Boolean.FALSE);

				}

			} else if (df.getDataType().equals(DataField.DATETIME)) {

				// TODO 需要完善一下

				if (df.getInitialValue() != null

						&& df.getDataPattern() != null) {

					try {

						SimpleDateFormat dFormat = new SimpleDateFormat(

								df.getDataPattern());

						Date dateTmp = dFormat.parse(df

								.getInitialValue());

						processInstance.setProcessInstanceVariable(df

								.getName(), dateTmp);

					} catch (Exception e) {

						processInstance.setProcessInstanceVariable(df

								.getName(), null);

						e.printStackTrace();

					}

				} else {

					processInstance.setProcessInstanceVariable(df

							.getName(), null);

				}

			}

		}

		//返回任务实例 

		return processInstance;

	}

ProcessInstance.java

 /*

     * 流程实例开始运行

     * @see org.fireflow.engine.IProcessInstance#run()

     */

    public void run() throws EngineException, KernelException {

    	//如果流程实例状态不在初始状态,则抛出异常

        if (this.getState().intValue() != IProcessInstance.INITIALIZED) {

            throw new EngineException(this.getId(),

                    this.getWorkflowProcess(),

                    this.getProcessId(), "The state of the process instance is " + this.getState() + ",can not run it ");

        }

        //取得工作流网实例,这个接下来看:开源工作流Fireflow源码分析之启动流程实例二
INetInstance netInstance = rtCtx.getKernelManager().getNetInstance(this.getProcessId(), this.getVersion()); if (netInstance == null) { throw new EngineException(this.getId(), this.getWorkflowProcess(), this.getProcessId(), "The net instance for the workflow process [Id=" + this.getProcessId() + "] is Not found"); } //触发启动流程实例的事件 ProcessInstanceEvent event = new ProcessInstanceEvent(); event.setEventType(ProcessInstanceEvent.BEFORE_PROCESS_INSTANCE_RUN); event.setSource(this); this.fireProcessInstanceEvent(event); //设置流程实例的状态为运行状态 this.setState(IProcessInstance.RUNNING); this.setStartedTime(rtCtx.getCalendarService().getSysDate()); //保存流程实例 rtCtx.getPersistenceService().saveOrUpdateProcessInstance(this); //运行工作流网实例,从startnode开始,这个接下来看:开源工作流Fireflow源码分析之运行流程实例一 netInstance.run(this); }

你可能感兴趣的:(源码分析)