@startuml oclib


abstract Resource{
    +UUID: int
    +name: string
    +icon: string
    +description: string
    +graphic: GraphicElement
    +element: DataResource/ProcessingResource/StorageResource/Workflow/ComputeResource
}

class DataResource {
    +UUID: int
    +name: string
}

class ProcessingResource {
    +UUID: int
    +name: string
    +container: string
    +command: int
    +environment: int   

}

class StorageResource {
    +UUID: int
    +name: string
    +url: string
    +capacity: int
}

class ComputeResource {
    +UUID: int
    +name: string

}

class Workflow {
    +UUID: int
    +name: string
}

class ResourceSet {
    +UUID: int
    +name: string
    +ressources: Ressource[]
}

class WorkflowSchedule {
    +UUID: int
    +start: date
    +end: date
    +cron : string
}

class Graph {
    +UUID: int
    +ressources: map[GraphicElement.UUID]Resource
    +links: Link[] 
}

class Link {
    +UUID: int
    +source: GraphicElement.UUID
    +target: GraphicElement.UUID
    +graphic: GraphicLink
}

class GraphicLink {
    +UUID: int
    +startXY: coord
    +endXY: coord
    +style: string
}   

class GraphicElement {
    +UUID: int
    +style: string
    +xy: coord
}

class Calendar {
    +UUID: int
    +name: string
    +workflows: Workflow[]
    +owner: string
}  

class UserWorkflows {
    +UUID: int
    +user: string
    +workflows: Workflow[]
}   

class DatacenterWorkflows {
    +UUID: int
    +compute: ComputeResource
    +workflows: Workflow[]
}   

class Graph {
    +UUID: int
    +graph: Graph
    +workflows: Workflow[]
}


class Workspace {
    +UUID: int
    +name: string
    +resources: ResourceSet[]
    +peers: Peer[]
}

class Peer {
    +UUID: int
    +name: string
    +url: string
}

class SharedWorkspace {
    +UUID: int
    +name: string
    +version: string
    +description: string
    +attributes: map[string]string
    +workspaces: Workspace[]
    +workflows: Workflow[]
    +peers: Peer[]
}

class RuleSet {
    +UUID: int
    +name: string
    +description: string
    +rules: Rule[]
}
class Rule {
    +UUID: int
    +name: string
    +description: string
    +condition: string
    +action: string
}

SharedWorkspace "1" o-- "0..*" Workspace
SharedWorkspace "1" o-- "0..*" Peer
Workspace "1" o-- "0..*" ResourceSet
Peer -- Resource
RuleSet "1" o-- "0..*" Rule
SharedWorkspace -- RuleSet

UserWorkflows "1" o-- "0..*" Workflow

DatacenterWorkflows "1" o-- "0..*" Workflow

Resource<|-- DataResource
Resource<|-- ProcessingResource
Resource<|-- StorageResource
Resource<|-- ComputeResource
Resource<|-- Workflow

ResourceSet "1" o-- "0..*" Ressource

Workflow "1" o-- "0..*" ResourceSet
Workflow "1" o-- "0..1" WorkflowSchedule
Workflow "1" o-- "0..*" Graph

Graph "1" o-- "0..*" Resources
Graph "1" o-- "0..*" Link

Resource--o GraphicElement
Link -- GraphicLink


Calendar "1" o-- "0..*" Workflow


@enduml