diff --git a/src/main/java/org/redisson/RedissonSet.java b/src/main/java/org/redisson/RedissonSet.java index 176cb3931..0b927aa78 100644 --- a/src/main/java/org/redisson/RedissonSet.java +++ b/src/main/java/org/redisson/RedissonSet.java @@ -17,6 +17,7 @@ package org.redisson; import java.util.Collection; import java.util.Iterator; +import java.util.NoSuchElementException; import org.redisson.connection.ConnectionManager; import org.redisson.core.RSet; @@ -69,10 +70,44 @@ public class RedissonSet extends RedissonObject implements RSet { RedisConnection connection = connectionManager.connection(); try { // TODO use SSCAN in case of usage Redis 2.8 - return (Iterator) connection.smembers(getName()).iterator(); + final Iterator iter = (Iterator) connection.smembers(getName()).iterator(); + return new Iterator() { + + private boolean removeExecuted; + private V value; + + @Override + public boolean hasNext() { + return iter.hasNext(); + } + + @Override + public V next() { + if (!hasNext()) { + throw new NoSuchElementException("No such element at index"); + } + + value = iter.next(); + removeExecuted = false; + return value; + } + + @Override + public void remove() { + if (removeExecuted) { + throw new IllegalStateException("Element been already deleted"); + } + + iter.remove(); + RedissonSet.this.remove(value); + removeExecuted = true; + } + + }; } finally { connectionManager.release(connection); } + } @Override @@ -138,10 +173,9 @@ public class RedissonSet extends RedissonObject implements RSet { @Override public boolean retainAll(Collection c) { boolean changed = false; - for (Iterator iterator = iterator(); iterator.hasNext();) { - V object = iterator.next(); + for (Object object : this) { if (!c.contains(object)) { - iterator.remove(); + remove(object); changed = true; } } diff --git a/src/main/java/org/redisson/connection/ConnectionManager.java b/src/main/java/org/redisson/connection/ConnectionManager.java index 4bee65261..a9f42b5cb 100644 --- a/src/main/java/org/redisson/connection/ConnectionManager.java +++ b/src/main/java/org/redisson/connection/ConnectionManager.java @@ -162,8 +162,8 @@ public class ConnectionManager { } public void release(RedisConnection сonnection) { - activeConnections.release(); connections.add(сonnection); + activeConnections.release(); } public void shutdown() { diff --git a/src/test/java/org/redisson/RedissonSetTest.java b/src/test/java/org/redisson/RedissonSetTest.java index 33c7250d5..dfc16f181 100644 --- a/src/test/java/org/redisson/RedissonSetTest.java +++ b/src/test/java/org/redisson/RedissonSetTest.java @@ -10,6 +10,20 @@ import org.junit.Test; public class RedissonSetTest extends BaseTest { + @Test + public void testRetainAll() { + Redisson redisson = Redisson.create(); + Set set = redisson.getSet("set"); + for (int i = 0; i < 200; i++) { + set.add(i); + } + + Assert.assertTrue(set.retainAll(Arrays.asList(1, 2))); + Assert.assertEquals(2, set.size()); + + clear(set, redisson); + } + @Test public void testContainsAll() { Redisson redisson = Redisson.create();