package io.cattle.platform.lock.impl; import io.cattle.platform.lock.Lock; import io.cattle.platform.lock.LockCallback; import io.cattle.platform.lock.LockCallbackWithException; import io.cattle.platform.lock.LockManager; import io.cattle.platform.lock.definition.LockDefinition; public abstract class AbstractLockManagerImpl implements LockManager { @Override public <T, E extends Throwable> T lock(LockDefinition lockDef, LockCallbackWithException<T, E> callback, Class<E> clz) throws E { return doLock(lockDef, callback, new WithLock() { @Override public boolean withLock(Lock lock) { if (lock != null) lock.lock(); return true; } }); } @Override public <T, E extends Throwable> T tryLock(LockDefinition lockDef, LockCallbackWithException<T, E> callback, Class<E> clz) throws E { return doLock(lockDef, callback, new WithLock() { @Override public boolean withLock(Lock lock) { if (lock != null) return lock.tryLock(); return true; } }); } @Override public <T> T lock(LockDefinition lockDef, final LockCallback<T> callback) { return lock(lockDef, new LockCallbackWithException<T, RuntimeException>() { @Override public T doWithLock() throws RuntimeException { return callback.doWithLock(); } }, RuntimeException.class); } @Override public <T> T tryLock(LockDefinition lockDef, final LockCallback<T> callback) { return tryLock(lockDef, new LockCallbackWithException<T, RuntimeException>() { @Override public T doWithLock() throws RuntimeException { return callback.doWithLock(); } }, RuntimeException.class); } protected abstract <T, E extends Throwable> T doLock(LockDefinition lockDef, LockCallbackWithException<T, E> callback, WithLock with) throws E; protected static interface WithLock { boolean withLock(Lock lock); } }