Remove race conditions which could cause ConcurrentModificationException
This commit is contained in:
parent
4d7b5f2971
commit
d08ffe68ef
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user