[infinispan-commits] Infinispan SVN: r559 - in trunk/core/src: main/java/org/infinispan/interceptors and 3 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Mon Jul 13 08:12:01 EDT 2009


Author: galder.zamarreno at jboss.com
Date: 2009-07-13 08:12:01 -0400 (Mon, 13 Jul 2009)
New Revision: 559

Modified:
   trunk/core/src/main/java/org/infinispan/container/DataContainer.java
   trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java
   trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java
   trunk/core/src/main/java/org/infinispan/container/SpinLockBasedFIFODataContainer.java
   trunk/core/src/main/java/org/infinispan/interceptors/MarshalledValueInterceptor.java
   trunk/core/src/main/java/org/infinispan/util/Immutables.java
   trunk/core/src/test/java/org/infinispan/container/SimpleDataContainerTest.java
   trunk/core/src/test/java/org/infinispan/test/TestingUtil.java
Log:
[ISPN-130] (DataContainer.entrySet should return a Set of InternalCacheEntry) Fixed.

Modified: trunk/core/src/main/java/org/infinispan/container/DataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/DataContainer.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/container/DataContainer.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -26,7 +26,6 @@
 import org.infinispan.factories.scopes.Scopes;
 
 import java.util.Collection;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -100,7 +99,7 @@
     * 
     * @return a set of immutable cache entries
     */
-   Set<Map.Entry> entrySet();
+   Set<InternalCacheEntry> entrySet();
 
    /**
     * Purges entries that have passed their expiry time

Modified: trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/container/FIFODataContainer.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -8,7 +8,6 @@
 import java.util.AbstractSet;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import java.util.concurrent.locks.ReentrantLock;
@@ -627,8 +626,8 @@
       }
    }
    
-   protected final class EntrySet extends AbstractSet<Map.Entry> {
-      public Iterator<Map.Entry> iterator() {
+   protected final class EntrySet extends AbstractSet<InternalCacheEntry> {
+      public Iterator<InternalCacheEntry> iterator() {
          return new ImmutableEntryIterator();
       }
 
@@ -657,9 +656,9 @@
       }
    }
    
-   protected final class ImmutableEntryIterator extends LinkedIterator implements Iterator<Map.Entry> {
-      public Map.Entry next() {
-         return Immutables.immutableEntry(current.e);
+   protected final class ImmutableEntryIterator extends LinkedIterator implements Iterator<InternalCacheEntry> {
+      public InternalCacheEntry next() {
+         return Immutables.immutableInternalCacheEntry(current.e);
       }
    }
 
@@ -800,7 +799,7 @@
       return new Values();
    }
    
-   public Set<Map.Entry> entrySet() {
+   public Set<InternalCacheEntry> entrySet() {
       return new EntrySet();
    }
 

Modified: trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -11,7 +11,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -136,7 +135,7 @@
       return new Values();
    }
 
-   public Set<Map.Entry> entrySet() {
+   public Set<InternalCacheEntry> entrySet() {
       return new EntrySet();
    }
 
@@ -212,8 +211,8 @@
       }
    }
 
-   private class EntrySet extends AbstractSet<Map.Entry> {
-      public Iterator<Map.Entry> iterator() {
+   private class EntrySet extends AbstractSet<InternalCacheEntry> {
+      public Iterator<InternalCacheEntry> iterator() {
          return new ImmutableEntryIterator(immortalEntries.values().iterator(), mortalEntries.values().iterator());
       }
 
@@ -258,13 +257,13 @@
       }
    }
 
-   private class ImmutableEntryIterator extends MortalInmortalIterator implements Iterator<Map.Entry> {
+   private class ImmutableEntryIterator extends MortalInmortalIterator implements Iterator<InternalCacheEntry> {
       private ImmutableEntryIterator(Iterator<InternalCacheEntry> immortalIterator, Iterator<InternalCacheEntry> mortalIterator) {
          super(immortalIterator, mortalIterator);
       }
 
-      public Map.Entry next() {
-         return Immutables.immutableEntry(currentIterator.next());
+      public InternalCacheEntry next() {
+         return Immutables.immutableInternalCacheEntry(currentIterator.next());
       }
    }
 

Modified: trunk/core/src/main/java/org/infinispan/container/SpinLockBasedFIFODataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/SpinLockBasedFIFODataContainer.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/container/SpinLockBasedFIFODataContainer.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -10,7 +10,6 @@
 import java.util.AbstractSet;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.ReentrantLock;
@@ -238,7 +237,7 @@
       return keySet;
    }
    
-   public Set<Map.Entry> entrySet() {
+   public Set<InternalCacheEntry> entrySet() {
       return new EntrySet();
    }
 
@@ -559,8 +558,8 @@
       }      
    }
    
-   protected final class EntrySet extends AbstractSet<Map.Entry> {
-      public Iterator<Map.Entry> iterator() {
+   protected final class EntrySet extends AbstractSet<InternalCacheEntry> {
+      public Iterator<InternalCacheEntry> iterator() {
          return new ImmutableEntryIterator();
       }
 
@@ -590,12 +589,12 @@
       }
    }
 
-   protected final class ImmutableEntryIterator extends LinkedIterator implements Iterator<Map.Entry> {
-      public Map.Entry next() {
+   protected final class ImmutableEntryIterator extends LinkedIterator implements Iterator<InternalCacheEntry> {
+      public InternalCacheEntry next() {
          LinkedEntry le = nextAux.next;
          if (le == dummyEntry) return null;
          nextAux = le.next;
-         return Immutables.immutableEntry(le.entry);
+         return Immutables.immutableInternalCacheEntry(le.entry);
       }
    }
    

Modified: trunk/core/src/main/java/org/infinispan/interceptors/MarshalledValueInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/MarshalledValueInterceptor.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/interceptors/MarshalledValueInterceptor.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -28,6 +28,7 @@
 import org.infinispan.commands.write.PutKeyValueCommand;
 import org.infinispan.commands.write.PutMapCommand;
 import org.infinispan.commands.write.RemoveCommand;
+import org.infinispan.container.entries.InternalCacheEntry;
 import org.infinispan.container.entries.InternalEntryFactory;
 import org.infinispan.context.InvocationContext;
 import org.infinispan.factories.annotations.Inject;
@@ -148,9 +149,9 @@
    
    @Override
    public Object visitEntrySetCommand(InvocationContext ctx, EntrySetCommand command) throws Throwable {
-      Set<Map.Entry> entries = (Set<Map.Entry>) invokeNextInterceptor(ctx, command);
-      Set<Map.Entry> copy = new HashSet<Map.Entry>(entries.size());
-      for (Map.Entry entry : entries) {
+      Set<InternalCacheEntry> entries = (Set<InternalCacheEntry>) invokeNextInterceptor(ctx, command);
+      Set<InternalCacheEntry> copy = new HashSet<InternalCacheEntry>(entries.size());
+      for (InternalCacheEntry entry : entries) {
          Object key = entry.getKey();
          Object value = entry.getValue();
          if (key instanceof MarshalledValue) {
@@ -159,7 +160,8 @@
          if (value instanceof MarshalledValue) {
             value = ((MarshalledValue) value).get();
          }
-         Map.Entry newEntry = Immutables.immutableEntry(InternalEntryFactory.create(key, value, -1));
+         InternalCacheEntry newEntry = Immutables.immutableInternalCacheEntry(InternalEntryFactory.create(key, value, 
+                  entry.getCreated(), entry.getLifespan(), entry.getLastUsed(), entry.getMaxIdle()));
          copy.add(newEntry);
       }
       return Immutables.immutableSetWrap(copy);

Modified: trunk/core/src/main/java/org/infinispan/util/Immutables.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/Immutables.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/main/java/org/infinispan/util/Immutables.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -33,6 +33,10 @@
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.infinispan.container.DataContainer;
+import org.infinispan.container.entries.InternalCacheEntry;
+import org.infinispan.container.entries.InternalCacheValue;
+
 /**
  * Factory for generating immutable type wrappers.
  *
@@ -215,8 +219,17 @@
    public static Map.Entry immutableEntry(Map.Entry entry) {
       return new ImmutableEntry(entry);
    }
+   
+   /**
+    * Wraps a {@link InternalCacheEntry}} with an immutable {@link InternalCacheEntry}}. There is no copying involved.
+    *
+    * @param entry the internal cache entry to wrap.
+    * @return an immutable {@link InternalCacheEntry}} wrapper that delegates to the original entry.
+    */
+   public static InternalCacheEntry immutableInternalCacheEntry(InternalCacheEntry entry) {
+      return new ImmutableInternalCacheEntry(entry);
+   }
 
-
    public interface Immutable {
    }
 
@@ -342,7 +355,10 @@
       }
    }
 
-   static class ImmutableEntry<K, V> implements Entry<K, V>, Immutable {
+   /** 
+    * Immutable version of Map.Entry for traversing immutable collections. 
+    */
+   private static class ImmutableEntry<K, V> implements Entry<K, V>, Immutable {
       private K key;
       private V value;
       private int hash;
@@ -386,7 +402,177 @@
          return getKey() + "=" + getValue();
       }
    }
+   
+   /** 
+    * Immutable version of InternalCacheEntry for traversing data containers. 
+    */
+   private static class ImmutableInternalCacheEntry implements InternalCacheEntry, Immutable {
+      private final InternalCacheEntry entry;
+      private final int hash;
 
+      ImmutableInternalCacheEntry(InternalCacheEntry entry) {
+         this.entry = entry;
+         this.hash = entry.hashCode();
+      }
+
+      public Object getKey() {
+         return entry.getKey();
+      }
+
+      public Object getValue() {
+         return entry.getValue();
+      }
+
+      public Object setValue(Object value) {
+         throw new UnsupportedOperationException();
+      }
+
+      @SuppressWarnings("unchecked")
+      public boolean equals(Object o) {
+         if (!(o instanceof InternalCacheEntry))
+            return false;
+
+         InternalCacheEntry entry = (InternalCacheEntry) o;
+         return entry.equals(this.entry);
+      }
+
+      public int hashCode() {
+         return hash;
+      }
+
+      public String toString() {
+         return getKey() + "=" + getValue();
+      }
+
+      public boolean canExpire() {
+         return entry.canExpire();
+      }
+
+      public long getCreated() {
+         return entry.getCreated();
+      }
+
+      public long getExpiryTime() {
+         return entry.getExpiryTime();
+      }
+
+      public long getLastUsed() {
+         return entry.getLastUsed();
+      }
+
+      public boolean isExpired() {
+         return entry.isExpired();
+      }
+
+      public InternalCacheEntry setLifespan(long lifespan) {
+         throw new UnsupportedOperationException();
+      }
+
+      public InternalCacheEntry setMaxIdle(long maxIdle) {
+         throw new UnsupportedOperationException();
+      }
+
+      public InternalCacheValue toInternalCacheValue() {
+         return new ImmutableInternalCacheValue(this);
+      }
+
+      public void touch() {
+         throw new UnsupportedOperationException();
+      }
+
+      public void commit(DataContainer container) {
+         throw new UnsupportedOperationException();
+      }
+
+      public long getLifespan() {
+         return entry.getLifespan();
+      }
+
+      public long getMaxIdle() {
+         return entry.getMaxIdle();
+      }
+
+      public boolean isChanged() {
+         return entry.isChanged();
+      }
+
+      public boolean isCreated() {
+         return entry.isCreated();
+      }
+
+      public boolean isNull() {
+         return entry.isNull();
+      }
+
+      public boolean isRemoved() {
+         return entry.isRemoved();
+      }
+
+      public boolean isValid() {
+         return entry.isValid();
+      }
+
+      public void rollback() {
+         throw new UnsupportedOperationException();
+      }
+
+      public void setCreated(boolean created) {
+         throw new UnsupportedOperationException();
+      }
+
+      public void setRemoved(boolean removed) {
+         throw new UnsupportedOperationException();         
+      }
+
+      public void setValid(boolean valid) {
+         throw new UnsupportedOperationException();
+      }
+      
+      public InternalCacheEntry clone() {
+         return new ImmutableInternalCacheEntry(entry.clone());
+      }
+   }
+   
+   private static class ImmutableInternalCacheValue implements InternalCacheValue, Immutable {
+      private final ImmutableInternalCacheEntry entry;
+      
+      ImmutableInternalCacheValue(ImmutableInternalCacheEntry entry) {
+         this.entry = entry;
+      }
+
+      public boolean canExpire() {
+         return entry.canExpire();
+      }
+
+      public long getCreated() {
+         return entry.getCreated();
+      }
+
+      public long getLastUsed() {
+         return entry.getLastUsed();
+      }
+
+      public long getLifespan() {
+         return entry.getLifespan();
+      }
+
+      public long getMaxIdle() {
+         return entry.getMaxIdle();
+      }
+
+      public Object getValue() {
+         return entry.getValue();
+      }
+
+      public boolean isExpired() {
+         return entry.isExpired();
+      }
+
+      public InternalCacheEntry toInternalCacheEntry(Object key) {
+         return entry;
+      }
+   }
+
    private static class ImmutableEntrySetWrapper<K, V> extends ImmutableSetWrapper<Entry<K, V>> {
       private static final long serialVersionUID = 6378667653889667692L;
 

Modified: trunk/core/src/test/java/org/infinispan/container/SimpleDataContainerTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/container/SimpleDataContainerTest.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/test/java/org/infinispan/container/SimpleDataContainerTest.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -199,10 +199,10 @@
       dc.put("k4", "v4", 6000000, 6000000);
 
       Set expected = new HashSet();
-      expected.add(Immutables.immutableEntry(dc.get("k1")));
-      expected.add(Immutables.immutableEntry(dc.get("k2")));
-      expected.add(Immutables.immutableEntry(dc.get("k3")));
-      expected.add(Immutables.immutableEntry(dc.get("k4")));
+      expected.add(Immutables.immutableInternalCacheEntry(dc.get("k1")));
+      expected.add(Immutables.immutableInternalCacheEntry(dc.get("k2")));
+      expected.add(Immutables.immutableInternalCacheEntry(dc.get("k3")));
+      expected.add(Immutables.immutableInternalCacheEntry(dc.get("k4")));
 
       for (Map.Entry o : dc.entrySet()) assert expected.remove(o);
 

Modified: trunk/core/src/test/java/org/infinispan/test/TestingUtil.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/test/TestingUtil.java	2009-07-13 11:29:07 UTC (rev 558)
+++ trunk/core/src/test/java/org/infinispan/test/TestingUtil.java	2009-07-13 12:12:01 UTC (rev 559)
@@ -632,7 +632,7 @@
       StringBuilder builder = new StringBuilder(cache.getName() + "[");
       while (it.hasNext()) {
          CacheEntry ce = (CacheEntry) it.next();
-         builder.append(ce.getKey() + " = " + ce.getValue() + ";");
+         builder.append(ce.getKey() + "=" + ce.getValue() + ",l=" + ce.getLifespan() + "; ");
       }
       builder.append("]");
       return builder.toString();




More information about the infinispan-commits mailing list