package org.sdnplatform.sync.internal; import java.util.List; import org.sdnplatform.sync.IStoreClient; import org.sdnplatform.sync.IVersion; import org.sdnplatform.sync.Versioned; import org.sdnplatform.sync.error.ObsoleteVersionException; import org.sdnplatform.sync.error.SyncException; import org.sdnplatform.sync.internal.version.VectorClock; public abstract class AbstractStoreClient<K,V> implements IStoreClient<K, V> { @Override public V getValue(K key) throws SyncException { return getValue(key, null); } @Override public V getValue(K key, V defaultValue) throws SyncException { Versioned<V> val = get(key); if (val == null || val.getValue() == null) return defaultValue; return val.getValue(); } /** * Get the versions for a key * @param key the key * @return the versions * @throws SyncException */ protected abstract List<IVersion> getVersions(K key) throws SyncException; @Override public Versioned<V> get(K key) throws SyncException { return get(key, null); } @Override public IVersion put(K key, V value) throws SyncException { List<IVersion> versions = getVersions(key); Versioned<V> versioned; if(versions.isEmpty()) versioned = Versioned.value(value, new VectorClock()); else if(versions.size() == 1) versioned = Versioned.value(value, versions.get(0)); else { versioned = get(key, null); if(versioned == null) versioned = Versioned.value(value, new VectorClock()); else versioned.setValue(value); } return put(key, versioned); } @Override public boolean putIfNotObsolete(K key, Versioned<V> versioned) throws SyncException { try { put(key, versioned); return true; } catch (ObsoleteVersionException e) { return false; } } @Override public void delete(K key) throws SyncException { put(key, (V)null); } @Override public void delete(K key, IVersion version) throws SyncException { put(key, new Versioned<V>(null, version)); } }