@startuml fig_04_domain_class scale 2 skinparam shadowing false skinparam classFontSize 11 ' PNG (лимит растра по умолчанию 4096): PLANTUML_LIMIT_SIZE=8192 java -Xmx2g -jar plantuml.jar -charset UTF-8 -tpng … package usecases { class ManageStoragesEncryptionUseCase { + enableEncryption(IStorageInfo, EncryptKey, boolean): Unit + openStorage(IStorageInfo, EncryptKey, boolean): Unit + clearAndDisableEncryption(IStorageInfo): Unit + closeStorage(IStorageInfo): Unit + canEncrypt(IStorageInfo): Unit + changePassword(IStorageInfo, EncryptKey, boolean): Unit } class RemoveStorageUseCase { + remove(IStorageInfo): Unit } class GetOpenedStoragesUseCase { + getOpenedStorages(): StateFlow> } class ManageLocalVaultUseCase { + getLocalStorages(): StateFlow> + createStorage(): Unit } class StorageFileManagementUseCase { + getAllDirs(): Unit + setStorage(IStorageInfo): void + getAllFiles(): Unit } class RenameStorageUseCase { + rename(IStorageInfo, String): Unit } } package tasks { class TaskLogLine { + getTimestampMs(): long + getLevel(): TaskLogLevel + getMessage(): String } class PipelineWork { + run(TaskContext): Unit } class TaskContext { + reportProgress(Float, String): Unit + reportProgress(TaskProgress): Unit + log(TaskLogLevel, String): void + getTaskId(): TaskId } class PipelineState { + getTasks(): List + getRunningTaskIds(): Set } class ITaskOrchestrator { + getLogLines(): StateFlow> + enqueue(String, PipelineWork): TaskId + getPipelineState(): StateFlow + getForegroundUi(): StateFlow + cancel(TaskId): boolean + cancelAll(): void } class TaskProgress { + getLabel(): String + getFraction(): Float } class TaskForegroundUiState { } class TaskForegroundItem { + getProgress(): TaskProgress + getTitle(): String + getTaskId(): TaskId } class TaskLogLevel { + Debug + Warn + Error + Info + values(): TaskLogLevel[] + valueOf(String): TaskLogLevel + getEntries(): EnumEntries } class TaskRunState { } class TaskId { + getUuid(): UUID } class PipelineTask { + getId(): TaskId + getDispatcher(): CoroutineDispatcher + getState(): TaskRunState + getTitle(): String } } package interfaces { class ILogger { + debug(String, String): void } class IYandexVault { + getAccountEmail(): String } class IMetaInfo { + getSize(): long + isDeleted(): boolean + isHidden(): boolean + getLastModified(): Instant + getPath(): String } class IStorage { + rename(String): Unit + setEncInfo(StorageEncryptionInfo): Unit + isEmpty(): Flow + getUuid(): UUID + getAccessor(): IStorageAccessor + isAvailable(): StateFlow + getSize(): StateFlow + getNumberOfFiles(): StateFlow + clearAllContent(): Unit + getMetaInfo(): StateFlow + isVirtualStorage(): boolean } class IVaultsManager { + getLocalVault(): IVault + removeRemoteVault(UUID): Unit + addYandexVault(String): Unit + getRemoteVaults(): StateFlow> + getAllStorages(): StateFlow> + getAllVaults(): StateFlow> + getUnlockManager(): IUnlockManager } class IStorageMetaInfo { + getEncInfo(): StorageEncryptionInfo + getName(): String + getLastModified(): Instant } class IFile { + getMetaInfo(): IMetaInfo } class IStorageInfo { + isEmpty(): Flow + getUuid(): UUID + isAvailable(): StateFlow + getSize(): StateFlow + getNumberOfFiles(): StateFlow + getMetaInfo(): StateFlow + isVirtualStorage(): boolean } class IStorageExplorer { + getCurrentPath(): StateFlow } class IVaultInfo { + getAvailableSpace(): StateFlow + getType(): VaultType + getTotalSpace(): StateFlow + getUuid(): UUID + isAvailable(): StateFlow + getStorages(): StateFlow> } class IUnlockManager { + close(IStorage): Unit + close(UUID): Unit + open(IStorage, EncryptKey, boolean): Unit + getOpenedStorages(): StateFlow> } class IDirectory { + getMetaInfo(): IMetaInfo + getElementsCount(): Integer } class IStorageAccessor { + getFilesFlow(String): Flow>> + getDirs(String): Unit + getDirsUpdates(): SharedFlow>> + touchDir(String): Unit + getFiles(String): Unit + getSize(): StateFlow + isAvailable(): StateFlow + getDirInfo(String): Unit + openRead(String): Unit + moveToTrash(String): Unit + delete(String): Unit + touchFile(String): Unit + getAllDirs(): Unit + openWrite(String): Unit + getAllFiles(): Unit + getDirsFlow(String): Flow>> + getNumberOfFiles(): StateFlow + getFilesUpdates(): SharedFlow>> + setHidden(String, boolean): Unit + getFileInfo(String): Unit } class IVault { + getAvailableSpace(): StateFlow + getType(): VaultType + getTotalSpace(): StateFlow + remove(IStorage): Unit + createStorage(StorageEncryptionInfo): Unit + getUuid(): UUID + isAvailable(): StateFlow + getStorages(): StateFlow> + createStorage(): Unit } } package encrypt { class EncryptorWithStaticIv { + decryptBytesbyte[](byte[]) + encryptStream(java.io.OutputStream): java.io.OutputStream + decryptStream(java.io.InputStream): java.io.InputStream + encryptBytesbyte[](byte[]) + dispose(): void + encryptString(String): String + decryptString(String): String } class Encryptor { + AES_SETTINGS: String + IV_LEN: int + decryptBytesbyte[](byte[]) + encryptStream(java.io.OutputStream): java.io.OutputStream + decryptStream(java.io.InputStream): java.io.InputStream + encryptBytesbyte[](byte[]) + dispose(): void + encryptString(String): String + decryptString(String): String } } package datatypes { class Tree { + getValue(): Unit + getChildren(): List + setChildren(List): void } class EncryptKey { + toAesKey(): SecretKeySpec + getBytes(): byte[] } class DataPackage { + getData(): Unit + isError(): Boolean + isLoading(): Boolean } class DataPage { + getPageLength(): int + getPageIndex(): int + getHasNext(): Boolean } class StorageEncryptionInfo { + getEncryptedTestData(): String + getPathIv(): byte[] } } package common.impl { class CommonDirectory { + getElementsCount(): Integer + getMetaInfo(): CommonMetaInfo } class CommonStorageMetaInfo { + getEncInfo(): StorageEncryptionInfo + getName(): String + getLastModified(): Instant } class CommonMetaInfo { + getSize(): long + getPath(): String + isDeleted(): boolean + isHidden(): boolean + getLastModified(): Instant } class CommonFile { + getMetaInfo(): IMetaInfo } } package auth { class RemoteYandexAuthResult { } class RemoteYandexSignInLauncher { + launch(): void } } package enums { class VaultType { + DECRYPTED: VaultType + LOCAL: VaultType + YANDEX: VaultType + valueOf(String): VaultType + values(): VaultType[] + getEntries(): EnumEntries } } usecases.ManageStoragesEncryptionUseCase ..> interfaces.IStorageMetaInfo usecases.ManageStoragesEncryptionUseCase ..> interfaces.IStorageInfo usecases.ManageStoragesEncryptionUseCase ..> tasks.TaskProgress usecases.ManageStoragesEncryptionUseCase ..> datatypes.EncryptKey usecases.ManageStoragesEncryptionUseCase ..> encrypt.Encryptor usecases.ManageStoragesEncryptionUseCase ..> interfaces.IStorage usecases.ManageStoragesEncryptionUseCase ..> interfaces.IUnlockManager usecases.ManageStoragesEncryptionUseCase ..> datatypes.StorageEncryptionInfo usecases.RemoveStorageUseCase ..> usecases.ManageStoragesEncryptionUseCase usecases.RemoveStorageUseCase ..> interfaces.IStorage usecases.RemoveStorageUseCase ..> interfaces.IStorageInfo usecases.RemoveStorageUseCase ..> interfaces.IVaultsManager usecases.RemoveStorageUseCase ..> interfaces.IUnlockManager usecases.RemoveStorageUseCase ..> interfaces.IVault tasks.TaskLogLine ..> tasks.TaskLogLevel tasks.PipelineWork ..> tasks.TaskContext interfaces.IVault <|.. interfaces.IYandexVault interfaces.IVaultInfo <|.. interfaces.IYandexVault interfaces.IYandexVault ..> interfaces.IStorage interfaces.IYandexVault ..> interfaces.IVault interfaces.IYandexVault ..> enums.VaultType interfaces.IYandexVault ..> datatypes.StorageEncryptionInfo usecases.GetOpenedStoragesUseCase ..> interfaces.IStorageInfo usecases.GetOpenedStoragesUseCase ..> interfaces.IUnlockManager tasks.TaskContext ..> tasks.TaskLogLevel tasks.TaskContext ..> tasks.TaskProgress tasks.TaskContext ..> tasks.TaskId usecases.ManageLocalVaultUseCase ..> interfaces.IStorageInfo usecases.ManageLocalVaultUseCase ..> interfaces.IVaultsManager usecases.ManageLocalVaultUseCase ..> interfaces.IVault usecases.StorageFileManagementUseCase ..> interfaces.IFile usecases.StorageFileManagementUseCase ..> interfaces.IStorage usecases.StorageFileManagementUseCase ..> interfaces.IStorageInfo usecases.StorageFileManagementUseCase ..> interfaces.IDirectory usecases.StorageFileManagementUseCase ..> interfaces.IStorageAccessor interfaces.IStorageInfo <|.. interfaces.IStorage interfaces.IStorage ..> interfaces.IStorageMetaInfo interfaces.IStorage ..> interfaces.IStorageInfo interfaces.IStorage ..> tasks.TaskProgress interfaces.IStorage ..> interfaces.IStorageAccessor interfaces.IStorage ..> datatypes.StorageEncryptionInfo interfaces.IVaultsManager ..> interfaces.IStorage interfaces.IVaultsManager ..> interfaces.IUnlockManager interfaces.IVaultsManager ..> interfaces.IVault interfaces.IDirectory <|.. common.impl.CommonDirectory common.impl.CommonDirectory ..> common.impl.CommonMetaInfo common.impl.CommonDirectory ..> interfaces.IMetaInfo common.impl.CommonDirectory ..> interfaces.IDirectory tasks.PipelineState ..> tasks.TaskId tasks.PipelineState ..> tasks.PipelineTask interfaces.IStorageMetaInfo <|.. common.impl.CommonStorageMetaInfo common.impl.CommonStorageMetaInfo ..> interfaces.IStorageMetaInfo common.impl.CommonStorageMetaInfo ..> datatypes.StorageEncryptionInfo interfaces.IMetaInfo <|.. common.impl.CommonMetaInfo common.impl.CommonMetaInfo ..> interfaces.IMetaInfo interfaces.IStorageMetaInfo ..> datatypes.StorageEncryptionInfo interfaces.IFile ..> interfaces.IMetaInfo tasks.ITaskOrchestrator ..> tasks.TaskLogLine tasks.ITaskOrchestrator ..> tasks.PipelineState tasks.ITaskOrchestrator ..> tasks.TaskForegroundUiState tasks.ITaskOrchestrator ..> tasks.PipelineWork tasks.ITaskOrchestrator ..> tasks.TaskId interfaces.IStorageInfo ..> interfaces.IStorageMetaInfo interfaces.IStorageInfo ..> interfaces.IStorage usecases.RenameStorageUseCase ..> interfaces.IStorage usecases.RenameStorageUseCase ..> interfaces.IStorageInfo interfaces.IVaultInfo ..> interfaces.IStorageInfo interfaces.IVaultInfo ..> interfaces.IVault interfaces.IVaultInfo ..> enums.VaultType tasks.TaskForegroundItem ..> tasks.TaskProgress tasks.TaskForegroundItem ..> tasks.TaskId interfaces.IUnlockManager ..> interfaces.IStorage interfaces.IUnlockManager ..> datatypes.EncryptKey interfaces.IDirectory ..> interfaces.IMetaInfo interfaces.IStorageAccessor ..> interfaces.IFile interfaces.IStorageAccessor ..> interfaces.IDirectory interfaces.IStorageAccessor ..> datatypes.DataPackage interfaces.IVaultInfo <|.. interfaces.IVault interfaces.IVault ..> interfaces.IStorage interfaces.IVault ..> interfaces.IVaultInfo interfaces.IVault ..> enums.VaultType interfaces.IVault ..> datatypes.StorageEncryptionInfo auth.RemoteYandexSignInLauncher ..> auth.RemoteYandexAuthResult datatypes.DataPackage <|-- datatypes.DataPage datatypes.DataPage ..> datatypes.DataPackage interfaces.IFile <|.. common.impl.CommonFile common.impl.CommonFile ..> interfaces.IMetaInfo common.impl.CommonFile ..> interfaces.IFile tasks.PipelineTask ..> tasks.TaskRunState tasks.PipelineTask ..> tasks.TaskId @enduml