diff --git a/org.springframework.core/src/main/java/org/springframework/core/collection/package-info.java b/org.springframework.core/src/main/java/org/springframework/core/collection/package-info.java deleted file mode 100644 index 4a890ba1f9e..00000000000 --- a/org.springframework.core/src/main/java/org/springframework/core/collection/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * Collection extensions used in the framework. - */ -package org.springframework.core.collection; - diff --git a/org.springframework.core/src/main/java/org/springframework/core/collection/CompositeIterator.java b/org.springframework.core/src/main/java/org/springframework/util/CompositeIterator.java similarity index 84% rename from org.springframework.core/src/main/java/org/springframework/core/collection/CompositeIterator.java rename to org.springframework.core/src/main/java/org/springframework/util/CompositeIterator.java index 7241259fe3a..67935ae6b4c 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/collection/CompositeIterator.java +++ b/org.springframework.core/src/main/java/org/springframework/util/CompositeIterator.java @@ -13,18 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.core.collection; +package org.springframework.util; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.NoSuchElementException; -import org.springframework.util.Assert; - /** - * Iterator that combines multiple other iterators. This is a simple implementation that just maintains a list of - * iterators which are invoked in sequence untill all iterators are exhausted. + * Iterator that combines multiple other iterators. + * This implementation maintains a list of iterators which are invoked in sequence until all iterators are exhausted. * @author Erwin Vervaet */ public class CompositeIterator implements Iterator { diff --git a/org.springframework.core/src/main/java/org/springframework/core/collection/SharedMap.java b/org.springframework.core/src/main/java/org/springframework/util/SharedMap.java similarity index 85% rename from org.springframework.core/src/main/java/org/springframework/core/collection/SharedMap.java rename to org.springframework.core/src/main/java/org/springframework/util/SharedMap.java index d6669bbc808..247e341d0dc 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/collection/SharedMap.java +++ b/org.springframework.core/src/main/java/org/springframework/util/SharedMap.java @@ -13,16 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.core.collection; +package org.springframework.util; import java.util.Map; /** * A simple subinterface of {@link Map} that exposes a mutex that application code can synchronize on. *

- * Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple - * threads. An example would be the HTTP session map. - * + * Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple threads. + * An example would be the HTTP session map. * @author Keith Donald */ public interface SharedMap extends Map { diff --git a/org.springframework.core/src/main/java/org/springframework/core/collection/SharedMapDecorator.java b/org.springframework.core/src/main/java/org/springframework/util/SharedMapDecorator.java similarity index 89% rename from org.springframework.core/src/main/java/org/springframework/core/collection/SharedMapDecorator.java rename to org.springframework.core/src/main/java/org/springframework/util/SharedMapDecorator.java index a20c5695981..0dfba3adba7 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/collection/SharedMapDecorator.java +++ b/org.springframework.core/src/main/java/org/springframework/util/SharedMapDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.core.collection; +package org.springframework.util; import java.io.Serializable; import java.util.Collection; @@ -23,9 +23,9 @@ import java.util.Set; import org.springframework.core.style.ToStringCreator; /** - * A map decorator that implements SharedMap. By default, simply returns the map itself as the mutex. + * A map decorator that implements SharedMap. + * By default, simply returns the map itself as the mutex. * Subclasses may override to return a different mutex object. - * * @author Keith Donald */ @SuppressWarnings("serial") diff --git a/org.springframework.core/src/main/java/org/springframework/core/collection/StringKeyedMapAdapter.java b/org.springframework.core/src/main/java/org/springframework/util/StringKeyedMapAdapter.java similarity index 93% rename from org.springframework.core/src/main/java/org/springframework/core/collection/StringKeyedMapAdapter.java rename to org.springframework.core/src/main/java/org/springframework/util/StringKeyedMapAdapter.java index 9716d59d951..6b226ed260f 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/collection/StringKeyedMapAdapter.java +++ b/org.springframework.core/src/main/java/org/springframework/util/StringKeyedMapAdapter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.core.collection; +package org.springframework.util; import java.util.AbstractSet; import java.util.Collection; @@ -23,9 +23,8 @@ import java.util.NoSuchElementException; import java.util.Set; /** - * Base class for map adapters whose keys are String values. Concrete classes need only implement the abstract hook - * methods defined by this class. - * + * Base class for map adapters whose keys are String values. + * Concrete classes need only implement the abstract hook methods defined by this class. * @author Keith Donald */ public abstract class StringKeyedMapAdapter implements Map { diff --git a/org.springframework.core/src/test/java/org/springframework/util/CompositeIteratorTests.java b/org.springframework.core/src/test/java/org/springframework/util/CompositeIteratorTests.java new file mode 100644 index 00000000000..a92086e4ea9 --- /dev/null +++ b/org.springframework.core/src/test/java/org/springframework/util/CompositeIteratorTests.java @@ -0,0 +1,98 @@ +package org.springframework.util; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; + +import junit.framework.TestCase; + +/** + * Test case for {@link CompositeIterator}. + * + * @author Erwin Vervaet + */ +public class CompositeIteratorTests extends TestCase { + + public void testNoIterators() { + CompositeIterator it = new CompositeIterator(); + assertFalse(it.hasNext()); + try { + it.next(); + fail(); + } catch (NoSuchElementException e) { + // expected + } + } + + public void testSingleIterator() { + CompositeIterator it = new CompositeIterator(); + it.add(Arrays.asList(new String[] { "0", "1" }).iterator()); + for (int i = 0; i < 2; i++) { + assertTrue(it.hasNext()); + assertEquals(String.valueOf(i), it.next()); + } + assertFalse(it.hasNext()); + try { + it.next(); + fail(); + } catch (NoSuchElementException e) { + // expected + } + } + + public void testMultipleIterators() { + CompositeIterator it = new CompositeIterator(); + it.add(Arrays.asList(new String[] { "0", "1" }).iterator()); + it.add(Arrays.asList(new String[] { "2" }).iterator()); + it.add(Arrays.asList(new String[] { "3", "4" }).iterator()); + for (int i = 0; i < 5; i++) { + assertTrue(it.hasNext()); + assertEquals(String.valueOf(i), it.next()); + } + assertFalse(it.hasNext()); + try { + it.next(); + fail(); + } catch (NoSuchElementException e) { + // expected + } + } + + public void testInUse() { + List list = Arrays.asList(new String[] { "0", "1" }); + CompositeIterator it = new CompositeIterator(); + it.add(list.iterator()); + it.hasNext(); + try { + it.add(list.iterator()); + fail(); + } catch (IllegalStateException e) { + // expected + } + it = new CompositeIterator(); + it.add(list.iterator()); + it.next(); + try { + it.add(list.iterator()); + fail(); + } catch (IllegalStateException e) { + // expected + } + } + + public void testDuplicateIterators() { + List list = Arrays.asList(new String[] { "0", "1" }); + Iterator iterator = list.iterator(); + CompositeIterator it = new CompositeIterator(); + it.add(iterator); + it.add(list.iterator()); + try { + it.add(iterator); + fail(); + } catch (IllegalArgumentException e) { + // expected + } + } + +} diff --git a/org.springframework.core/src/test/java/org/springframework/util/SharedMapDecoratorTests.java b/org.springframework.core/src/test/java/org/springframework/util/SharedMapDecoratorTests.java new file mode 100644 index 00000000000..eeadb13b1e9 --- /dev/null +++ b/org.springframework.core/src/test/java/org/springframework/util/SharedMapDecoratorTests.java @@ -0,0 +1,62 @@ +package org.springframework.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import junit.framework.TestCase; + +/** + * Unit tests for {@link org.springframework.binding.collection.SharedMapDecorator}. + */ +public class SharedMapDecoratorTests extends TestCase { + + private SharedMapDecorator map = new SharedMapDecorator(new HashMap()); + + public void testGetPutRemove() { + assertTrue(map.size() == 0); + assertTrue(map.isEmpty()); + assertNull(map.get("foo")); + assertFalse(map.containsKey("foo")); + map.put("foo", "bar"); + assertTrue(map.size() == 1); + assertFalse(map.isEmpty()); + assertNotNull(map.get("foo")); + assertTrue(map.containsKey("foo")); + assertTrue(map.containsValue("bar")); + assertEquals("bar", map.get("foo")); + map.remove("foo"); + assertTrue(map.size() == 0); + assertNull(map.get("foo")); + } + + public void testPutAll() { + Map all = new HashMap(); + all.put("foo", "bar"); + all.put("bar", "baz"); + map.putAll(all); + assertTrue(map.size() == 2); + } + + public void testEntrySet() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Set entrySet = map.entrySet(); + assertTrue(entrySet.size() == 2); + } + + public void testKeySet() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Set keySet = map.keySet(); + assertTrue(keySet.size() == 2); + } + + public void testValues() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Collection values = map.values(); + assertTrue(values.size() == 2); + } +} diff --git a/org.springframework.core/src/test/java/org/springframework/util/StringKeyedMapAdapterTests.java b/org.springframework.core/src/test/java/org/springframework/util/StringKeyedMapAdapterTests.java new file mode 100644 index 00000000000..13edc718679 --- /dev/null +++ b/org.springframework.core/src/test/java/org/springframework/util/StringKeyedMapAdapterTests.java @@ -0,0 +1,82 @@ +package org.springframework.util; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import junit.framework.TestCase; + +/** + * Unit tests for {@link org.springframework.binding.collection.StringKeyedMapAdapter}. + */ +public class StringKeyedMapAdapterTests extends TestCase { + + private Map contents = new HashMap(); + + private StringKeyedMapAdapter map = new StringKeyedMapAdapter() { + + protected Object getAttribute(String key) { + return contents.get(key); + } + + protected Iterator getAttributeNames() { + return contents.keySet().iterator(); + } + + protected void removeAttribute(String key) { + contents.remove(key); + } + + protected void setAttribute(String key, Object value) { + contents.put(key, value); + } + }; + + public void testGetPutRemove() { + assertTrue(map.size() == 0); + assertTrue(map.isEmpty()); + assertNull(map.get("foo")); + assertFalse(map.containsKey("foo")); + map.put("foo", "bar"); + assertTrue(map.size() == 1); + assertFalse(map.isEmpty()); + assertNotNull(map.get("foo")); + assertTrue(map.containsKey("foo")); + assertTrue(map.containsValue("bar")); + assertEquals("bar", map.get("foo")); + map.remove("foo"); + assertTrue(map.size() == 0); + assertNull(map.get("foo")); + } + + public void testPutAll() { + Map all = new HashMap(); + all.put("foo", "bar"); + all.put("bar", "baz"); + map.putAll(all); + assertTrue(map.size() == 2); + } + + public void testEntrySet() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Set entrySet = map.entrySet(); + assertTrue(entrySet.size() == 2); + } + + public void testKeySet() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Set keySet = map.keySet(); + assertTrue(keySet.size() == 2); + } + + public void testValues() { + map.put("foo", "bar"); + map.put("bar", "baz"); + Collection values = map.values(); + assertTrue(values.size() == 2); + } +} diff --git a/org.springframework.web/src/main/java/org/springframework/web/context/request/NativeWebRequestParameterMap.java b/org.springframework.web/src/main/java/org/springframework/web/context/request/NativeWebRequestParameterMap.java index a795ca53f53..523b8f69c05 100644 --- a/org.springframework.web/src/main/java/org/springframework/web/context/request/NativeWebRequestParameterMap.java +++ b/org.springframework.web/src/main/java/org/springframework/web/context/request/NativeWebRequestParameterMap.java @@ -17,8 +17,8 @@ package org.springframework.web.context.request; import java.util.Iterator; -import org.springframework.core.collection.StringKeyedMapAdapter; import org.springframework.util.Assert; +import org.springframework.util.StringKeyedMapAdapter; /** * Map backed by a Web request parameter map for accessing request parameters.