details:   /erp/devel/pi/rev/7d345428351b
changeset: 6453:7d345428351b
user:      Asier Lostalé <asier.lostale <at> openbravo.com>
date:      Thu Feb 18 10:59:35 2010 +0100
summary:   fixed bug 12330: Exception in logs when maximum concurrent users 
reached

details:   /erp/devel/pi/rev/0e103bbcd82f
changeset: 6454:0e103bbcd82f
user:      Asier Lostalé <asier.lostale <at> openbravo.com>
date:      Thu Feb 18 11:12:09 2010 +0100
summary:   fixed issue 11039: Active Session Detection

diffstat:

 src-db/database/model/tables/AD_SESSION.xml           |   4 +
 src-db/database/sourcedata/AD_COLUMN.xml              |  31 +++++++
 src-db/database/sourcedata/AD_ELEMENT.xml             |  13 +++
 src-db/database/sourcedata/AD_FIELD.xml               |  34 +++++++-
 src/org/openbravo/base/secureApp/LoginHandler.java    |  10 +-
 src/org/openbravo/erpCommon/obps/ActivationKey.java   |  75 ++++++++++++++++--
 src/org/openbravo/erpCommon/utility/VerticalMenu.java |  28 ++++++-
 7 files changed, 172 insertions(+), 23 deletions(-)

diffs (truncated from 392 to 300 lines):

diff -r c4f60fa9011b -r 0e103bbcd82f src-db/database/model/tables/AD_SESSION.xml
--- a/src-db/database/model/tables/AD_SESSION.xml       Thu Feb 18 14:55:14 
2010 +0530
+++ b/src-db/database/model/tables/AD_SESSION.xml       Thu Feb 18 11:12:09 
2010 +0100
@@ -57,6 +57,10 @@
         <default/>
         <onCreateDefault/>
       </column>
+      <column name="LAST_SESSION_PING" primaryKey="false" required="false" 
type="TIMESTAMP" size="7" autoIncrement="false">
+        <default/>
+        <onCreateDefault/>
+      </column>
       <foreign-key foreignTable="AD_CLIENT" name="AD_SESSION_AD_CLIENT">
         <reference local="AD_CLIENT_ID" foreign="AD_CLIENT_ID"/>
       </foreign-key>
diff -r c4f60fa9011b -r 0e103bbcd82f src-db/database/sourcedata/AD_COLUMN.xml
--- a/src-db/database/sourcedata/AD_COLUMN.xml  Thu Feb 18 14:55:14 2010 +0530
+++ b/src-db/database/sourcedata/AD_COLUMN.xml  Thu Feb 18 11:12:09 2010 +0100
@@ -274856,6 +274856,37 @@
 <!--7FCA79F6A6804336A083FEE0C8964D6E-->  
<ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
 <!--7FCA79F6A6804336A083FEE0C8964D6E--></AD_COLUMN>
 
+<!--7FDC7A18D86783EAE040007F01012E08--><AD_COLUMN>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_COLUMN_ID><![CDATA[7FDC7A18D86783EAE040007F01012E08]]></AD_COLUMN_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <NAME><![CDATA[Last Ping]]></NAME>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <DESCRIPTION><![CDATA[Time for the 
last time the session sent ping]]></DESCRIPTION>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <HELP><![CDATA[Stores the last time 
the session made ping through the UI. In this way it is possible to determine 
whether the browser was closed without doing log out.]]></HELP>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<COLUMNNAME><![CDATA[Last_Session_Ping]]></COLUMNNAME>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_TABLE_ID><![CDATA[566]]></AD_TABLE_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_REFERENCE_ID><![CDATA[16]]></AD_REFERENCE_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<FIELDLENGTH><![CDATA[19]]></FIELDLENGTH>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <ISKEY><![CDATA[N]]></ISKEY>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <ISPARENT><![CDATA[N]]></ISPARENT>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISMANDATORY><![CDATA[N]]></ISMANDATORY>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISUPDATEABLE><![CDATA[N]]></ISUPDATEABLE>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISIDENTIFIER><![CDATA[N]]></ISIDENTIFIER>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <SEQNO><![CDATA[31]]></SEQNO>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISTRANSLATED><![CDATA[N]]></ISTRANSLATED>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISSELECTIONCOLUMN><![CDATA[N]]></ISSELECTIONCOLUMN>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_ELEMENT_ID><![CDATA[7FDC7A18D86883EAE040007F01012E08]]></AD_ELEMENT_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--7FDC7A18D86783EAE040007F01012E08-->  <POSITION><![CDATA[15]]></POSITION>
+<!--7FDC7A18D86783EAE040007F01012E08-->  
<ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
+<!--7FDC7A18D86783EAE040007F01012E08--></AD_COLUMN>
+
 <!--80F1BCD61F0F11DE8BE5DF56446CB1D8--><AD_COLUMN>
 <!--80F1BCD61F0F11DE8BE5DF56446CB1D8-->  
