You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directmemory.apache.org by to...@apache.org on 2013/02/07 17:09:29 UTC

svn commit: r1443584 - in /directmemory/trunk/directmemory-cache/src: main/java/org/apache/directmemory/utils/CacheValuesIterable.java test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java

Author: tommaso
Date: Thu Feb  7 16:09:28 2013
New Revision: 1443584

URL: http://svn.apache.org/viewvc?rev=1443584&view=rev
Log:
DIRECTMEMORY-124 - added non strict and strict versions of cache values iterable

Modified:
    directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/utils/CacheValuesIterable.java
    directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java

Modified: directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/utils/CacheValuesIterable.java
URL: http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/utils/CacheValuesIterable.java?rev=1443584&r1=1443583&r2=1443584&view=diff
==============================================================================
--- directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/utils/CacheValuesIterable.java (original)
+++ directmemory/trunk/directmemory-cache/src/main/java/org/apache/directmemory/utils/CacheValuesIterable.java Thu Feb  7 16:09:28 2013
@@ -22,7 +22,6 @@ package org.apache.directmemory.utils;
 import java.util.Iterator;
 
 import org.apache.directmemory.cache.CacheService;
-import org.apache.directmemory.memory.Pointer;
 
 /**
  * A simple {@link Iterable} over {@link CacheService}'s values
@@ -35,40 +34,36 @@ public class CacheValuesIterable<K, V>
 
     private final Iterator<K> keysIterator;
 
+    private final boolean strict;
+
+    /**
+     * Creates a {@link StrictCacheValuesIterator} over cache values.
+     * 
+     * @param cacheService
+     */
     public CacheValuesIterable( CacheService<K, V> cacheService )
     {
+        this( cacheService, true );
+    }
+
+    /**
+     * Creates a iterator over cache values.
+     * 
+     * @param cacheService the {@link CacheService} on whose values this will iterate
+     * @param strict When <code>true</code> the resulting iterator might returns expired or stalled values. Please see
+     *            {@link NonStrictCacheValuesIterator} for details
+     */
+    public CacheValuesIterable( CacheService<K, V> cacheService, boolean strict )
+    {
         this.cacheService = cacheService;
         this.keysIterator = cacheService.getMap().keySet().iterator();
+        this.strict = strict;
     }
 
     @Override
     public Iterator<V> iterator()
     {
-        return new Iterator<V>()
-        {
-            @Override
-            public boolean hasNext()
-            {
-                return keysIterator.hasNext();
-            }
-
-            @Override
-            public V next()
-            {
-                K nextKey = keysIterator.next();
-                Pointer<V> pointer = cacheService.getPointer( nextKey );
-                if ( pointer != null && pointer.isExpired() )
-                {
-                    throw new RuntimeException( "Value pointer has expired" );
-                }
-                return cacheService.retrieve( nextKey );
-            }
-
-            @Override
-            public void remove()
-            {
-                keysIterator.remove();
-            }
-        };
+        return strict ? new StrictCacheValuesIterator<K, V>( keysIterator, cacheService )
+                        : new NonStrictCacheValuesIterator<K, V>( keysIterator, cacheService );
     }
 }

Modified: directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java
URL: http://svn.apache.org/viewvc/directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java?rev=1443584&r1=1443583&r2=1443584&view=diff
==============================================================================
--- directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java (original)
+++ directmemory/trunk/directmemory-cache/src/test/java/org/apache/directmemory/utils/CacheValuesIterableTest.java Thu Feb  7 16:09:28 2013
@@ -19,8 +19,13 @@ package org.apache.directmemory.utils;
  * under the License.
  */
 
+import java.io.IOException;
+import java.util.Iterator;
+
 import org.apache.directmemory.DirectMemory;
 import org.apache.directmemory.cache.CacheService;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -33,14 +38,23 @@ import static org.junit.Assert.assertTru
  */
 public class CacheValuesIterableTest
 {
+    private CacheService<String, Long> cache;
+
+    @Before
+    public void setUp() {
+        cache = new DirectMemory<String, Long>().setNumberOfBuffers( 10 ).setSize( 1000 ).setInitialCapacity( 10000 ).setConcurrencyLevel( 4 ).newCacheService(); 
+    }
+    
+    @After
+    public void cleanUp() throws IOException {
+        cache.clear();
+        cache.close();
+    }
 
     @Test
-    public void simpleTest()
+    public void simpleStrictCacheValuesIteratorTest()
         throws Exception
     {
-        CacheService<String, Long> cache =
-            new DirectMemory<String, Long>().setNumberOfBuffers( 10 ).setSize( 1000 ).setInitialCapacity( 10000 ).setConcurrencyLevel( 4 ).newCacheService();
-
         assertNull( cache.retrieve( "a" ) );
         assertNotNull( cache.put( "a", 1L ) );
         assertNotNull( cache.put( "b", 2L ) );
@@ -57,4 +71,71 @@ public class CacheValuesIterableTest
             assertTrue( longVal > 0 );
         }
     }
+
+    @Test
+    public void simpleNonStrictCacheValuesIteratorTest()
+        throws Exception
+    {
+        assertNull( cache.retrieve( "a" ) );
+        assertNotNull( cache.put( "a", 1L ) );
+        assertNotNull( cache.put( "b", 2L ) );
+        assertNotNull( cache.put( "c", 3L ) );
+        assertNotNull( cache.retrieve( "a" ) );
+        assertNotNull( cache.retrieve( "b" ) );
+        assertNotNull( cache.retrieve( "c" ) );
+        assertEquals( 1L, cache.retrieve( "a" ).longValue() );
+
+        CacheValuesIterable<String, Long> cacheValuesIterable = new CacheValuesIterable<String, Long>( cache, false );
+        int count = 0;
+        for ( Long longVal : cacheValuesIterable )
+        {
+            count++;
+            assertNotNull( longVal );
+            assertTrue( longVal > 0 );
+        }
+        assertEquals( 3, count );
+    }
+
+    @Test
+    public void nonStrictCacheValuesIteratorShouldSkipExpiredItemsTest() throws Exception
+    {
+        assertNotNull( cache.put( "a", 1L ) );
+        assertNotNull( cache.put( "b", 2L, 1 ) );
+        assertNotNull( cache.put( "c", 3L ) );
+
+        Thread.sleep( 10 );
+        CacheValuesIterable<String, Long> cacheValuesIterable = new CacheValuesIterable<String, Long>( cache, false );
+        int count = 0;
+        for ( Long longVal : cacheValuesIterable )
+        {
+            count++;
+            assertNotNull( longVal );
+            assertTrue( longVal > 0 );
+        }
+        assertEquals( 2, count );
+    }
+    
+    @Test
+    public void nonStrictCacheValuesIteratorRemoveTest() throws Exception {
+        assertNotNull( cache.put( "a", 1L ) );
+        assertNotNull( cache.put( "b", 2L ) );
+        assertNotNull( cache.put( "c", 3L ) );
+
+        Iterator<Long> iterator = new CacheValuesIterable<String, Long>( cache, false ).iterator();
+        while ( iterator.hasNext() )
+        {
+            long longVal = iterator.next();
+            if (longVal == 2) {
+                iterator.remove();
+            }
+        }
+        int count = 0;
+        iterator = new CacheValuesIterable<String, Long>( cache, false ).iterator();
+        while (iterator.hasNext()) {
+            iterator.next();
+            count++;
+        }
+        assertEquals( 2, count);
+
+    }
 }