Adrian,

In hopes of not losing whatever improvement you were working toward with these reverted changes: what was it that you were trying to do here?

-David


On Apr 2, 2008, at 10:07 AM, [EMAIL PROTECTED] wrote:
Author: adrianc
Date: Wed Apr  2 09:06:55 2008
New Revision: 643951

URL: http://svn.apache.org/viewvc?rev=643951&view=rev
Log:
Reverted the changes I made in rev 618892.

Modified:
ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ collections/ResourceBundleMapWrapper.java

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ collections/ResourceBundleMapWrapper.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/collections/ResourceBundleMapWrapper.java?rev=643951&r1=643950&r2=643951&view=diff
= = = = = = = = ====================================================================== --- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ collections/ResourceBundleMapWrapper.java (original) +++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/ collections/ResourceBundleMapWrapper.java Wed Apr 2 09:06:55 2008
@@ -18,180 +18,222 @@
*******************************************************************************/
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;
import java.util.ResourceBundle;
+import java.util.Set;

import org.ofbiz.base.util.UtilProperties;

-/** ResourceBundle MapStack class. Resource bundles are wrapped with a
- * <code>InternalRbmWrapper</code> object and kept in a MapStack -
- * which allows multiple bundles to be queried with a single method call. The class - * instance is constructed with the most specific resource bundle first, then additional - * less specific resource bundles are added to the bottom of the stack.
+
+/**
+ * Generic ResourceBundle Map Wrapper, given ResourceBundle allows it to be used as a Map
+ *
 */
[EMAIL PROTECTED]("serial")
-public class ResourceBundleMapWrapper extends MapStack<String> {
+public class ResourceBundleMapWrapper implements Map<String, Object>, Serializable {

+    protected MapStack<String> rbmwStack;
    protected ResourceBundle initialResourceBundle;

-    protected ResourceBundleMapWrapper() {}
+    protected ResourceBundleMapWrapper() {
+        rbmwStack = MapStack.create();
+    }

- /** When creating new from a InternalRbmWrapper the one passed to the constructor - * should be the most specific or local InternalRbmWrapper, with more common ones
-     * pushed onto the stack progressively.
+    /**
+ * When creating new from a InternalRbmWrapper the one passed to the constructor should be the most specific or local InternalRbmWrapper, with more common ones pushed onto the stack progressively.
     */
public ResourceBundleMapWrapper(InternalRbmWrapper initialInternalRbmWrapper) { this.initialResourceBundle = initialInternalRbmWrapper.getResourceBundle();
-        push(initialInternalRbmWrapper);
+        this.rbmwStack = MapStack.create(initialInternalRbmWrapper);
    }

- /** When creating new from a ResourceBundle the one passed to the constructor - * should be the most specific or local ResourceBundle, with more common ones
-     * pushed onto the stack progressively.
+    /**
+ * When creating new from a ResourceBundle the one passed to the constructor should be the most specific or local ResourceBundle, with more common ones pushed onto the stack progressively.
     */
public ResourceBundleMapWrapper(ResourceBundle initialResourceBundle) {
        if (initialResourceBundle == null) {
throw new IllegalArgumentException("Cannot create ResourceBundleMapWrapper with a null initial ResourceBundle.");
        }
        this.initialResourceBundle = initialResourceBundle;
-        push(new InternalRbmWrapper(initialResourceBundle));
-    }
-
-    public void addToBottom(Map<String, Object> existingMap) {
-        if (!stackList.contains(existingMap)) {
-            super.addToBottom(existingMap);
-        }
+ this.rbmwStack = MapStack.create(new InternalRbmWrapper(initialResourceBundle));
    }

-    public void push(Map<String, Object> existingMap) {
-        if (!stackList.contains(existingMap)) {
-            super.push(existingMap);
-        }
-    }
-
- /** Puts ResourceBundle on the BOTTOM of the stack - meaning the bundle will
-     * be overriden by higher layers on the stack.
-     */
+ /** Puts ResourceBundle on the BOTTOM of the stack (bottom meaning will be overriden by higher layers on the stack, ie everything else already there) */ public void addBottomResourceBundle(ResourceBundle topResourceBundle) {
-        addToBottom(new InternalRbmWrapper(topResourceBundle));
+ this.rbmwStack.addToBottom(new InternalRbmWrapper(topResourceBundle));
    }

- /** Puts InternalRbmWrapper on the BOTTOM of the stack - meaning the InternalRbmWrapper
-     * will be overriden by higher layers on the stack.
-     */
+ /** Puts InternalRbmWrapper on the BOTTOM of the stack (bottom meaning will be overriden by higher layers on the stack, ie everything else already there) */ public void addBottomResourceBundle(InternalRbmWrapper topInternalRbmWrapper) {
-        addToBottom(topInternalRbmWrapper);
+        this.rbmwStack.addToBottom(topInternalRbmWrapper);
    }

- /** Puts the specified ResourceBundle on the BOTTOM of the stack - meaning the - * ResourceBundle will be overriden by higher layers on the stack. Th method - * will throw an exception if the specified ResourceBundle isn't found.
-     */
+ /** Don't pass the locale to make sure it has the same locale as the base */
    public void addBottomResourceBundle(String resource) {
        if (this.initialResourceBundle == null) {
throw new IllegalArgumentException("Cannot add bottom resource bundle, this wrapper was not properly initialized (there is no base/initial ResourceBundle).");
        }
- this .addBottomResourceBundle(UtilProperties.getResourceBundle(resource, this.initialResourceBundle.getLocale())); + this.addBottomResourceBundle(new InternalRbmWrapper(UtilProperties.getResourceBundle(resource, this.initialResourceBundle.getLocale())));
    }

- /** Puts a ResourceBundle on the TOP of the stack - meaning the ResourceBundle will - * override lower layers on the stack. This is the reverse of how resource bundles
-     * are normally added.
+ /** In general we don't want to use this, better to start with the more specific ResourceBundle and add layers of common ones... + * Puts ResourceBundle on the top of the stack (top meaning will override lower layers on the stack)
     */
    public void pushResourceBundle(ResourceBundle topResourceBundle) {
-        push(new InternalRbmWrapper(topResourceBundle));
+ this.rbmwStack.push(new InternalRbmWrapper(topResourceBundle));
    }

- /** Returns the ResourceBundle that was passed in the class constructor.
-     */
    public ResourceBundle getInitialResourceBundle() {
        return this.initialResourceBundle;
    }

- /** Retrieves the specified object from the MapStack. If no matching object is found,
-     * the <code>arg0</code> object is returned.
-     */
+    public void clear() {
+        this.rbmwStack.clear();
+    }
+    public boolean containsKey(Object arg0) {
+        return this.rbmwStack.containsKey(arg0);
+    }
+    public boolean containsValue(Object arg0) {
+        return this.rbmwStack.containsValue(arg0);
+    }
+    public Set<Map.Entry<String, Object>> entrySet() {
+        return this.rbmwStack.entrySet();
+    }
    public Object get(Object arg0) {
-        Object value = super.get(arg0);
+        Object value = this.rbmwStack.get(arg0);
        if (value == null) {
            value = arg0;
        }
        return value;
    }
+    public boolean isEmpty() {
+        return this.rbmwStack.isEmpty();
+    }
+    public Set<String> keySet() {
+        return this.keySet();
+    }
+    public Object put(String key, Object value) {
+        return this.rbmwStack.put(key, value);
+    }
+ public void putAll(Map<? extends String, ? extends Object> arg0) {
+        this.rbmwStack.putAll(arg0);
+    }
+    public Object remove(Object arg0) {
+        return this.rbmwStack.remove(arg0);
+    }
+    public int size() {
+        return this.rbmwStack.size();
+    }
+    public Collection<Object> values() {
+        return this.rbmwStack.values();
+    }

- /** Encapsulates a ResourceBundle in a HashMap. This is an incomplete implementation - * of the Map interface - its intended use is to retrieve ResourceBundle elements - * in a Map-like way. Map interface methods that remove elements will throw
-     * an exception.
-     */
-    @SuppressWarnings("serial")
- public static class InternalRbmWrapper extends HashMap<String, Object> { + public static class InternalRbmWrapper implements Map<String, Object>, Serializable {
        protected ResourceBundle resourceBundle;
+        protected Map<String, Object> topLevelMap;

        public InternalRbmWrapper(ResourceBundle resourceBundle) {
            if (resourceBundle == null) {
throw new IllegalArgumentException("Cannot create InternalRbmWrapper with a null ResourceBundle.");
            }
            this.resourceBundle = resourceBundle;
- // 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
-            Enumeration<String> keyNum = resourceBundle.getKeys();
-            while (keyNum.hasMoreElements()) {
-                String key = keyNum.nextElement();
-                Object value = resourceBundle.getObject(key);
-                put(key, value);
+            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
+            if (resourceBundle != null) {
+ Enumeration<String> keyNum = resourceBundle.getKeys();
+                while (keyNum.hasMoreElements()) {
+                    String key = keyNum.nextElement();
+ //resourceBundleMap.put(key, bundle.getObject(key));
+                    Object value = resourceBundle.getObject(key);
+                    topLevelMap.put(key, value);
+                }
            }
- put("_RESOURCE_BUNDLE_", resourceBundle); // Is this being used anywhere?
+            topLevelMap.put("_RESOURCE_BUNDLE_", resourceBundle);
        }

-        public boolean equals(Object obj) {
-            return resourceBundle.equals(obj);
+        /* (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 hashCode() {
-            return resourceBundle.hashCode();
+
+        /* (non-Javadoc)
+         * @see java.util.Map#isEmpty()
+         */
+        public boolean isEmpty() {
+            return topLevelMap.isEmpty();
        }
-
-        /*
-         * (non-Javadoc)
-         *
+
+        /* (non-Javadoc)
         * @see java.util.Map#containsKey(java.lang.Object)
         */
        public boolean containsKey(Object arg0) {
-            if (super.containsKey(arg0)) {
+            if (topLevelMap.containsKey(arg0)) {
                return true;
            } else {
                try {
if (this.resourceBundle.getObject((String) arg0) != null) {
                        return true;
                    }
-                } catch (Exception e) {
-                    // Do nothing
+                } catch (NullPointerException e) {
+                    // happens when arg0 is null
+                } catch (MissingResourceException e) {
+ // nope, not found... nothing, will automatically return false below
                }
            }
            return false;
        }

        /* (non-Javadoc)
+         * @see java.util.Map#containsValue(java.lang.Object)
+         */
+        public boolean containsValue(Object arg0) {
+ throw new RuntimeException("Not implemented for ResourceBundleMapWrapper");
+        }
+
+        /* (non-Javadoc)
         * @see java.util.Map#get(java.lang.Object)
         */
        public Object get(Object arg0) {
-            Object value = super.get(arg0);
-            if (value == null) {
-                try {
- value = this.resourceBundle.getObject((String) arg0);
-                } catch (MissingResourceException mre) {
-                    // Do nothing
+            Object value = this.topLevelMap.get(arg0);
+            if (resourceBundle != null) {
+                if (value == null) {
+                    try {
+ value = this.resourceBundle.getObject((String) arg0);
+                    } catch(MissingResourceException mre) {
+ // do nothing, this will be handled by recognition that the value is still null
+                    }
                }
+                if (value == null) {
+                    try {
+ value = this.resourceBundle.getString((String) arg0);
+                    } catch(MissingResourceException mre) {
+ // do nothing, this will be handled by recognition that the value is still null
+                    }
+                }
+            }
+ /* we used to do this here, but now we'll do it in the top-level class since doing it here would prevent searching down the stack
+            if (value == null) {
+                value = arg0;
            }
+            */
            return value;
        }

        /* (non-Javadoc)
+         * @see java.util.Map#put(java.lang.Object, java.lang.Object)
+         */
+        public Object put(String arg0, Object arg1) {
+ throw new RuntimeException("Not implemented/allowed for ResourceBundleMapWrapper");
+        }
+
+        /* (non-Javadoc)
         * @see java.util.Map#remove(java.lang.Object)
         */
        public Object remove(Object arg0) {
@@ -199,14 +241,46 @@
        }

        /* (non-Javadoc)
+         * @see java.util.Map#putAll(java.util.Map)
+         */
+        public void putAll(Map arg0) {
+ throw new RuntimeException("Not implemented for ResourceBundleMapWrapper");
+        }
+
+        /* (non-Javadoc)
         * @see java.util.Map#clear()
         */
        public void clear() {
throw new RuntimeException("Not implemented for ResourceBundleMapWrapper");
        }

+        /* (non-Javadoc)
+         * @see java.util.Map#keySet()
+         */
+        public Set<String> keySet() {
+            return this.topLevelMap.keySet();
+        }
+
+        /* (non-Javadoc)
+         * @see java.util.Map#values()
+         */
+        public Collection<Object> values() {
+            return this.topLevelMap.values();
+        }
+
+        /* (non-Javadoc)
+         * @see java.util.Map#entrySet()
+         */
+        public Set<Map.Entry<String, Object>> entrySet() {
+            return this.topLevelMap.entrySet();
+        }
+
        public ResourceBundle getResourceBundle() {
            return this.resourceBundle;
        }
+
+        /*public String toString() {
+            return this.topLevelMap.toString();
+        }*/
    }
}



Reply via email to