@startuml

skinparam linetype ortho

/' Tests '/
/' package "Testing" #DDDDDD {
      class MainTests {
      }
      Abstract IProject {
      }
      class ProjectTests {
      }
      class TaskTests {
      }
} '/


/' Back End '/
package "Kernel" #DDDDDD {
  class Main {
    +{static}main()
  }

  Abstract ProjectComponent {
      +id : String
      +fatherTree : ProjectComponent
      +name : String
      +description: String
      +estimatedTime : Duration
      +CompletedWork : Duration
      #UpdateState()
      #UpdateTime()
  }

  class ProjectComposite {
     +RemoveComponent(Component : ProjectComponent) : void
     +AddComponent(Component : ProjectComponent) : void
   }

  class Task {
    +StartTask() : void
    +PauseTask() : void
    +FinishTask() : void
/'    +startTime: DateTime
    +finishTime: DateTime'/
  }

  enum ComponentState {
    TODO,
    DOING,
    DONE
  }

  class Timer {
    -_start : LocalDateTime
    -_end : LocalDateTime
    +duration : Duration
    +StartCounting() : void
    +PauseCounting() : void
    +StopCounting() : void
  }

  package "java.util"
  {
      abstract Observable {
        +AddObserver(o:Observer) : void
        +DeleteObserver(o:Observer) : void
        +DeleteObservers() : void
        #SetChanged() : void
        +HasChanged() : bool
        #ClearChanged() : void
        +NotifyObservers(arg:object) : void
      }
      interface Observer
      {
           +void Update()
      }
      Observable "0..N" *--> "1" Observer
  }

}

/' Relationship '/
  Task -right-|> ProjectComponent
  ProjectComponent "1" o-right- "1" ComponentState : State
  ProjectComponent <|-- ProjectComposite
  ProjectComponent "N" --o "1" ProjectComposite : Children
  Task ..|> Observer
  Timer --|> Observable
  Main -- ProjectComponent: "instantiates"

@enduml
