📄 wfprocessimpl.java
字号:
setSerializedData(context); } /** * @see org.ofbiz.workflow.WfProcess#activityComplete(org.ofbiz.workflow.WfActivity) */ public synchronized void activityComplete(WfActivity activity) throws WfException { if (!activity.state().equals("closed.completed")) throw new WfException("Activity state is not completed"); if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.activityComplete] : Activity (" + activity.name() + ") is complete", module); queueNext(activity); } /** * @see org.ofbiz.workflow.impl.WfExecutionObjectImpl#executionObjectType() */ public String executionObjectType() { return "WfProcess"; } // Queues the next activities for processing private void queueNext(WfActivity fromActivity) throws WfException { List nextTrans = getTransFrom(fromActivity); if (nextTrans.size() > 0) { Iterator i = nextTrans.iterator(); while (i.hasNext()) { GenericValue trans = (GenericValue) i.next(); // Get the activity definition GenericValue toActivity = null; try { toActivity = trans.getRelatedOne("ToWorkflowActivity"); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } // check for a join String join = "WJT_AND"; // default join is AND if (toActivity.get("joinTypeEnumId") != null) join = toActivity.getString("joinTypeEnumId"); if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.queueNext] : " + join + " join.", module); // activate if XOR or test the join transition(s) if (join.equals("WJT_XOR")) startActivity(toActivity); else joinTransition(toActivity, trans); } } else { if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.queueNext] : No transitions left to follow.", module); this.finishProcess(); } } // Follows the and-join transition private void joinTransition(GenericValue toActivity, GenericValue transition) throws WfException { // get all TO transitions to this activity GenericValue dataObject = getRuntimeObject(); Collection toTrans = null; try { toTrans = toActivity.getRelated("ToWorkflowTransition"); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } // get a list of followed transition to this activity Collection followed = null; try { Map fields = new HashMap(); fields.put("processWorkEffortId", dataObject.getString("workEffortId")); fields.put("toActivityId", toActivity.getString("activityId")); followed = getDelegator().findByAnd("WorkEffortTransBox", fields); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.joinTransition] : toTrans (" + toTrans.size() + ") followed (" + (followed.size() + 1) + ")", module); // check to see if all transition requirements are met if (toTrans.size() == (followed.size() + 1)) { Debug.logVerbose("[WfProcess.joinTransition] : All transitions have followed.", module); startActivity(toActivity); try { Map fields = new HashMap(); fields.put("processWorkEffortId", dataObject.getString("workEffortId")); fields.put("toActivityId", toActivity.getString("activityId")); getDelegator().removeByAnd("WorkEffortTransBox", fields); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } } else { Debug.logVerbose("[WfProcess.joinTransition] : Waiting for transitions to finish.", module); try { Map fields = new HashMap(); fields.put("processWorkEffortId", dataObject.getString("workEffortId")); fields.put("toActivityId", toActivity.getString("activityId")); fields.put("transitionId", transition.getString("transitionId")); GenericValue obj = getDelegator().makeValue("WorkEffortTransBox", fields); getDelegator().create(obj); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } } } // Activates an activity object private void startActivity(GenericValue value) throws WfException { WfActivity activity = WfFactory.getWfActivity(value, workEffortId); GenericResultWaiter req = new GenericResultWaiter(); if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.startActivity] : Attempting to start activity (" + activity.name() + ")", module); // locate the dispatcher to use LocalDispatcher dispatcher = this.getDispatcher(); // get the job manager JobManager jm = dispatcher.getJobManager(); if (jm == null) { throw new WfException("No job manager found on the service dispatcher; cannot start activity"); } // using the StartActivityJob class to run the activity within its own thread try { Job activityJob = new StartActivityJob(activity, req); jm.runJob(activityJob); } catch (JobManagerException e) { throw new WfException("JobManager error", e); } // the GenericRequester object will hold any exceptions; and report the job as failed if (req.status() == GenericResultWaiter.SERVICE_FAILED) { Throwable reqt = req.getThrowable(); if (reqt instanceof CannotStart) Debug.logVerbose("[WfProcess.startActivity] : Cannot start activity. Waiting for manual start.", module); else if (reqt instanceof AlreadyRunning) throw new WfException("Activity already running", reqt); else throw new WfException("Activity error", reqt); } } // Determine the next activity or activities private List getTransFrom(WfActivity fromActivity) throws WfException { List transList = new ArrayList(); // get the from transitions Collection fromCol = null; try { fromCol = fromActivity.getDefinitionObject().getRelated("FromWorkflowTransition"); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } // check for a split String split = "WST_AND"; // default split is AND if (fromActivity.getDefinitionObject().get("splitTypeEnumId") != null) split = fromActivity.getDefinitionObject().getString("splitTypeEnumId"); // the default value is TRUE, so if no expression is supplied we evaluate as true boolean transitionOk = true; // the otherwise condition (only used by XOR splits) GenericValue otherwise = null; // iterate through the possible transitions Iterator fromIt = fromCol.iterator(); while (fromIt.hasNext()) { GenericValue transition = (GenericValue) fromIt.next(); // if this transition is OTHERWISE store it for later and continue on if (transition.get("conditionTypeEnumId") != null && transition.getString("conditionTypeEnumId").equals("WTC_OTHERWISE")) { // there should be only one of these, if there is more then one we will use the last one defined otherwise = transition; continue; } // get the condition body from the condition tag String conditionBody = transition.getString("conditionExpr"); // get the extended attributes for the transition Map extendedAttr = StringUtil.strToMap(transition.getString("extendedAttributes")); // check for a conditionClassName attribute if exists use it if (extendedAttr != null && extendedAttr.get("conditionClassName") != null) { String conditionClassName = (String) extendedAttr.get("conditionClassName"); transitionOk = this.evalConditionClass(conditionClassName, conditionBody, this.processContext(), extendedAttr); } else { // since no condition class is supplied, evaluate the expression using bsh if (conditionBody != null) { transitionOk = this.evalBshCondition(conditionBody, this.processContext()); } } if (transitionOk) { transList.add(transition); if (split.equals("WST_XOR")) break; } } // we only use the otherwise transition for XOR splits if (split.equals("WST_XOR") && transList.size() == 0 && otherwise != null) { transList.add(otherwise); Debug.logVerbose("Used OTHERWISE Transition.", module); } if (Debug.verboseOn()) Debug.logVerbose("[WfProcess.getTransFrom] : Transitions: " + transList.size(), module); return transList; } // Gets a specific activity by its key private WfActivity getActivity(String key) throws WfException { Iterator i = getIteratorStep(); while (i.hasNext()) { WfActivity a = (WfActivity) i.next(); if (a.key().equals(key)) return a; } throw new WfException("Activity not an active member of this process"); } // Complete this workflow private void finishProcess() throws WfException { changeState("closed.completed"); Debug.logVerbose("[WfProcess.finishProcess] : Workflow Complete. Calling back to requester.", module); if (requester != null) { WfEventAudit audit = WfFactory.getWfEventAudit(this, null); // this will need to be updated try { requester.receiveEvent(audit); } catch (InvalidPerformer e) { throw new WfException(e.getMessage(), e); } } } // Get the active process activities private List activeSteps() throws WfException { List steps = new ArrayList(); Collection c = null; try { c = getDelegator().findByAnd("WorkEffort", UtilMisc.toMap("workEffortParentId", runtimeKey())); } catch (GenericEntityException e) { throw new WfException(e.getMessage(), e); } if (c == null) return steps; Iterator i = c.iterator(); while (i.hasNext()) { GenericValue v = (GenericValue) i.next(); if (v.get("currentStatusId") != null && WfUtil.getOMGStatus(v.getString("currentStatusId")).startsWith("open.")) steps.add(WfFactory.getWfActivity(getDelegator(), v.getString("workEffortId"))); } return steps; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -