You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ni...@apache.org on 2005/12/23 04:37:45 UTC
svn commit: r358692 - in /jakarta/commons/proper/resources/trunk:
src/java/org/apache/commons/resources/impl/
src/java/org/apache/commons/resources/util/
src/test/org/apache/commons/resources/util/ xdocs/
Author: niallp
Date: Thu Dec 22 19:37:26 2005
New Revision: 358692
URL: http://svn.apache.org/viewcvs?rev=358692&view=rev
Log:
Refactor ResourceBundleResources for issues described in Bug 38021.
Added:
jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/
jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java (with props)
jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html (with props)
jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/
jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java (with props)
Modified:
jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/impl/ResourceBundleResources.java
jakarta/commons/proper/resources/trunk/xdocs/changes.xml
Modified: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/impl/ResourceBundleResources.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/impl/ResourceBundleResources.java?rev=358692&r1=358691&r2=358692&view=diff
==============================================================================
--- jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/impl/ResourceBundleResources.java (original)
+++ jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/impl/ResourceBundleResources.java Thu Dec 22 19:37:26 2005
@@ -24,20 +24,16 @@
package org.apache.commons.resources.impl;
import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
-import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
-import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.resources.ResourcesException;
import org.apache.commons.resources.ResourcesKeyException;
+import org.apache.commons.resources.util.IteratorEnumeration;
/**
* <p>Concrete implementation of
@@ -83,62 +79,6 @@
private String base = null;
- /**
- * <p>Two-level cache of <code>ResourceBundle</code> instances
- * that have previously been acquired by this {@link org.apache.commons.resources.Resources}
- * instance. The first-level key is the <code>ClassLoader</code>
- * instance used to load the bundles. The first-level value is a
- * <code>java.util.Map</code> that is then, in turn, keyed by the
- * <code>java.util.Locale</code> to which a particular bundle belongs.</p>
- */
- private Map bundles = new HashMap();
-
-
- // ------------------------------------------------------ Lifecycle Methods
-
-
- /**
- * <p>This must be called to initialize the data content of this
- * {@link org.apache.commons.resources.Resources} instance, before any of the <code>getXxx()</code>
- * methods are called.</p>
- *
- * @exception ResourcesException if an error occurs during initialization
- */
- public void init() throws ResourcesException {
-
- if (getLog().isDebugEnabled()) {
- getLog().debug("Initializing for base name '" + base + "'");
- }
-
- }
-
-
- /**
- * <p>This method must be called when the manager of this resource
- * decides that it's no longer needed. After this method is called,
- * no further calls to any of the <code>getXxx()</code> methods are
- * allowed.</p>
- *
- * @exception ResourcesException if an error occurs during finalization
- */
- public void destroy() throws ResourcesException {
-
- if (getLog().isDebugEnabled()) {
- getLog().debug("Finalizing for base name '" + base + "'");
- }
-
- synchronized (bundles) {
- Iterator loaders = bundles.keySet().iterator();
- while (loaders.hasNext()) {
- ClassLoader loader = (ClassLoader) loaders.next();
- ((Map) bundles.get(loader)).clear();
- }
- bundles.clear();
- }
-
- }
-
-
// ------------------------------------------------------------- Properties
@@ -161,26 +101,12 @@
*/
public Iterator getKeys() {
- synchronized (bundles) {
-
- ClassLoader loader = getClassLoader();
- Map loaderMap = (Map) bundles.get(loader);
- if (loaderMap == null) {
- return (Collections.EMPTY_SET.iterator());
- }
- Set results = new HashSet();
- Iterator locales = loaderMap.keySet().iterator();
- while (locales.hasNext()) {
- Locale locale = (Locale) locales.next();
- ResourceBundle bundle = (ResourceBundle)
- loaderMap.get(locale);
- Enumeration keys = bundle.getKeys();
- while (keys.hasMoreElements()) {
- results.add(keys.nextElement());
- }
- }
- return (results.iterator());
-
+ try {
+ ResourceBundle bundle = getBundle(null);
+ return new IteratorEnumeration(bundle.getKeys());
+
+ } catch (MissingResourceException e) {
+ return Collections.EMPTY_LIST.iterator();
}
}
@@ -224,7 +150,7 @@
} catch (MissingResourceException e) {
if (getLog().isTraceEnabled()) {
- getLog().trace("No message found for key '" + key +
+ getLog().trace("No resource found for key '" + key +
"' and locale '" + locale + "'");
}
if (isReturnNull()) {
@@ -260,26 +186,13 @@
locale = Locale.getDefault();
}
- synchronized (bundles) {
+ // Locate the appropriate ClassLoader
+ ClassLoader loader = getClassLoader();
- // Locate or create the Map for the appropriate ClassLoader
- ClassLoader loader = getClassLoader();
- Map loaderMap = (Map) bundles.get(loader);
- if (loaderMap == null) {
- loaderMap = new HashMap();
- bundles.put(loader, loaderMap);
- }
-
- // Locate or create the requested ResourceBundle instance
- ResourceBundle bundle =
- (ResourceBundle) loaderMap.get(locale);
- if (bundle == null) {
- bundle = ResourceBundle.getBundle(base, locale, loader);
- loaderMap.put(locale, bundle);
- }
- return (bundle);
+ // Locate the requested ResourceBundle instance
+ ResourceBundle bundle = ResourceBundle.getBundle(base, locale, loader);
- }
+ return (bundle);
}
Added: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java?rev=358692&view=auto
==============================================================================
--- jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java (added)
+++ jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java Thu Dec 22 19:37:26 2005
@@ -0,0 +1,119 @@
+/*
+ * $Id$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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 under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.commons.resources.util;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+/**
+ * Two way Adaptor class for java.util.Iterator and java.util.Enumeration.
+ */
+public class IteratorEnumeration implements Iterator, Enumeration {
+
+ private Iterator iterator;
+ private Enumeration enumeration;
+
+ // -------------------------- Constructors
+
+ /**
+ * Construct an instance which wraps an Iterator.
+ *
+ * @param iterator The <code>Iterator</code> to wrap.
+ */
+ public IteratorEnumeration(Iterator iterator) {
+ this.iterator = iterator;
+ }
+
+ /**
+ * Construct an instance which wraps an Enumeration.
+ *
+ * @param enumeration The <code>Enumeration</code> to wrap.
+ */
+ public IteratorEnumeration(Enumeration enumeration) {
+ this.enumeration = enumeration;
+ }
+
+ // -------------------------- Iterator Methods
+
+ /**
+ * <code>remove()<code> is not supported.
+ * @throws UnsupportedOperationException always.
+ */
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Indicates whether the wrapped
+ * <code>Iterator/Enumeration</code> has more elements.
+ *
+ * @return <code>true</code> if the wrapped
+ * <code>Iterator/Enumeration</code> has more elements.
+ */
+ public boolean hasNext() {
+ if (iterator == null) {
+ return enumeration.hasMoreElements();
+ } else {
+ return iterator.hasNext();
+ }
+ }
+
+ /**
+ * Returns the next element in the wrapped
+ * <code>Iterator/Enumeration</code>.
+ *
+ * @return the next element.
+ */
+ public Object next() {
+ if (iterator == null) {
+ return enumeration.nextElement();
+ } else {
+ return iterator.next();
+ }
+ }
+
+ // -------------------------- Enumeration Methods
+
+ /**
+ * Indicates whether the wrapped
+ * <code>Iterator/Enumeration</code> has more elements.
+ *
+ * @return <code>true</code> if the wrapped
+ * <code>Iterator/Enumeration</code> has more elements.
+ */
+ public boolean hasMoreElements() {
+ return hasNext();
+ }
+
+ /**
+ * Returns the next element in the wrapped
+ * <code>Iterator/Enumeration</code>.
+ *
+ * @return the next element.
+ */
+ public Object nextElement() {
+ return next();
+ }
+
+}
Propchange: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/IteratorEnumeration.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html?rev=358692&view=auto
==============================================================================
--- jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html (added)
+++ jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html Thu Dec 22 19:37:26 2005
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>Package Documentation for org.apache.commons.resources.util Package</title>
+</head>
+<body bgcolor="white">
+<p>
+This package contains utility classes used by Commons Resources.
+</p>
+</body>
+</html>
Propchange: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/proper/resources/trunk/src/java/org/apache/commons/resources/util/package.html
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added: jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java?rev=358692&view=auto
==============================================================================
--- jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java (added)
+++ jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java Thu Dec 22 19:37:26 2005
@@ -0,0 +1,119 @@
+/*
+ * $Id$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * 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 under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.commons.resources.util;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Enumeration;
+
+/**
+ * Unit tests for the <code>org.apache.commons.resources.util.IteratorEnumeration</code> class.
+ */
+public class IteratorEnumerationTestCase extends TestCase {
+
+ /**
+ * Defines the testcase name for JUnit.
+ *
+ * @param theName the testcase's name.
+ */
+ public IteratorEnumerationTestCase(String theName) {
+ super(theName);
+ }
+
+ /**
+ * Start the tests.
+ *
+ * @param theArgs the arguments. Not used
+ */
+ public static void main(String[] theArgs) {
+ junit.awtui.TestRunner.main(
+ new String[] { IteratorEnumerationTestCase.class.getName()});
+ }
+
+ /**
+ * @return a test suite (<code>TestSuite</code>) that includes all methods
+ * starting with "test"
+ */
+ public static Test suite() {
+ return new TestSuite(IteratorEnumerationTestCase.class);
+ }
+
+ public void testIterator() {
+
+ // Wrap an Iterator
+ ArrayList list = new ArrayList();
+ list.add("one");
+ Enumeration enumeration = new IteratorEnumeration(list.iterator());
+ Iterator iterator = new IteratorEnumeration(list.iterator());
+
+ // Test Enumeration
+ assertTrue("Enumeration.hasMoreElements(A)", enumeration.hasMoreElements());
+ assertEquals("Enumeration.nextElement", "one", enumeration.nextElement());
+ assertFalse("Enumeration.hasMoreElements(B)", enumeration.hasMoreElements());
+
+ // Test Iterator
+ assertTrue("Iterator.hasNext(A)", iterator.hasNext());
+ assertEquals("Iterator.next", "one", iterator.next());
+ assertFalse("Iterator.hasNext(B)", iterator.hasNext());
+ try {
+ iterator.remove();
+ fail("Expected UnsupportedOperationException");
+ } catch(UnsupportedOperationException e) {
+ // expected result
+ }
+
+ }
+
+ public void testEnumeration() {
+
+ // Wrap an Enumeration
+ Hashtable hashtable = new Hashtable();
+ hashtable.put("one", "XXX");
+ Enumeration enumeration = new IteratorEnumeration(hashtable.keys());
+ Iterator iterator = new IteratorEnumeration(hashtable.keys());
+
+ // Test Enumeration
+ assertTrue("Enumeration.hasMoreElements(A)", enumeration.hasMoreElements());
+ assertEquals("Enumeration.nextElement", "one", enumeration.nextElement());
+ assertFalse("Enumeration.hasMoreElements(B)", enumeration.hasMoreElements());
+
+ // Test Iterator
+ assertTrue("Iterator.hasNext(A)", iterator.hasNext());
+ assertEquals("Iterator.next", "one", iterator.next());
+ assertFalse("Iterator.hasNext(B)", iterator.hasNext());
+
+ try {
+ iterator.remove();
+ fail("Expected UnsupportedOperationException");
+ } catch(UnsupportedOperationException e) {
+ // expected result
+ }
+
+
+ }
+}
\ No newline at end of file
Propchange: jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/proper/resources/trunk/src/test/org/apache/commons/resources/util/IteratorEnumerationTestCase.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Modified: jakarta/commons/proper/resources/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/resources/trunk/xdocs/changes.xml?rev=358692&r1=358691&r2=358692&view=diff
==============================================================================
--- jakarta/commons/proper/resources/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/resources/trunk/xdocs/changes.xml Thu Dec 22 19:37:26 2005
@@ -39,6 +39,12 @@
<body>
<release version="1.0.0" date="(not yet released)" description="Initial Release">
+ <action dev="niallp" type="fix" issue="38021">
+ Refactoring of ResourceBundleResources implementation to remove
+ caching of ResourceBundle instances - makes this implementation
+ Serializable and prevents a potential memory leak.
+ <i>(Dec 2005)</i>.
+ </action>
<action dev="niallp" type="fix" issue="37679" due-to="Rahul Akolkar">
Remove unused imports.
<i>(Dec 2005)</i>.
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org