@startuml
'https://plantuml.com/class-diagram

hide circle
skinparam classAttributeIconSize 0

'abstract class DGS
'abstract AbstractCollection
'interface List
'interface Collection
'
'List <|-- AbstractList
'Collection -- AbstractCollection
'
'Collection <|- List
'AbstractCollection <|- AbstractList
'AbstractList <|-- ArrayList

StorageManager --> "1" NoteStorage
StorageManager --> "1" PdfStorage
StorageManager --> "1" JsonStorage
StorageManager --> "1" FolderStorage

FilterManager <.. StorageManager : "filters \n ModuleManager <"

NoteStorage --|> Storage
PdfStorage --|> Storage
JsonStorage --|> Storage
FolderStorage --|> Storage

class StorageManager #mistyrose{
  - isDisabled : Boolean
  - baseDirectory : Path
  + StorageManager(Path baseDirectory, String mainJsonFileName)
  + executeCommandResult(ModuleManager moduleManager, CommandResult result) : void
  + updateMainJsonFile(ModuleManager moduleManager) : void
  + initialize() : ModuleManager
  + save() : void
}

class NoteStorage #mistyrose{
  + execute() : void
  # createNoteFile() : void
  # loadNoteIntoModuleManager() : void
  # saveAllNotes() : void
}

class PdfStorage #mistyrose{
  + execute() : void
  # exportModuleNotes() : void
}

class JsonStorage #mistyrose{
  + execute() : void
  + loadJson() : ModuleManager
  # createJson() : void
  # saveJson() : void
}

class FolderStorage #mistyrose{
  + execute() : void
  # createModuleFolder() : void
  # deleteModuleFolder() : void
  # renameModuleFolder() : void
}

class Storage #mistyrose{
 + createFolder(Path folderPath) : void
 + createFile(Path filePath) : void
 + readFile(Path filePath) : String
 + writeFile(Path filePath, String data): void
 + delete(Path filePath) : void
 + getListOfFiles(Path folderPath) : File[]
 + renameFolder(Path oldPath, Path newPath) : void
 + getBufferedReader(Path filePath) : void
 + getFileType(File file) : String
 + getAppendPath(Path corePath, String path) : Path
 # cleanAllFilesInclusive(Path filePath) : void

}

class FilterManager #mistyrose{
  + filter(ModuleManager moduleManager) : void
  # filterLink(ContentManager<Link> linkContentManager) : void
  # filterQuestion(ContentManager<Question> questionContentManager) : void
  + {static} isQuestionValid(Question question) : Boolean
  + {static} isScheduleValid(Link link) : Boolean
  + {static} isModuleValid(String module) : Boolean

}

note "The input parameters in all functions \nfor <Type>Storage has been left out \nto make this diagram more compact." as note1


@enduml