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.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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
deleteCloud(cloudModel)
|
deleteVaultsUseCase
|
||||||
}
|
.withVaults(vaultsOfCloud)
|
||||||
|
.run(object : DefaultResultHandler<List<Long>>() {
|
||||||
|
override fun onFinished() {
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user