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);
+
+ }
}