@startuml
left to right direction

skinparam titleBorderRoundCorner 15
skinparam titleBorderThickness 2
skinparam titleBorderColor red
skinparam titleBackgroundColor Aqua-CadetBlue

title Class diagram



package model.string_filters.operations {

abstract class Operation {
    #StringAdditionalOperations ops
    +{abstract}filter(String input): String
    +{abstract}addFilter(String filter): void
}

abstract class CharacterOperation extends Operation {
    #List<Character> filterCharacters
    +filter(String input): String
    +replaceWith(String replaceWith)
    +addFilter(char filterCharacter)
    +addFilter(String filterCharacters)
    +{abstract}performOperation(String input, char filterCharacter)
}
abstract class RegexOperation extends Operation {
    #Pattern filterPattern
    +filter(String input): String
    +replaceWith(String replaceWith)
    +addFilter(Pattern newFilterPattern)
    +addFilter(String newFilterPattern)
    +{abstract}performOperation(String input, Patter filterPattern)
}
abstract class ModifiedRegexOperation extends RegexOperation {
    #Pattern modifiedFilterPattern
    +addFilter(Pattern newPatternToBeModified)
    #{abstract}modifyPattern(Pattern patternToBeModified)
}

class BlacklistCharacterFilter extends CharacterOperation {
    #performOperation()
}
class BlacklistRegexFilter extends RegexOperation {
    #performOperation()
}

class WhitelistCharacterFilter extends CharacterOperation {
    +filter(String input): String
    #performOperation() is UNSUPPORTED_OPERATION
}
class WhitelistRegexFilter extends ModifiedRegexOperation {
    #modifyPattern()
    #performOperation()
}

class SqueezeCharacterFilter extends CharacterOperation {
    #performOperation()
}
class SqueezeRegexFilter extends RegexOperation {
    #performOperation()
}
class TrimCharacterFilter extends CharacterOperation {
    -String trimmingString
    +filter(String input): String
    #performOperation() is UNSUPPORTED_OPERATION
    +addFilter(String)
    +addFilter(char)

}
class TrimRegexFilter extends ModifiedRegexOperation {
    #modifyPattern()
    #performOperation()
}

class FileNameFilterOperation extends Operation
}

package model.strings {
    class StringUtilityOperations {
        +squeezeEverything(String input): String
        +squeezeWhat(String input, char squeezeWhat): String
        +squeezeWhatRegex(String input, Pattern regexWhat): String
        +replaceWhatTo(String input, String replaceWhat, String replaceTo): void
        +replaceWhatRegexTo(String input, Pattern regexWhat, String replaceTo): void
    }

    abstract class StringSqueeze {
        #currentChar
        #lastAppendedChar

        +squeeze(String input): String
        -performSqueeze(String input): void
        #{abstract}thisCharIsRelevantForSqueezing(char): boolean
    }

    class SqueezeEverything {
        #thisCharIsRelevantForSqueezing(char): boolean
    }

    class SqueezeSpecificCharOnly {
        -char squeezeWhat
        +SqueezeSpecificCharOnly(char squeezeWhat)
        #thisCharIsRelevantForSqueezing(char): boolean
    }

    class SqueezeSpecificCharRegexOnly {
        -Pattern squeezeRegexWhat
        +SqueezeSpecificCharOnly(Pattern squeezeRegexWhat)
        #thisCharIsRelevantForSqueezing(char): boolean
    }

    StringSqueeze <|-- SqueezeEverything : Template\nmethod
    StringSqueeze <|-- SqueezeSpecificCharOnly : Template\nmethod
    StringSqueeze <|-- SqueezeSpecificCharRegexOnly : Template\nmethod


}

package model.file_operations {

interface FileOperation {
    +copy(Path what, Path to) throws IOException
    +rename(Path what, String newName) throws IOException
    +move(Path what, Path to) throws IOException
    +delete(Path what) throws IOException
}

enum FileOperationEnum {
    RENAME,
    COPY,
    MOVE,
    DELETE
}

class FileOperationImpl implements FileOperation

}

@enduml
