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

'!theme aws-orange
skinparam sequenceMessageAlign center
skinparam BoxPadding 10
'skinparam LifelineStrategy nosolid
'autonumber
'autoactivate on
'hide footbox

actor User as user

box "control.backing"
    participant ":SubmissionBacking" as sb << @Named >>
end box
'box "???"
'    participant ":ResourceBundle" as rscBundle
'end box
box "control.internal"
    participant "si:SessionInformation" as si << @SessionScoped >>
end box
box "control.validation"
    participant ":PDFValidator" as pdfv << @FacesValidator >>
end box
box "business.service"
    participant "ssvc:SubmissionService" as ssvc << @ApplicationScoped >>
end box
box "global.transfer"
    participant "sub:Submission" as sub << @Named >>
    participant "user:User" as usr
    participant "paper:Paper" as paper
end box
box persistence
    participant "t1:Transaction" as t1
    participant "t2:Transaction" as t2
    participant ":SubmissionRepository" as sr
    participant "cp:ConnectionPool" as cp
end box

create sb
user -> sb
note left
    ruft die
    Submission-
    Seite auf
end note
sb --> ssvc : //injection//
return //ssvc//
sb --> si : //injection//
return //si//
user -> sb : init()
activate sb
    note right
        int subId wird
        gelesen von
        requestParams
        (URL-Parameter)
    end note
    sb -> si ++ : getUserId()
    return userId
    sb -> sub ** : Submission()
    sb -> sub : setId(subId)
    activate sub
    return
    sb -> usr ** : User()
    sb -> usr ++ : setId(userId)
    return
    return
    sb -> ssvc ++ : canView(sub, usr)
    return true

    sb -> ssvc : __getSubmission(sub)__
    activate ssvc
        ssvc -> t1 ** : Transaction()
        activate t1
            t1 -> cp : __getInstance()__
            activate cp
            return cp
            t1 -> cp : getConnection()
            activate cp
            return
        return
        ssvc -> sr : __getSubmission(sub, t1)__
        activate sr
            sr -> t1 ++ : getConnection()
            return
            sr -> sub : getId()
            activate sub
            return id
            sr -> sub : setTitle()
            activate sub
            return
            sr -> sub : setPapers()
            activate sub
            return
            ......sub befüllen......
        return
        ssvc -> t1 ++ : commit()
            t1 -> cp ++ : releaseConnection()
            return
        return
        destroy t1
    return sub : Submission
    sb -> sub ++ : getTitle()
    return
    sb -> sub ++ : getPapers()
    return
    sb -> sub ++ : getCoAuthors()
    return
    sb -> sub ++ : getSubmitter()
    return
return submission.xhtml
note left
    sucht die PDF-Datei mit
    dem file picker aus und
    klickt auf "Submit Revision"
end note
user -> sb : submitRevision()
activate sb

    user -> pdfv ++ : validate()
    return
    user -> sb : setRevisionPdfPart()

    sb -> ssvc : addRevision(sub, revisionPdf)
    activate ssvc
        ssvc -> t2 ** : Transaction()
        activate t2
            t2 -> cp : __getInstance()__
            activate cp
            return cp
            t2 -> cp : getConnection()
            activate cp
            return
        return
        ssvc -> sr : __getSubmission(sub,t2)__
        activate sr
            sr -> t2 ++ : getConnection()
            return
            sr -> sub : getId()
            activate sub
            return id
            sr -> sub : setTitle()
            activate sub
            return
            sr -> sub : setPapers()
            activate sub
            return
            ...sub befüllen...
        return
        ssvc -> sub : getPapers()
        activate sub
        return papers
        ssvc -> paper ** : Paper()
        ssvc -> paper : setSubmissionId(subId)
        activate paper
        return
        ssvc -> paper : setVersion(papers.size())
        activate paper
        return paper
        ssvc -> sub : addPaper(paper)
        activate sub
        return
        ssvc -> sub ++ : setSubmissionState(SUBMITTED)
        return

        ssvc -> sr : __changeSubmission(sub, t2)__
        activate sr
            sr -> sub ++ : getId()
            return
            sr -> sub ++ : getTitle()
            return
            sr -> sub ++ : getPapers()
            return
            ......sub auslesen......
            sr -> t1 ++ : getConnection()
            return
        return

        ssvc -> t2 ++ : commit()
            t2 -> cp ++ : releaseConnection()
            return
        return
        destroy t2
    return

'    subBacking -> rscBundle : getAddRevision\\\nConfirmationMsg()
'    activate rscBundle
'    return msg

return submission.xhtml\nwith facesMessage




@enduml