Author: jleroux
Date: Fri May 6 08:17:17 2011
New Revision: 1100127
URL: http://svn.apache.org/viewvc?rev=1100127&view=rev
Log:
A patch from Philippe Mouawad "ResourceBundleMapWrapper memory usage
improvement" https://issues.apache.org/jira/browse/OFBIZ-4072
Patch that creates the Map only when it is required
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java?rev=1100127&r1=1100126&r2=1100127&view=diff
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java
Fri May 6 08:17:17 2011
@@ -20,7 +20,6 @@ package org.ofbiz.base.util.collections;
import java.io.Serializable;
import java.util.Collection;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
@@ -154,47 +153,74 @@ public class ResourceBundleMapWrapper im
public static class InternalRbmWrapper implements Map<String, Object>,
Serializable {
protected ResourceBundle resourceBundle;
protected Map<String, Object> topLevelMap;
-
+ private boolean isMapInitialized = false;
+
public InternalRbmWrapper(ResourceBundle resourceBundle) {
if (resourceBundle == null) {
throw new IllegalArgumentException("Cannot create
InternalRbmWrapper with a null ResourceBundle.");
}
this.resourceBundle = resourceBundle;
- topLevelMap = new HashMap<String, Object>();
- // NOTE: this does NOT return all keys, ie keys from parent
ResourceBundles, so we keep the resourceBundle object to look at when the main
Map doesn't have a certain value
+ }
+
+ /**
+ * Creates the topLevelMap only when it is required
+ */
+ private void createMapWhenNeeded() {
+ if (isMapInitialized) {
+ return;
+ }
+ // NOTE: this does NOT return all keys, ie keys from parent
+ // ResourceBundles, so we keep the resourceBundle object to look at
+ // when the main Map doesn't have a certain value
if (resourceBundle != null) {
- Enumeration<String> keyNum = resourceBundle.getKeys();
- while (keyNum.hasMoreElements()) {
- String key = keyNum.nextElement();
- //resourceBundleMap.put(key, bundle.getObject(key));
+ Set<String> set = resourceBundle.keySet();
+ topLevelMap = new HashMap<String, Object>(set.size());
+ for (String key : set) {
Object value = resourceBundle.getObject(key);
topLevelMap.put(key, value);
}
+ } else {
+ topLevelMap = new HashMap<String, Object>(1);
}
topLevelMap.put("_RESOURCE_BUNDLE_", resourceBundle);
+ isMapInitialized = true;
}
+
/* (non-Javadoc)
* @see java.util.Map#size()
*/
- public int size() {
- // this is an approximate size, won't include elements from parent
bundles
- return topLevelMap.size() - 1;
+ public int size() {
+ if(isMapInitialized)
+ {
+ // this is an approximate size, won't include elements from
parent bundles
+ return topLevelMap.size() -1;
+ }
+ else
+ {
+ return resourceBundle.keySet().size();
+ }
}
/* (non-Javadoc)
* @see java.util.Map#isEmpty()
*/
public boolean isEmpty() {
- return topLevelMap.isEmpty();
+ if (isMapInitialized) {
+ return topLevelMap.isEmpty();
+ } else {
+ return resourceBundle.keySet().size() == 0;
+ }
}
/* (non-Javadoc)
* @see java.util.Map#containsKey(java.lang.Object)
*/
public boolean containsKey(Object arg0) {
- if (topLevelMap.containsKey(arg0)) {
- return true;
+ if (isMapInitialized) {
+ if (topLevelMap.containsKey(arg0)) {
+ return true;
+ }
} else {
try {
if (this.resourceBundle.getObject((String) arg0) != null) {
@@ -203,7 +229,8 @@ public class ResourceBundleMapWrapper im
} catch (NullPointerException e) {
// happens when arg0 is null
} catch (MissingResourceException e) {
- // nope, not found... nothing, will automatically return
false below
+ // nope, not found... nothing, will automatically return
+ // false below
}
}
return false;
@@ -220,9 +247,14 @@ public class ResourceBundleMapWrapper im
* @see java.util.Map#get(java.lang.Object)
*/
public Object get(Object arg0) {
- Object value = this.topLevelMap.get(arg0);
- if (resourceBundle != null) {
- if (value == null) {
+ Object value = null;
+ if(isMapInitialized)
+ {
+ value = this.topLevelMap.get(arg0);
+ }
+
+ if (resourceBundle != null) {
+ if (value == null) {
try {
value = this.resourceBundle.getObject((String) arg0);
} catch (MissingResourceException mre) {
@@ -277,6 +309,7 @@ public class ResourceBundleMapWrapper im
* @see java.util.Map#keySet()
*/
public Set<String> keySet() {
+ createMapWhenNeeded();
return this.topLevelMap.keySet();
}
@@ -284,6 +317,7 @@ public class ResourceBundleMapWrapper im
* @see java.util.Map#values()
*/
public Collection<Object> values() {
+ createMapWhenNeeded();
return this.topLevelMap.values();
}
@@ -291,6 +325,7 @@ public class ResourceBundleMapWrapper im
* @see java.util.Map#entrySet()
*/
public Set<Map.Entry<String, Object>> entrySet() {
+ createMapWhenNeeded();
return this.topLevelMap.entrySet();
}