IDEMPIERE-176 Intermittent lost of context

This commit is contained in:
Heng Sin Low 2012-03-05 11:17:51 +08:00
parent a74d86e741
commit 2ab29d79cc
1 changed files with 34 additions and 22 deletions

View File

@ -54,8 +54,6 @@ public class SessionContextListener implements ExecutionInit,
public static final String SERVLET_SESSION_ID = "servlet.sessionId";
public static final String SESSION_CTX = "WebUISessionContext";
private Properties _ctx = null;
/**
* get servlet thread local context from session
* @param exec
@ -140,11 +138,10 @@ public class SessionContextListener implements ExecutionInit,
{
//in servlet thread
//check is thread local context have been setup
if (ServerContext.getCurrentInstance().isEmpty())
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
_ctx = ServerContext.getCurrentInstance();
}
/**
@ -157,10 +154,10 @@ public class SessionContextListener implements ExecutionInit,
public void afterSuspend(Component comp, Event evt) throws Exception
{
//in servlet thread
Properties ctx = new Properties();
ctx.putAll(_ctx);
ServerContext.setCurrentInstance(ctx);
Executions.getCurrent().getDesktop().getSession().setAttribute(SESSION_CTX, ctx);
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
}
/**
@ -173,11 +170,10 @@ public class SessionContextListener implements ExecutionInit,
{
//in servlet thread
//check is thread local context have been setup
if (ServerContext.getCurrentInstance().isEmpty())
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
_ctx = ServerContext.getCurrentInstance();
}
/**
@ -199,10 +195,10 @@ public class SessionContextListener implements ExecutionInit,
public void complete(Component comp, Event evt) throws Exception
{
//in servlet thread
Properties ctx = new Properties();
ctx.putAll(_ctx);
ServerContext.setCurrentInstance(ctx);
Executions.getCurrent().getDesktop().getSession().setAttribute(SESSION_CTX, ctx);
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
}
/**
@ -214,9 +210,10 @@ public class SessionContextListener implements ExecutionInit,
public boolean init(Component comp, Event evt)
{
//in event processing thread
Properties ctx = new Properties();
ctx.putAll(_ctx);
ServerContext.setCurrentInstance(ctx);
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
//set locale
Locales.setThreadLocal(Env.getLanguage(ServerContext.getCurrentInstance()).getLocale());
@ -236,7 +233,6 @@ public class SessionContextListener implements ExecutionInit,
throws Exception
{
//in event processing thread
_ctx = ServerContext.getCurrentInstance();
}
/**
@ -248,9 +244,10 @@ public class SessionContextListener implements ExecutionInit,
public void afterResume(Component comp, Event evt)
{
//in event processing thread
Properties ctx = new Properties();
ctx.putAll(_ctx);
ServerContext.setCurrentInstance(ctx);
if (ServerContext.getCurrentInstance().isEmpty() || !isContextValid())
{
setupExecutionContextFromSession(Executions.getCurrent());
}
//set locale
Locales.setThreadLocal(Env.getLanguage(ServerContext.getCurrentInstance()).getLocale());
@ -266,6 +263,21 @@ public class SessionContextListener implements ExecutionInit,
public void cleanup(Component comp, Event evt, List errs) throws Exception
{
//in event processing thread
_ctx = ServerContext.getCurrentInstance();
}
private boolean isContextValid() {
Execution exec = Executions.getCurrent();
Properties ctx = ServerContext.getCurrentInstance();
if (ctx == null)
return false;
Session session = exec.getDesktop().getSession();
HttpSession httpSession = (HttpSession)session.getNativeSession();
//verify ctx
String cacheId = ctx.getProperty(SERVLET_SESSION_ID);
if (cacheId == null || !cacheId.equals(httpSession.getId()) )
{
return false;
}
return true;
}
}