From 8e193dad3dbe0a3924ff8da3f129bb39e7b39c1a Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 14 Oct 2015 20:29:42 -0500 Subject: [PATCH] IDEMPIERE-2756 Background threads losing context when user log out - fix validation / integrate fix from hengsin: Improve handling of context lost ( due to user close browser ) exception for document workflow. --- .../src/org/compiere/wf/MWFActivity.java | 46 ++++++++++++++----- .../webui/apps/AbstractProcessDialog.java | 15 +++--- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/wf/MWFActivity.java b/org.adempiere.base/src/org/compiere/wf/MWFActivity.java index d6185dcac8..32b4110713 100644 --- a/org.adempiere.base/src/org/compiere/wf/MWFActivity.java +++ b/org.adempiere.base/src/org/compiere/wf/MWFActivity.java @@ -916,19 +916,41 @@ public class MWFActivity extends X_AD_WF_Activity implements Runnable processMsg = e.getMessage(); setTextMsg(processMsg); // addTextMsg(e); // do not add the exception text - setWFState (StateEngine.STATE_Terminated); // unlocks - // Set Document Status - if (m_po != null && m_po instanceof DocAction && m_docStatus != null) + boolean contextLost = false; + if (e instanceof AdempiereException && "Context lost".equals(e.getMessage())) { - m_po.load(get_TrxName()); - DocAction doc = (DocAction)m_po; - doc.setDocStatus(m_docStatus); - m_po.saveEx(); - } - if (m_process != null) - { - m_process.setProcessMsg(this.getTextMsg()); - m_process.saveEx(); + contextLost = true; + m_docStatus = DocAction.STATUS_Invalid; + } + try { + if (contextLost) + { + Env.getCtx().setProperty("#AD_Client_ID", (m_po != null ? Integer.toString(m_po.getAD_Client_ID()) : "0") ); + m_state = new StateEngine(WFSTATE_Running); + setProcessed(true); + setWFState (StateEngine.STATE_Aborted); + } + else + { + setWFState (StateEngine.STATE_Terminated); // unlocks + } + + // Set Document Status + if (m_po != null && m_po instanceof DocAction && m_docStatus != null) + { + m_po.load(get_TrxName()); + DocAction doc = (DocAction)m_po; + doc.setDocStatus(m_docStatus); + m_po.saveEx(); + } + if (m_process != null) + { + m_process.setProcessMsg(this.getTextMsg()); + m_process.saveEx(); + } + } finally { + if (contextLost) + Env.getCtx().remove("#AD_Client_ID"); } } finally diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java index f21892a2fb..e7e2ba6da0 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/apps/AbstractProcessDialog.java @@ -462,13 +462,16 @@ public abstract class AbstractProcessDialog extends Window implements IProcessUI if (Executions.getCurrent() == null) { - Executions.schedule(getDesktop(), new EventListener() + if (getDesktop() != null) { - @Override - public void onEvent(Event event) throws Exception { - doUnlockUI(); - } - }, new Event("onUnLockUI")); + Executions.schedule(getDesktop(), new EventListener() + { + @Override + public void onEvent(Event event) throws Exception { + doUnlockUI(); + } + }, new Event("onUnLockUI")); + } } else { doUnlockUI(); }