diff --git a/base/src/org/compiere/wf/MWFActivity.java b/base/src/org/compiere/wf/MWFActivity.java index 3ecfb1bd4b..881bd39838 100644 --- a/base/src/org/compiere/wf/MWFActivity.java +++ b/base/src/org/compiere/wf/MWFActivity.java @@ -41,7 +41,7 @@ import org.compiere.util.*; public class MWFActivity extends X_AD_WF_Activity implements Runnable { /** - * Get Activities for table/tecord + * Get Activities for table/record * @param ctx context * @param AD_Table_ID table * @param Record_ID record @@ -182,6 +182,22 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable m_process = process; } // MWFActivity + /** + * Parent Contructor + * @param process process + * @param AD_WF_Node_ID start node + * @param lastPO PO from the previously executed node + */ + public MWFActivity(MWFProcess process, int next_ID, PO lastPO) { + this(process, next_ID); + if (lastPO != null) { + // Compare if the last PO is the same type and record needed here, if yes, use it + if (lastPO.get_Table_ID() == getAD_Table_ID() && lastPO.get_ID() == getRecord_ID()) { + m_po = lastPO; + } + } + } + /** State Machine */ private StateEngine m_state = null; /** Workflow Node */ @@ -238,7 +254,7 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable if (m_process == null) m_process = new MWFProcess (getCtx(), getAD_WF_Process_ID(), m_trx == null ? null : m_trx.getTrxName()); - m_process.checkActivities(m_trx == null ? null : m_trx.getTrxName()); + m_process.checkActivities(m_trx == null ? null : m_trx.getTrxName(), m_po); } else { @@ -307,8 +323,9 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable */ public PO getPO (Trx trx) { - if (m_po != null) + if (m_po != null) { return m_po; + } MTable table = MTable.get (getCtx(), getAD_Table_ID()); if (trx != null) diff --git a/base/src/org/compiere/wf/MWFProcess.java b/base/src/org/compiere/wf/MWFProcess.java index 96394ef15f..a925069af2 100644 --- a/base/src/org/compiere/wf/MWFProcess.java +++ b/base/src/org/compiere/wf/MWFProcess.java @@ -97,7 +97,7 @@ public class MWFProcess extends X_AD_WF_Process // Lock Entity getPO(); if (m_po != null) - m_po.lock(); + m_po.lock(); } // MWFProcess /** State Machine */ @@ -227,7 +227,7 @@ public class MWFProcess extends X_AD_WF_Process * - start new activity * @param trxName transaction */ - public void checkActivities(String trxName) + public void checkActivities(String trxName, PO lastPO) { log.info("(" + getAD_Workflow_ID() + ") - " + getWFState() + (trxName == null ? "" : "[" + trxName + "]")); @@ -246,7 +246,7 @@ public class MWFProcess extends X_AD_WF_Process // Completed - Start Next if (activityState.isCompleted()) { - if (startNext (activity, activities)) + if (startNext (activity, activities, lastPO)) continue; } // @@ -303,7 +303,7 @@ public class MWFProcess extends X_AD_WF_Process * @param activities all activities * @return true if there is a next activity */ - private boolean startNext (MWFActivity last, MWFActivity[] activities) + private boolean startNext (MWFActivity last, MWFActivity[] activities, PO lastPO) { log.fine("Last=" + last); // transitions from the last processed node @@ -331,9 +331,11 @@ public class MWFProcess extends X_AD_WF_Process if (!transitions[i].isValidFor(last)) continue; - // Start new Activity - MWFActivity activity = new MWFActivity (this, transitions[i].getAD_WF_Next_ID()); - new Thread(activity).start(); + // Start new Activity... + MWFActivity activity = new MWFActivity (this, transitions[i].getAD_WF_Next_ID(), lastPO); + //new Thread(activity).start(); + //..but not in another thread + activity.run(); // only the first valid if XOR if (MWFNode.SPLITELEMENT_XOR.equals(split))