package ch.elexis.core.ui.locks; import java.util.ArrayList; import java.util.List; import ch.elexis.admin.ACE; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.lock.types.LockInfo; import ch.elexis.core.lock.types.LockResponse; import ch.elexis.core.ui.actions.RestrictedAction; import ch.elexis.data.PersistentObject; public abstract class AllOrNoneLockRequestingRestrictedAction<T extends PersistentObject> extends RestrictedAction { private List<T> objects; public AllOrNoneLockRequestingRestrictedAction(ACE necessaryRight, String text){ super(necessaryRight, text); } public AllOrNoneLockRequestingRestrictedAction(ACE necessaryRight, String text, int val){ super(necessaryRight, text, val); } public void doRun(){ if (!CoreHub.acl.request(necessaryRight)) { return; } objects = getTargetedObjects(); if (objects == null || objects.size() == 0) { return; } List<LockInfo> acquiredLocks = new ArrayList<>(); for (T object : objects) { LockResponse lr = CoreHub.getLocalLockService().acquireLock(object); if (lr.isOk()) { acquiredLocks.add(lr.getLockInfo()); } else { LockResponseHelper.showInfo(lr, object, log); releaseAllAcquiredLocks(acquiredLocks); return; } } doRun(objects); releaseAllAcquiredLocks(acquiredLocks); }; private void releaseAllAcquiredLocks(List<LockInfo> acquiredLocks){ for (LockInfo lockInfo : acquiredLocks) { LockResponse lockResponse = CoreHub.getLocalLockService().releaseLock(lockInfo); if (!lockResponse.isOk()) { log.warn("Could not release lock for [{}] with lock response [{}]", lockInfo.getElementType() + "::" + lockInfo.getElementId(), lockResponse.getStatus()); } } } public abstract List<T> getTargetedObjects(); public abstract void doRun(List<T> lockedElements); }