<AD_COLUMN_ID><![CDATA[80F1BCD61F0F11DE8BE5DF56446CB1D8]]></AD_COLUMN_ID>
 <!--80F1BCD61F0F11DE8BE5DF56446CB1D8-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r c4f60fa9011b -r 0e103bbcd82f src-db/database/sourcedata/AD_ELEMENT.xml
--- a/src-db/database/sourcedata/AD_ELEMENT.xml Thu Feb 18 14:55:14 2010 +0530
+++ b/src-db/database/sourcedata/AD_ELEMENT.xml Thu Feb 18 11:12:09 2010 +0100
@@ -25505,6 +25505,19 @@
 <!--7EC3B5CF03729057E040007F010110BF-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
 <!--7EC3B5CF03729057E040007F010110BF--></AD_ELEMENT>
 
+<!--7FDC7A18D86883EAE040007F01012E08--><AD_ELEMENT>
+<!--7FDC7A18D86883EAE040007F01012E08-->  
<AD_ELEMENT_ID><![CDATA[7FDC7A18D86883EAE040007F01012E08]]></AD_ELEMENT_ID>
+<!--7FDC7A18D86883EAE040007F01012E08-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--7FDC7A18D86883EAE040007F01012E08-->  
<COLUMNNAME><![CDATA[Last_Session_Ping]]></COLUMNNAME>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <NAME><![CDATA[Last Ping]]></NAME>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <PRINTNAME><![CDATA[Last 
Ping]]></PRINTNAME>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <DESCRIPTION><![CDATA[Time for the 
last time the session sent ping]]></DESCRIPTION>
+<!--7FDC7A18D86883EAE040007F01012E08-->  <HELP><![CDATA[Stores the last time 
the session made ping through the UI. In this way it is possible to determine 
whether the browser was closed without doing log out.]]></HELP>
+<!--7FDC7A18D86883EAE040007F01012E08-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--7FDC7A18D86883EAE040007F01012E08--></AD_ELEMENT>
+
 <!--80044AA0505611DEBC12001CC0B8EF99--><AD_ELEMENT>
 <!--80044AA0505611DEBC12001CC0B8EF99-->  
<AD_ELEMENT_ID><![CDATA[80044AA0505611DEBC12001CC0B8EF99]]></AD_ELEMENT_ID>
 <!--80044AA0505611DEBC12001CC0B8EF99-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r c4f60fa9011b -r 0e103bbcd82f src-db/database/sourcedata/AD_FIELD.xml
--- a/src-db/database/sourcedata/AD_FIELD.xml   Thu Feb 18 14:55:14 2010 +0530
+++ b/src-db/database/sourcedata/AD_FIELD.xml   Thu Feb 18 11:12:09 2010 +0100
@@ -82221,7 +82221,7 @@
 <!--6616-->  <ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--6616-->  <DISPLAYLENGTH><![CDATA[20]]></DISPLAYLENGTH>
 <!--6616-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
-<!--6616-->  <SEQNO><![CDATA[10]]></SEQNO>
+<!--6616-->  <SEQNO><![CDATA[20]]></SEQNO>
 <!--6616-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
 <!--6616-->  <ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
 <!--6616-->  <ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
@@ -82244,7 +82244,7 @@
 <!--6617-->  <ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--6617-->  <DISPLAYLENGTH><![CDATA[20]]></DISPLAYLENGTH>
 <!--6617-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
-<!--6617-->  <SEQNO><![CDATA[20]]></SEQNO>
+<!--6617-->  <SEQNO><![CDATA[30]]></SEQNO>
 <!--6617-->  <ISSAMELINE><![CDATA[Y]]></ISSAMELINE>
 <!--6617-->  <ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
 <!--6617-->  <ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
@@ -85968,7 +85968,7 @@
 <!--6837-->  <ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--6837-->  <DISPLAYLENGTH><![CDATA[10]]></DISPLAYLENGTH>
 <!--6837-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
-<!--6837-->  <SEQNO><![CDATA[40]]></SEQNO>
+<!--6837-->  <SEQNO><![CDATA[50]]></SEQNO>
 <!--6837-->  <SORTNO><![CDATA[1]]></SORTNO>
 <!--6837-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
 <!--6837-->  <ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
@@ -192851,7 +192851,7 @@
 <!--766E946AA3718787E040007F010131F4-->  
<ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--766E946AA3718787E040007F010131F4-->  
<DISPLAYLENGTH><![CDATA[255]]></DISPLAYLENGTH>
 <!--766E946AA3718787E040007F010131F4-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
-<!--766E946AA3718787E040007F010131F4-->  <SEQNO><![CDATA[30]]></SEQNO>
+<!--766E946AA3718787E040007F010131F4-->  <SEQNO><![CDATA[40]]></SEQNO>
 <!--766E946AA3718787E040007F010131F4-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
 <!--766E946AA3718787E040007F010131F4-->  
<ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
 <!--766E946AA3718787E040007F010131F4-->  
<ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
@@ -192874,7 +192874,7 @@
 <!--766E946AA3738787E040007F010131F4-->  
<ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--766E946AA3738787E040007F010131F4-->  
<DISPLAYLENGTH><![CDATA[1]]></DISPLAYLENGTH>
 <!--766E946AA3738787E040007F010131F4-->  <ISREADONLY><![CDATA[N]]></ISREADONLY>
-<!--766E946AA3738787E040007F010131F4-->  <SEQNO><![CDATA[50]]></SEQNO>
+<!--766E946AA3738787E040007F010131F4-->  <SEQNO><![CDATA[70]]></SEQNO>
 <!--766E946AA3738787E040007F010131F4-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
 <!--766E946AA3738787E040007F010131F4-->  
<ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
 <!--766E946AA3738787E040007F010131F4-->  
<ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
@@ -192897,7 +192897,7 @@
 <!--7693B3D758076F59E040007F01012A25-->  
<ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
 <!--7693B3D758076F59E040007F01012A25-->  
<DISPLAYLENGTH><![CDATA[32]]></DISPLAYLENGTH>
 <!--7693B3D758076F59E040007F01012A25-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
-<!--7693B3D758076F59E040007F01012A25-->  <SEQNO><![CDATA[0]]></SEQNO>
+<!--7693B3D758076F59E040007F01012A25-->  <SEQNO><![CDATA[10]]></SEQNO>
 <!--7693B3D758076F59E040007F01012A25-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
 <!--7693B3D758076F59E040007F01012A25-->  
<ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
 <!--7693B3D758076F59E040007F01012A25-->  
<ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
@@ -194379,6 +194379,28 @@
 <!--7EC3B5CF03739057E040007F010110BF-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
 <!--7EC3B5CF03739057E040007F010110BF--></AD_FIELD>
 
