diff --git a/base/src/org/compiere/model/MSysConfig.java b/base/src/org/compiere/model/MSysConfig.java
index d1fcc6fc1d..285fea9fd4 100644
--- a/base/src/org/compiere/model/MSysConfig.java
+++ b/base/src/org/compiere/model/MSysConfig.java
@@ -13,11 +13,15 @@
*****************************************************************************/
package org.compiere.model;
-import java.sql.*;
-import java.util.*;
-import java.util.logging.*;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Properties;
+import java.util.logging.Level;
-import org.compiere.util.*;
+import org.compiere.util.CCache;
+import org.compiere.util.CLogger;
+import org.compiere.util.DB;
/**
* System Configuration
@@ -25,6 +29,8 @@ import org.compiere.util.*;
* @author Armen Rizal
* @version $Id: MSysConfig.java,v 1.5 2005/11/28 11:56:45 armen Exp $
* Contributor: Carlos Ruiz - globalqss - [ 1800371 ] System Configurator Enhancements
+ * @author Teo Sarca, SC ARHIPAC SERVICE SRL
+ *
BF [ 1885496 ] Performance NEEDS
*/
public class MSysConfig extends X_AD_SysConfig
{
@@ -55,6 +61,8 @@ public class MSysConfig extends X_AD_SysConfig
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger (MSysConfig.class);
+ /** Cache */
+ private static CCache s_cache = new CCache(Table_Name, 40, 0);
/**
* Get system configuration property of type string
@@ -64,25 +72,7 @@ public class MSysConfig extends X_AD_SysConfig
*/
public static String getValue(String Name, String defaultValue)
{
- String str = null;
- String sql = "SELECT Value FROM AD_SysConfig WHERE Name=? AND AD_Client_ID = 0 AND AD_Org_ID = 0 AND IsActive='Y'";
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
- pstmt.setString(1, Name);
- ResultSet rs = pstmt.executeQuery();
- if (rs.next())
- str = rs.getString(1);
- rs.close();
- pstmt.close();
- }
- catch (SQLException e)
- {
- s_log.log(Level.SEVERE, "getValue", e);
- }
- if (str == null)
- return defaultValue;
- return (str.trim());
+ return getValue(Name, defaultValue, 0, 0);
}
/**
@@ -92,7 +82,7 @@ public class MSysConfig extends X_AD_SysConfig
*/
public static String getValue(String Name)
{
- return (getValue(Name, null));
+ return getValue(Name, null);
}
/**
@@ -173,28 +163,7 @@ public class MSysConfig extends X_AD_SysConfig
*/
public static String getValue(String Name, String defaultValue, int AD_Client_ID)
{
- String str = null;
- String sql = "SELECT Value FROM AD_SysConfig WHERE Name=? AND AD_Client_ID = ? AND AD_Org_ID = 0 AND IsActive='Y'";
- try
- {
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
- pstmt.setString(1, Name);
- pstmt.setInt(2, AD_Client_ID);
- ResultSet rs = pstmt.executeQuery();
- if (rs.next())
- str = rs.getString(1);
- rs.close();
- pstmt.close();
- }
- catch (SQLException e)
- {
- s_log.log(Level.SEVERE, "getValue", e);
- }
- if (str == null) {
- // if not found by client - get the system parameter
- return getValue(Name, defaultValue);
- }
- return (str.trim());
+ return getValue(Name, defaultValue, AD_Client_ID, 0);
}
/**
@@ -290,29 +259,44 @@ public class MSysConfig extends X_AD_SysConfig
*/
public static String getValue(String Name, String defaultValue, int AD_Client_ID, int AD_Org_ID)
{
- String str = null;
- String sql = "SELECT Value FROM AD_SysConfig WHERE Name=? AND AD_Client_ID = ? AND AD_Org_ID = ? AND IsActive='Y'";
+ String key = ""+AD_Client_ID+"_"+AD_Org_ID+"_"+Name;
+ String str = s_cache.get(key);
+ if (str != null)
+ return str;
+ //
+ String sql = "SELECT Value FROM AD_SysConfig"
+ + " WHERE Name=? AND AD_Client_ID IN (0, ?) AND AD_Org_ID IN (0, ?) AND IsActive='Y'"
+ + " ORDER BY AD_Client_ID DESC, AD_Org_ID DESC";
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
try
{
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
+ pstmt = DB.prepareStatement(sql, null);
pstmt.setString(1, Name);
pstmt.setInt(2, AD_Client_ID);
pstmt.setInt(3, AD_Org_ID);
- ResultSet rs = pstmt.executeQuery();
+ rs = pstmt.executeQuery();
if (rs.next())
str = rs.getString(1);
- rs.close();
- pstmt.close();
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, "getValue", e);
- }
- if (str == null) {
- // if not found by organization - get the client parameter
- return getValue(Name, defaultValue, AD_Client_ID);
}
- return (str.trim());
+ finally
+ {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
+ //
+ if (str != null) {
+ str = str.trim();
+ s_cache.put(key, str);
+ return str;
+ }
+ else {
+ return defaultValue;
+ }
}
/**
@@ -324,7 +308,7 @@ public class MSysConfig extends X_AD_SysConfig
*/
public static String getValue(String Name, int AD_Client_ID, int AD_Org_ID)
{
- return (getValue(Name, null, AD_Client_ID, AD_Org_ID));
+ return getValue(Name, null, AD_Client_ID, AD_Org_ID);
}
/**
@@ -416,20 +400,25 @@ public class MSysConfig extends X_AD_SysConfig
// Get the configuration level from the System Record
String configLevel = null;
String sql = "SELECT ConfigurationLevel FROM AD_SysConfig WHERE Name=? AND AD_Client_ID = 0 AND AD_Org_ID = 0";
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
try
{
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
+ pstmt = DB.prepareStatement(sql, null);
pstmt.setString(1, getName());
- ResultSet rs = pstmt.executeQuery();
+ rs = pstmt.executeQuery();
if (rs.next())
configLevel = rs.getString(1);
- rs.close();
- pstmt.close();
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, "getValue", e);
}
+ finally
+ {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
if (configLevel == null) {
// not found for system
@@ -439,19 +428,22 @@ public class MSysConfig extends X_AD_SysConfig
sql = "SELECT ConfigurationLevel FROM AD_SysConfig WHERE Name=? AND AD_Client_ID = ? AND AD_Org_ID = 0";
try
{
- PreparedStatement pstmt = DB.prepareStatement(sql, null);
+ pstmt = DB.prepareStatement(sql, null);
pstmt.setString(1, getName());
pstmt.setInt(2, getAD_Client_ID());
- ResultSet rs = pstmt.executeQuery();
+ rs = pstmt.executeQuery();
if (rs.next())
configLevel = rs.getString(1);
- rs.close();
- pstmt.close();
}
catch (SQLException e)
{
s_log.log(Level.SEVERE, "getValue", e);
}
+ finally
+ {
+ DB.close(rs, pstmt);
+ rs = null; pstmt = null;
+ }
}
}
diff --git a/extend/src/test/functional/FunctionalTestSuite.java b/extend/src/test/functional/FunctionalTestSuite.java
index 07d91d99c3..8f7c8a7ae3 100644
--- a/extend/src/test/functional/FunctionalTestSuite.java
+++ b/extend/src/test/functional/FunctionalTestSuite.java
@@ -16,6 +16,7 @@ public class FunctionalTestSuite {
suite.addTestSuite(MLocationTest.class);
suite.addTestSuite(POTest.class);
suite.addTestSuite(MStorageTest.class);
+ suite.addTestSuite(MSysConfigTest.class);
//$JUnit-END$
return suite;
}
diff --git a/extend/src/test/functional/MSysConfigTest.java b/extend/src/test/functional/MSysConfigTest.java
new file mode 100644
index 0000000000..a901a9b67a
--- /dev/null
+++ b/extend/src/test/functional/MSysConfigTest.java
@@ -0,0 +1,72 @@
+/**
+ *
+ */
+package test.functional;
+
+import java.util.Properties;
+
+import org.compiere.model.MSysConfig;
+import org.compiere.util.DB;
+
+import test.AdempiereTestCase;
+
+/**
+ * MSysConfig Test Case
+ * @author Teo Sarca, SC ARHIPAC SERVICE SRL
+ *
+ */
+public class MSysConfigTest extends AdempiereTestCase {
+ private String varname = null;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ //
+ varname = "MSysConfigTestVariable" + System.currentTimeMillis();
+ new SysConfigTest(getCtx(), 0, 0, varname, "0_0", null).save();
+ new SysConfigTest(getCtx(), 11, 0, varname, "11_0", null).save();
+ new SysConfigTest(getCtx(), 11, 11, varname, "11_11", null).save();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ //
+ String sql = "DELETE FROM "+MSysConfig.Table_Name
+ +" WHERE "+MSysConfig.COLUMNNAME_Name+"=?";
+ DB.executeUpdate(sql, new Object[]{varname}, false, null);
+ }
+
+ public void testGetSet1() throws Exception {
+ //
+ assertEquals("0_0", MSysConfig.getValue(varname));
+ //
+ assertEquals("0_0", MSysConfig.getValue(varname, 0));
+ assertEquals("11_0", MSysConfig.getValue(varname, 11));
+ assertEquals("0_0", MSysConfig.getValue(varname, 12345));
+ //
+ assertEquals("0_0", MSysConfig.getValue(varname, 0, 0));
+ assertEquals("11_0", MSysConfig.getValue(varname, 11, 0));
+ assertEquals("11_11", MSysConfig.getValue(varname, 11, 11));
+ assertEquals("0_0", MSysConfig.getValue(varname, 12345, 12345));
+ assertEquals("11_0", MSysConfig.getValue(varname, 11, 12345));
+ }
+
+ private static class SysConfigTest extends MSysConfig {
+ private static final long serialVersionUID = 1L;
+
+ public SysConfigTest(Properties ctx,
+ int AD_Client_ID, int AD_Org_ID,
+ String Name, String Value,
+ String trxName)
+ {
+ super(ctx, 0, trxName);
+ setAD_Client_ID(AD_Client_ID);
+ setAD_Org_ID(AD_Org_ID);
+ setName(Name);
+ setValue(Value);
+ setConfigurationLevel(CONFIGURATIONLEVEL_Organization);
+ }
+
+ };
+}