diff --git a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/CollectionUtils.java b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/CollectionUtils.java index 0613805e3..322628dcc 100644 --- a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/CollectionUtils.java +++ b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/CollectionUtils.java @@ -16,6 +16,7 @@ package org.springframework.datastore.redis.util; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.springframework.datastore.redis.serializer.RedisSerializer; @@ -35,4 +36,15 @@ abstract class CollectionUtils { } return result; } + + static Collection reverse(Collection c) { + List reverse = new ArrayList(c.size()); + + int index = c.size(); + for (E e : c) { + reverse.add(--index, e); + } + + return reverse; + } } diff --git a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/DefaultRedisList.java b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/DefaultRedisList.java index db1f46763..c6a220cca 100644 --- a/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/DefaultRedisList.java +++ b/spring-datastore-redis/src/main/java/org/springframework/datastore/redis/util/DefaultRedisList.java @@ -93,9 +93,18 @@ public class DefaultRedisList extends AbstractRedisCollection implements R public void add(int index, E element) { if (index == 0) { commands.lPush(key, serializer.serializeAsString(element)); + return; } - else if (index == size()) { + + int size = size(); + + if (index == size()) { commands.rPush(key, serializer.serializeAsString(element)); + return; + } + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); } throw new IllegalArgumentException("Redis supports insertion only at the beginning or the end of the list"); @@ -103,11 +112,30 @@ public class DefaultRedisList extends AbstractRedisCollection implements R @Override public boolean addAll(int index, Collection c) { - for (E e : c) { - add(index, e); + // insert collection in reverse + if (index == 0) { + Collection reverseC = CollectionUtils.reverse(c); + + for (E e : reverseC) { + commands.lPush(key, serializer.serializeAsString(e)); + } + return true; } - return true; + int size = size(); + + if (index == size()) { + for (E e : c) { + commands.rPush(key, serializer.serializeAsString(e)); + } + return true; + } + + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + + throw new IllegalArgumentException("Redis supports insertion only at the beginning or the end of the list"); } @Override