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

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