+<!--7FDC7A18D86B83EAE040007F01012E08--><AD_FIELD>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<AD_FIELD_ID><![CDATA[7FDC7A18D86B83EAE040007F01012E08]]></AD_FIELD_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <NAME><![CDATA[Last Ping]]></NAME>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <DESCRIPTION><![CDATA[Time for the 
last time the session sent ping]]></DESCRIPTION>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<ISCENTRALLYMAINTAINED><![CDATA[Y]]></ISCENTRALLYMAINTAINED>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <AD_TAB_ID><![CDATA[475]]></AD_TAB_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<AD_COLUMN_ID><![CDATA[7FDC7A18D86783EAE040007F01012E08]]></AD_COLUMN_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<ISDISPLAYED><![CDATA[Y]]></ISDISPLAYED>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<DISPLAYLENGTH><![CDATA[19]]></DISPLAYLENGTH>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <ISREADONLY><![CDATA[Y]]></ISREADONLY>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <SEQNO><![CDATA[60]]></SEQNO>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  <ISSAMELINE><![CDATA[N]]></ISSAMELINE>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<ISFIELDONLY><![CDATA[N]]></ISFIELDONLY>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<SHOWINRELATION><![CDATA[Y]]></SHOWINRELATION>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<ISFIRSTFOCUSEDFIELD><![CDATA[N]]></ISFIRSTFOCUSEDFIELD>
+<!--7FDC7A18D86B83EAE040007F01012E08-->  
<AD_MODULE_ID><![CDATA[0]]></AD_MODULE_ID>
+<!--7FDC7A18D86B83EAE040007F01012E08--></AD_FIELD>
+
 <!--80C65FD7819B43638FB4A0413A91A65D--><AD_FIELD>
 <!--80C65FD7819B43638FB4A0413A91A65D-->  
<AD_FIELD_ID><![CDATA[80C65FD7819B43638FB4A0413A91A65D]]></AD_FIELD_ID>
 <!--80C65FD7819B43638FB4A0413A91A65D-->  
<AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r c4f60fa9011b -r 0e103bbcd82f 
src/org/openbravo/base/secureApp/LoginHandler.java
--- a/src/org/openbravo/base/secureApp/LoginHandler.java        Thu Feb 18 
14:55:14 2010 +0530
+++ b/src/org/openbravo/base/secureApp/LoginHandler.java        Thu Feb 18 
11:12:09 2010 +0100
@@ -1,6 +1,6 @@
 /*
  
************************************************************************************
- * Copyright (C) 2001-2009 Openbravo S.L.
+ * Copyright (C) 2001-2010 Openbravo S.L.
  * Licensed under the Apache Software License version 2.0
  * You may obtain a copy of the License at 
http://www.apache.org/licenses/LICENSE-2.0
  * Unless required by applicable law or agreed to  in writing,  software  
distributed
@@ -105,19 +105,19 @@
         String title = Utility.messageBD(myPool, 
"NUMBER_OF_CONCURRENT_USERS_REACHED_TITLE", vars
             .getLanguage());
         goToRetry(res, vars, msg, title, msgType, action);
-        break;
+        return;
       case NUMBER_OF_SOFT_USERS_REACHED:
         msg = Utility.messageBD(myPool, "NUMBER_OF_SOFT_USERS_REACHED", 
vars.getLanguage());
         title = Utility.messageBD(myPool, 
"NUMBER_OF_SOFT_USERS_REACHED_TITLE", vars.getLanguage());
         action = "../security/Menu.html";
         msgType = "Warning";
         goToRetry(res, vars, msg, title, msgType, action);
-        break;
+        return;
       case OPS_INSTANCE_NOT_ACTIVE:
         msg = Utility.messageBD(myPool, "OPS_INSTANCE_NOT_ACTIVE", 
vars.getLanguage());
         title = Utility.messageBD(myPool, "OPS_INSTANCE_NOT_ACTIVE_TITLE", 
vars.getLanguage());
         goToRetry(res, vars, msg, title, msgType, action);
-        break;
+        return;
       case MODULE_EXPIRED:
         msg = Utility.messageBD(myPool, "OPS_MODULE_EXPIRED", 
vars.getLanguage());
         title = Utility.messageBD(myPool, "OPS_MODULE_EXPIRED_TITLE", 
vars.getLanguage());
@@ -127,7 +127,7 @@
         }
         msg += expiredMoudules.toString();
         goToRetry(res, vars, msg, title, msgType, action);
-        break;
+        return;
       }
 
       SystemInformation sysInfo = 
OBDal.getInstance().get(SystemInformation.class, "0");
diff -r c4f60fa9011b -r 0e103bbcd82f 
src/org/openbravo/erpCommon/obps/ActivationKey.java
--- a/src/org/openbravo/erpCommon/obps/ActivationKey.java       Thu Feb 18 
14:55:14 2010 +0530
+++ b/src/org/openbravo/erpCommon/obps/ActivationKey.java       Thu Feb 18 
11:12:09 2010 +0100
@@ -30,6 +30,7 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -70,6 +71,8 @@
 
   private boolean notActiveYet = false;
 
+  private static final Logger log4j = Logger.getLogger(ActivationKey.class);
+
   public enum LicenseRestriction {
     NO_RESTRICTION, OPS_INSTANCE_NOT_ACTIVE, NUMBER_OF_SOFT_USERS_REACHED, 
NUMBER_OF_CONCURRENT_USERS_REACHED, MODULE_EXPIRED
   }
@@ -79,6 +82,7 @@
   }
 
   private static final int MILLSECS_PER_DAY = 24 * 60 * 60 * 1000;
+  private static final int PING_TIMEOUT_SECS = 120;
 
   public ActivationKey() {
     org.openbravo.model.ad.system.System sys = OBDal.getInstance().get(
@@ -337,23 +341,32 @@
 
       Long maxUsers = new Long(getProperty("limitusers"));
 
+      // maxUsers==0 is unlimited concurrent users
       if (maxUsers != 0) {
         boolean adminMode = OBContext.getOBContext().isInAdministratorMode();
         OBContext.getOBContext().setInAdministratorMode(true);
-
-        OBCriteria<Session> obCriteria = 
OBDal.getInstance().createCriteria(Session.class);
-        obCriteria.add(Expression.eq(Session.PROPERTY_SESSIONACTIVE, true));
-        if (currentSession != null && !currentSession.equals("")) {
-          obCriteria.add(Expression.ne(Session.PROPERTY_ID, currentSession));
+        int activeSessions = 0;
+        try {
+          activeSessions = getActiveSessions(currentSession);
+          log4j.info("Active sessions: " + activeSessions);
+          if (activeSessions >= maxUsers || (softUsers != null && 
activeSessions >= softUsers)) {
+            // Before raising concurrent users error, clean the session with 
ping timeout and try it
+            // again
+            if (deactivateTimeOutSessions()) {
+              activeSessions = getActiveSessions(currentSession);
+              log4j.info("Active sessions after timeout cleanup: " + 
activeSessions);
+            }
+          }
+        } catch (Exception e) {
+          log4j.error("Error checking sessions", e);
+        } finally {
+          OBContext.getOBContext().setInAdministratorMode(adminMode);
         }
-        int currentSessions = obCriteria.list().size();
-        OBContext.getOBContext().setInAdministratorMode(adminMode);
-
-        if (currentSessions >= maxUsers) {
+        if (activeSessions >= maxUsers) {
           return LicenseRestriction.NUMBER_OF_CONCURRENT_USERS_REACHED;
         }
 
-        if (softUsers != null && currentSessions >= softUsers) {
+        if (softUsers != null && activeSessions >= softUsers) {
           result = LicenseRestriction.NUMBER_OF_SOFT_USERS_REACHED;
         }
       }
@@ -366,6 +379,48 @@
     return result;
   }
 
+  /**
+   * Looks for all active sessions that haven't send a ping during last 
PING_TIMEOUT_SECS seconds
+   * and deactivates them.
+   */
+  private boolean deactivateTimeOutSessions() {
+    // Last valid ping time is current time substract timeout seconds
+    Calendar cal = Calendar.getInstance();
+    cal.add(Calendar.SECOND, (-1) * PING_TIMEOUT_SECS);
+    Date lastValidPingTime = new Date(cal.getTimeInMillis());
+
+    OBCriteria<Session> obCriteria = 
OBDal.getInstance().createCriteria(Session.class);
+    obCriteria.add(Expression.eq(Session.PROPERTY_SESSIONACTIVE, true));
+    obCriteria.add(Expression.isNotNull(Session.PROPERTY_LASTPING));
+    obCriteria.add(Expression.lt(Session.PROPERTY_LASTPING, 
lastValidPingTime));
+    boolean sessionDeactivated = false;
+    for (Session expiredSession : obCriteria.list()) {
+      expiredSession.setSessionActive(false);
+      sessionDeactivated = true;

------------------------------------------------------------------------------
Download Intel&reg; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs 
proactively, and fine-tune applications for parallel performance. 
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to