[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