You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2007/10/17 22:27:50 UTC

svn commit: r585670 - in /ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache: CacheLineTable.java UtilCache.java

Author: doogie
Date: Wed Oct 17 13:27:50 2007
New Revision: 585670

URL: http://svn.apache.org/viewvc?rev=585670&view=rev
Log:
Don't use ObjectType.NULL for the in-memory table.

Modified:
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/CacheLineTable.java
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/UtilCache.java

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/CacheLineTable.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/CacheLineTable.java?rev=585670&r1=585669&r2=585670&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/CacheLineTable.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/CacheLineTable.java Wed Oct 17 13:27:50 2007
@@ -46,6 +46,8 @@
     protected String fileStore = null;
     protected String cacheName = null;
     protected int maxInMemory = 0;
+    protected boolean isNullSet = false;
+    protected CacheLine nullValue = null;
 
     public CacheLineTable(String fileStore, String cacheName, boolean useFileSystemStore, int maxInMemory) {
         this.fileStore = fileStore;
@@ -84,15 +86,23 @@
     }
 
     public synchronized CacheLine put(Object key, CacheLine value) {
+        CacheLine oldValue;
         if (key == null) {
             if (Debug.verboseOn()) Debug.logVerbose("In CacheLineTable tried to put with null key, using NullObject" + this.cacheName, module);
-            key = ObjectType.NULL;
+            if (memoryTable instanceof LRUMap) {
+                oldValue = (CacheLine) memoryTable.put(key, value);
+            } else {
+                oldValue = isNullSet ? nullValue : null;
+                isNullSet = true;
+                nullValue = value;
+            }
+        } else {
+            oldValue = (CacheLine) memoryTable.put(key, value);
         }
-        CacheLine oldValue = (CacheLine) memoryTable.put(key, value);
         if (fileTable != null) {
             try {
                 if (oldValue == null) oldValue = (CacheLine) fileTable.get(key);
-                fileTable.put(key, value);                
+                fileTable.put(key != null ? key : ObjectType.NULL, value);                
                 CacheLineTable.jdbmMgr.commit();
             } catch (IOException e) {
                 Debug.logError(e, module);
@@ -104,13 +114,25 @@
     public CacheLine get(Object key) {
         if (key == null) {
             if (Debug.verboseOn()) Debug.logVerbose("In CacheLineTable tried to get with null key, using NullObject" + this.cacheName, module);
-            key = ObjectType.NULL;
         }
-        CacheLine value = (CacheLine) memoryTable.get(key);
+        return getNoCheck(key);
+    }
+
+    protected CacheLine getNoCheck(Object key) {
+        CacheLine value;
+        if (memoryTable instanceof LRUMap) {
+            value = (CacheLine) memoryTable.get(key);
+        } else {
+            if (key == null) {
+                value = isNullSet ? nullValue : null;
+            } else {
+                value = memoryTable.get(key);
+            }
+        }
         if (value == null) {
             if (fileTable != null) {
                 try {
-                    value = (CacheLine) fileTable.get(key);
+                    value = (CacheLine) fileTable.get(key != null ? key : ObjectType.NULL);
                 } catch (IOException e) {
                     Debug.logError(e, module);
                 }
@@ -122,17 +144,25 @@
     public synchronized CacheLine remove(Object key) {
         if (key == null) {
             if (Debug.verboseOn()) Debug.logVerbose("In CacheLineTable tried to remove with null key, using NullObject" + this.cacheName, module);
-            key = ObjectType.NULL;
         }
-        CacheLine value = this.get(key);
+        CacheLine value = this.getNoCheck(key);
         if (fileTable != null) {
             try {
-                fileTable.remove(key);
+                fileTable.remove(key != null ? key : ObjectType.NULL);
             } catch (IOException e) {
                 Debug.logError(e, module);
             }
         }
-        memoryTable.remove(key);
+        if (key == null) {
+            if (memoryTable instanceof LRUMap) {
+                memoryTable.remove(key);
+            } else {
+                isNullSet = false;
+                nullValue = null;
+            }
+        } else {
+            memoryTable.remove(key);
+        }
         return value;
     }
 
@@ -151,6 +181,7 @@
                 Debug.logError(e, module);
             }
         } else {
+            if (isNullSet) values.add(nullValue);
             values.addAll(memoryTable.values());
         }
 
@@ -181,10 +212,7 @@
             }
         } else {
             keys.addAll(memoryTable.keySet());
-            if (keys.contains(ObjectType.NULL)) {
-                keys.remove(ObjectType.NULL);
-                keys.add(null);
-            }
+            if (isNullSet) keys.add(null);
         }
 
         return Collections.unmodifiableSet(keys);
@@ -208,13 +236,19 @@
             }
         }
         memoryTable.clear();
+        isNullSet = false;
+        nullValue = null;
     }
 
     public int size() {
         if (fileTable != null) {
             return this.keySet().size();
         } else {
-            return memoryTable.size();
+            if (isNullSet) {
+                return memoryTable.size() + 1;
+            } else {
+                return memoryTable.size();
+            }
         }
     }
 
@@ -230,6 +264,11 @@
 
         if (newSize > 0) {
             this.memoryTable = new LRUMap(newSize);
+            if (isNullSet) {
+                this.memoryTable.put(null, nullValue);
+                isNullSet = false;
+                nullValue = null;
+            }
         } else {
             this.memoryTable = FastMap.newInstance();
         }
@@ -243,6 +282,12 @@
         Iterator i = memoryTable.keySet().iterator();
 
         int currentIdx = 0;
+        if (isNullSet) {
+            if (currentIdx == index) {
+                return null;
+            }
+            currentIdx++;
+        }
         while (i.hasNext()) {
             Object key = i.next();
             if (currentIdx == index) {

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/UtilCache.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/UtilCache.java?rev=585670&r1=585669&r2=585670&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/UtilCache.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/cache/UtilCache.java Wed Oct 17 13:27:50 2007
@@ -33,7 +33,6 @@
 import javolution.util.FastSet;
 
 import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.UtilValidate;
 
 /**
@@ -286,10 +285,6 @@
      * @param expireTime how long to keep this key in the cache
      */
     public synchronized Object put(Object key, Object value, long expireTime) {
-        if (key == null) {
-            if (Debug.verboseOn()) Debug.logVerbose("In UtilCache tried to put with null key, using NullObject for cache " + this.getName(), module);
-            key = ObjectType.NULL;
-        }
         CacheLine oldCacheLine;
         CacheLine newCacheLine;
         if (expireTime > 0) {
@@ -324,10 +319,6 @@
     }
 
     protected CacheLine getInternalNoCheck(Object key) {
-        if (key == null) {
-            if (Debug.verboseOn()) Debug.logVerbose("In UtilCache tried to get with null key, using NullObject for cache " + this.getName(), module);
-            key = ObjectType.NULL;
-        }
         CacheLine line = cacheLineTable.get(key);
         return line;
     }
@@ -386,10 +377,6 @@
     
     /** This is used for internal remove calls because we only want to count external calls */
     protected synchronized Object removeInternal(Object key, boolean countRemove) {        
-        if (key == null) {
-            if (Debug.verboseOn()) Debug.logVerbose("In UtilCache tried to remove with null key, using NullObject for cache " + this.getName(), module);
-            key = ObjectType.NULL;
-        }
         CacheLine line = cacheLineTable.remove(key);
         if (line != null) {
             noteRemoval(key, line.getValue());