moved collection utilities to util
This commit is contained in:
parent
4bf3a9c9bd
commit
e986434a25
|
|
@ -1,6 +0,0 @@
|
||||||
|
|
||||||
/**
|
|
||||||
* Collection extensions used in the framework.
|
|
||||||
*/
|
|
||||||
package org.springframework.core.collection;
|
|
||||||
|
|
||||||
|
|
@ -13,18 +13,16 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.core.collection;
|
package org.springframework.util;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.NoSuchElementException;
|
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
|
* Iterator that combines multiple other iterators.
|
||||||
* iterators which are invoked in sequence untill all iterators are exhausted.
|
* This implementation maintains a list of iterators which are invoked in sequence until all iterators are exhausted.
|
||||||
* @author Erwin Vervaet
|
* @author Erwin Vervaet
|
||||||
*/
|
*/
|
||||||
public class CompositeIterator<E> implements Iterator<E> {
|
public class CompositeIterator<E> implements Iterator<E> {
|
||||||
|
|
@ -13,16 +13,15 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.core.collection;
|
package org.springframework.util;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple subinterface of {@link Map} that exposes a mutex that application code can synchronize on.
|
* A simple subinterface of {@link Map} that exposes a mutex that application code can synchronize on.
|
||||||
* <p>
|
* <p>
|
||||||
* Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple
|
* Expected to be implemented by Maps that are backed by shared objects that require synchronization between multiple threads.
|
||||||
* threads. An example would be the HTTP session map.
|
* An example would be the HTTP session map.
|
||||||
*
|
|
||||||
* @author Keith Donald
|
* @author Keith Donald
|
||||||
*/
|
*/
|
||||||
public interface SharedMap<K, V> extends Map<K, V> {
|
public interface SharedMap<K, V> extends Map<K, V> {
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.core.collection;
|
package org.springframework.util;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -23,9 +23,9 @@ import java.util.Set;
|
||||||
import org.springframework.core.style.ToStringCreator;
|
import org.springframework.core.style.ToStringCreator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A map decorator that implements <code>SharedMap</code>. By default, simply returns the map itself as the mutex.
|
* A map decorator that implements <code>SharedMap</code>.
|
||||||
|
* By default, simply returns the map itself as the mutex.
|
||||||
* Subclasses may override to return a different mutex object.
|
* Subclasses may override to return a different mutex object.
|
||||||
*
|
|
||||||
* @author Keith Donald
|
* @author Keith Donald
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.core.collection;
|
package org.springframework.util;
|
||||||
|
|
||||||
import java.util.AbstractSet;
|
import java.util.AbstractSet;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -23,9 +23,8 @@ import java.util.NoSuchElementException;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for map adapters whose keys are String values. Concrete classes need only implement the abstract hook
|
* Base class for map adapters whose keys are String values.
|
||||||
* methods defined by this class.
|
* Concrete classes need only implement the abstract hook methods defined by this class.
|
||||||
*
|
|
||||||
* @author Keith Donald
|
* @author Keith Donald
|
||||||
*/
|
*/
|
||||||
public abstract class StringKeyedMapAdapter<V> implements Map<String, V> {
|
public abstract class StringKeyedMapAdapter<V> implements Map<String, V> {
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,8 +17,8 @@ package org.springframework.web.context.request;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.springframework.core.collection.StringKeyedMapAdapter;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.util.StringKeyedMapAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map backed by a Web request parameter map for accessing request parameters.
|
* Map backed by a Web request parameter map for accessing request parameters.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue