[jbosscache-commits] JBoss Cache SVN: r7171 - in core/branches/flat/src: test/java/org/jboss/starobrno/atomic and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Wed Nov 19 14:01:18 EST 2008


Author: manik.surtani at jboss.com
Date: 2008-11-19 14:01:18 -0500 (Wed, 19 Nov 2008)
New Revision: 7171

Added:
   core/branches/flat/src/test/java/org/jboss/starobrno/atomic/AtomicHashMapTest.java
Modified:
   core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMap.java
   core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java
   core/branches/flat/src/main/java/org/jboss/starobrno/atomic/DeltaAware.java
Log:
Improved on deltas, added tests

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMap.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMap.java	2008-11-19 18:08:47 UTC (rev 7170)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMap.java	2008-11-19 19:01:18 UTC (rev 7171)
@@ -61,19 +61,9 @@
       delegate = new FastCopyHashMap<K, V>();
    }
 
-   public void rollback()
-   {
-      // replay reversal operations on the changelog, in reverse order
-
-//      ListIterator<AtomicHashMapDelta.Operation> li = delta.changelog.listIterator(delta.changelog.size());
-//      while (li.hasPrevious()) li.previous().rollback(delegate);
-
-      // surely a no-op?
-   }
-
    public void commit()
    {
-      if (delta != null) delta.changelog.clear();
+      if (delta != null) delta = null;
    }
 
    public int size()
@@ -164,7 +154,10 @@
 
    public Delta delta()
    {
-      return delta == null ? NullDelta.INSTANCE : delta;
+
+      Delta toReturn = delta == null ? NullDelta.INSTANCE : delta;
+      delta = null; // reset
+      return toReturn;
    }
 
    public AtomicHashMap copyForWrite()
@@ -172,7 +165,6 @@
       AtomicHashMap clone = new AtomicHashMap();
       clone.delegate = (FastCopyHashMap) delegate.clone();
       clone.proxy = proxy;
-      clone.delta = new AtomicHashMapDelta();
       return clone;
    }
 
@@ -183,4 +175,12 @@
             "delegate=" + delegate +
             '}';
    }
+
+   /**
+    * Initializes the delta instance to start recording changes.
+    */
+   public void initForWriting()
+   {
+      delta = new AtomicHashMapDelta();
+   }
 }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java	2008-11-19 18:08:47 UTC (rev 7170)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/atomic/AtomicHashMapProxy.java	2008-11-19 19:01:18 UTC (rev 7171)
@@ -62,6 +62,7 @@
          AtomicHashMap map = getDeltaMapForRead();
          // copy for write
          AtomicHashMap copy = map == null ? new AtomicHashMap() : map.copyForWrite();
+         copy.initForWriting();
          cache.put(deltaMapKey, copy);
          return copy;
       }

Modified: core/branches/flat/src/main/java/org/jboss/starobrno/atomic/DeltaAware.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/atomic/DeltaAware.java	2008-11-19 18:08:47 UTC (rev 7170)
+++ core/branches/flat/src/main/java/org/jboss/starobrno/atomic/DeltaAware.java	2008-11-19 19:01:18 UTC (rev 7171)
@@ -35,19 +35,15 @@
 {
    /**
     * Extracts changes made to implementations, in an efficient format that can easily and cheaply be serialized and
-    * deserialized.
+    * deserialized.  This method can only be called once for each changeset as it wipes its internal changelog when
+    * generating and submitting the delta to the caller.
     *
     * @return an instance of Delta
     */
    Delta delta();
 
    /**
-    * Indicate that all deltas collected to date can be applied and discarded.
+    * Indicate that all deltas collected to date has been extracted (via a call to {@link #delta()}) and can be discarded.
     */
    void commit();
-
-   /**
-    * Indicate that all deltas collected to date can be discarded.
-    */
-   void rollback();
 }

Added: core/branches/flat/src/test/java/org/jboss/starobrno/atomic/AtomicHashMapTest.java
===================================================================
--- core/branches/flat/src/test/java/org/jboss/starobrno/atomic/AtomicHashMapTest.java	                        (rev 0)
+++ core/branches/flat/src/test/java/org/jboss/starobrno/atomic/AtomicHashMapTest.java	2008-11-19 19:01:18 UTC (rev 7171)
@@ -0,0 +1,105 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ */
+
+package org.jboss.starobrno.atomic;
+
+import org.easymock.EasyMock;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.io.ObjectOutput;
+
+ at Test(groups = "unit")
+public class AtomicHashMapTest
+{
+   public void testDeltasWithEmptyMap() throws IOException
+   {
+      AtomicHashMap m = new AtomicHashMap();
+      Delta d = m.delta();
+      assert d instanceof NullDelta;
+      ObjectOutput out = EasyMock.createMock(ObjectOutput.class);
+      EasyMock.replay(out);
+      d.writeExternal(out);
+      EasyMock.verify(out);
+
+      AtomicHashMap newMap = new AtomicHashMap();
+      newMap.initForWriting();
+      newMap.put("k", "v");
+      newMap = (AtomicHashMap) d.merge(newMap);
+      assert newMap.containsKey("k");
+      assert newMap.size() == 1;
+
+      newMap = (AtomicHashMap) d.merge(null);
+      assert newMap.isEmpty();
+   }
+
+   public void testDeltasWithNoChanges() throws IOException
+   {
+      AtomicHashMap m = new AtomicHashMap();
+      m.initForWriting();
+      m.put("k1", "v1");
+      m.commit();
+      assert m.size() == 1;
+      Delta d = m.delta();
+      assert d instanceof NullDelta;
+      ObjectOutput out = EasyMock.createMock(ObjectOutput.class);
+      EasyMock.replay(out);
+      d.writeExternal(out);
+      EasyMock.verify(out);
+
+      AtomicHashMap newMap = new AtomicHashMap();
+      newMap.initForWriting();
+      newMap.put("k", "v");
+      newMap = (AtomicHashMap) d.merge(newMap);
+      assert newMap.containsKey("k");
+      assert newMap.size() == 1;
+
+      newMap = (AtomicHashMap) d.merge(null);
+      assert newMap.isEmpty();
+   }
+
+   public void testDeltasWithRepeatedChanges()
+   {
+      AtomicHashMap m = new AtomicHashMap();
+      m.initForWriting();
+      m.put("k1", "v1");
+      m.put("k1", "v2");
+      m.put("k1", "v3");
+      assert m.size() == 1;
+      AtomicHashMapDelta d = (AtomicHashMapDelta) m.delta();
+      assert !d.changelog.isEmpty();
+
+      AtomicHashMap newMap = new AtomicHashMap();
+      newMap.initForWriting();
+      newMap.put("k1", "v4");
+      newMap = (AtomicHashMap) d.merge(newMap);
+      assert newMap.containsKey("k1");
+      assert newMap.get("k1").equals("v3");
+      assert newMap.size() == 1;
+
+      newMap = (AtomicHashMap) d.merge(null);
+      assert newMap.containsKey("k1");
+      assert newMap.get("k1").equals("v3");
+      assert newMap.size() == 1;
+   }
+}




More information about the jbosscache-commits mailing list