Remove race conditions which could cause ConcurrentModificationException

This commit is contained in:
Julian Raufelder 2022-02-15 15:02:26 +01:00
parent 4d7b5f2971
commit d08ffe68ef
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
4 changed files with 51 additions and 20 deletions

View File

@ -6,8 +6,6 @@ import org.cryptomator.domain.repository.VaultRepository;
import org.cryptomator.generator.Parameter;
import org.cryptomator.generator.UseCase;
import java.util.List;
@UseCase
class DeleteVault {
@ -20,12 +18,7 @@ class DeleteVault {
}
public Long execute() throws BackendException {
Long vaultId = vaultRepository.delete(vault);
List<Vault> reorderVaults = MoveVaultHelper.Companion.reorderVaults(vaultRepository);
MoveVaultHelper.Companion.updateVaultsInDatabase(reorderVaults, vaultRepository);
return vaultId;
return vaultRepository.delete(vault);
}
}

View File

@ -0,0 +1,30 @@
package org.cryptomator.domain.usecases.vault;
import org.cryptomator.domain.Vault;
import org.cryptomator.domain.exception.BackendException;
import org.cryptomator.domain.repository.VaultRepository;
import org.cryptomator.generator.Parameter;
import org.cryptomator.generator.UseCase;
import java.util.ArrayList;
import java.util.List;
@UseCase
class DeleteVaults {
private final VaultRepository vaultRepository;
private final List<Vault> vaults;
public DeleteVaults(VaultRepository vaultRepository, @Parameter List<Vault> vaults) {
this.vaultRepository = vaultRepository;
this.vaults = vaults;
}
public List<Long> execute() throws BackendException {
List<Long> ids = new ArrayList<>();
for (Vault vault : vaults) {
ids.add(vaultRepository.delete(vault));
}
return ids;
}
}

View File

@ -3,7 +3,6 @@ package org.cryptomator.domain.usecases.vault;
import org.cryptomator.domain.Vault
import org.cryptomator.domain.repository.VaultRepository
import java.util.Collections
import java.util.Comparator
class MoveVaultHelper {
@ -40,7 +39,9 @@ class MoveVaultHelper {
}
fun updateVaultsInDatabase(vaults: List<Vault>, vaultRepository: VaultRepository): List<Vault> {
vaults.forEach { vault -> vaultRepository.store(vault) }
for(vault in vaults) {
vaultRepository.store(vault)
}
return vaultRepository.vaults()
}
}

View File

@ -21,7 +21,7 @@ import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase
import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase
import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase
import org.cryptomator.domain.usecases.cloud.RemoveCloudUseCase
import org.cryptomator.domain.usecases.vault.DeleteVaultUseCase
import org.cryptomator.domain.usecases.vault.DeleteVaultsUseCase
import org.cryptomator.domain.usecases.vault.GetVaultListUseCase
import org.cryptomator.generator.Callback
import org.cryptomator.presentation.R
@ -48,7 +48,7 @@ class CloudConnectionListPresenter @Inject constructor( //
private val removeCloudUseCase: RemoveCloudUseCase, //
private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, //
private val getVaultListUseCase: GetVaultListUseCase, //
private val deleteVaultUseCase: DeleteVaultUseCase, //
private val deleteVaultsUseCase: DeleteVaultsUseCase, //
private val cloudModelMapper: CloudModelMapper, //
exceptionMappings: ExceptionHandlers
) : Presenter<CloudConnectionListView>(exceptionMappings) {
@ -97,14 +97,21 @@ class CloudConnectionListPresenter @Inject constructor( //
}
fun onDeleteCloudConnectionAndVaults(cloudModel: CloudModel, vaultsOfCloud: ArrayList<Vault>) {
vaultsOfCloud.forEach { vault ->
deleteVault(vault)
}
deleteCloud(cloudModel)
}
if (vaultsOfCloud.isEmpty()) {
deleteCloud(cloudModel)
} else {
deleteVaultsUseCase
.withVaults(vaultsOfCloud)
.run(object : DefaultResultHandler<List<Long>>() {
override fun onFinished() {
deleteCloud(cloudModel)
}
private fun deleteVault(vault: Vault) {
deleteVaultUseCase.withVault(vault).run(DefaultResultHandler())
override fun onError(e: Throwable) {
Timber.tag("CloudConnectionListPresenter").e(e, "Failed to remove all vaults")
}
})
}
}
private fun deleteCloud(cloudModel: CloudModel) {
@ -345,6 +352,6 @@ class CloudConnectionListPresenter @Inject constructor( //
}
init {
unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultUseCase)
unsubscribeOnDestroy(getCloudsUseCase, removeCloudUseCase, addOrChangeCloudConnectionUseCase, getVaultListUseCase, deleteVaultsUseCase)
}
}