Hoist atomicUpdate, deleteKeys up to AbstractAccess

These can be useful in other backends, as they are quite simple
implementations that are built on top of other primitives.

Change-Id: I847ce3b27c18ff4de65d7d5a69cd6690f99ff7bd
Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/src/main/java/com/google/gwtorm/client/impl/AbstractAccess.java b/src/main/java/com/google/gwtorm/client/impl/AbstractAccess.java
index 77e150e..17ff862 100644
--- a/src/main/java/com/google/gwtorm/client/impl/AbstractAccess.java
+++ b/src/main/java/com/google/gwtorm/client/impl/AbstractAccess.java
@@ -15,16 +15,21 @@
 package com.google.gwtorm.client.impl;
 
 import com.google.gwtorm.client.Access;
+import com.google.gwtorm.client.AtomicUpdate;
 import com.google.gwtorm.client.Key;
+import com.google.gwtorm.client.OrmConcurrencyException;
 import com.google.gwtorm.client.OrmException;
 import com.google.gwtorm.client.ResultSet;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 public abstract class AbstractAccess<E, K extends Key<?>>
     implements Access<E, K> {
+  private static final int MAX_TRIES = 10;
+
   public ResultSet<E> get(final Iterable<K> keys) throws OrmException {
     final ArrayList<E> r = new ArrayList<E>();
     for (final K key : keys) {
@@ -49,4 +54,30 @@
       }
     }
   }
+
+  @Override
+  public E atomicUpdate(final K key, final AtomicUpdate<E> update)
+      throws OrmException {
+    for (int attempts = 1;; attempts++) {
+      try {
+        final E obj = get(key);
+        if (obj == null) {
+          return null;
+        }
+        final E res = update.update(obj);
+        update(Collections.singleton(obj));
+        return res;
+      } catch (OrmConcurrencyException err) {
+        if (attempts < MAX_TRIES) {
+          continue;
+        }
+        throw err;
+      }
+    }
+  }
+
+  @Override
+  public void deleteKeys(Iterable<K> keys) throws OrmException {
+    delete(get(keys));
+  }
 }
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
index 08f18e2..4105d75 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
@@ -15,7 +15,6 @@
 package com.google.gwtorm.jdbc;
 
 import com.google.gwtorm.client.Access;
-import com.google.gwtorm.client.AtomicUpdate;
 import com.google.gwtorm.client.Key;
 import com.google.gwtorm.client.OrmConcurrencyException;
 import com.google.gwtorm.client.OrmException;
@@ -32,8 +31,6 @@
 /** Internal base class for implementations of {@link Access}. */
 public abstract class JdbcAccess<T, K extends Key<?>> extends
     AbstractAccess<T, K> {
-  private static final int MAX_TRIES = 10;
-
   private final JdbcSchema schema;
 
   protected JdbcAccess(final JdbcSchema s) {
@@ -297,34 +294,6 @@
     }
   }
 
-  @Override
-  public T atomicUpdate(final K key, final AtomicUpdate<T> update)
-      throws OrmException {
-
-    for (int attempts = 1;; attempts++) {
-      try {
-        final T obj = get(key);
-        if (obj == null) {
-          return null;
-        }
-        final T res = update.update(obj);
-        update(Collections.singleton(obj));
-        return res;
-      } catch (OrmConcurrencyException err) {
-        if (attempts < MAX_TRIES) {
-          continue;
-        }
-        throw err;
-      }
-    }
-
-  }
-
-  @Override
-  public void deleteKeys(Iterable<K> keys) throws OrmException {
-    delete(get(keys));
-  }
-
   private OrmException convertError(final String op, final SQLException err) {
     if (err.getCause() == null && err.getNextException() != null) {
       err.initCause(err.getNextException());