From 381351c1b57e8aee32ee650c394d9af9b68e1208 Mon Sep 17 00:00:00 2001 From: Slava Vedernikov Date: Wed, 2 Oct 2024 12:04:23 +0100 Subject: [PATCH] Added documentation for Issue Add support for Infrastructure Architecture as Code and Deployment Diagrams generation #62 --- .../Environments/Development.yaml | 36 + .../Architecture/Environments/Live.yaml | 75 + Documentation/Issue-62/Diagrams/.c4s/C4.puml | 1682 +++++++++++++++++ .../Issue-62/Diagrams/.c4s/C4_Component.puml | 83 + .../Issue-62/Diagrams/.c4s/C4_Container.puml | 103 + .../Issue-62/Diagrams/.c4s/C4_Context.puml | 434 +++++ .../Issue-62/Diagrams/.c4s/C4_Deployment.puml | 140 ++ .../Issue-62/Diagrams/.c4s/C4_Sequence.puml | 406 ++++ .../Development/Container - C4 Deployment.png | Bin 0 -> 96606 bytes .../Container - C4 Deployment.puml | 38 + .../Live/Container - C4 Deployment.png | Bin 0 -> 155413 bytes .../Live/Container - C4 Deployment.puml | 61 + Documentation/Issue-62/README.md | 282 +++ .../SoftwareSystems/EMailSystem.yaml | 6 +- .../SoftwareSystems/InternetBanking.yaml | 46 +- .../MainframeBankingSystem.yaml | 10 +- .../Container - C4 Sequence.png | Bin 101906 -> 104556 bytes .../Container - C4 Sequence.puml | 22 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 76278 -> 78722 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 2 +- .../Complete (End-To-End)/Container - C4.png | Bin 93149 -> 95679 bytes .../Complete (End-To-End)/Container - C4.puml | 10 +- .../Complete (End-To-End)/Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 119670 -> 121897 bytes .../Container - Sequence.puml | 16 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 51502 -> 53851 bytes .../Context - C4 Sequence.puml | 16 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 27972 -> 29380 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../Complete (End-To-End)/Context - C4.png | Bin 36639 -> 39581 bytes .../Complete (End-To-End)/Context - C4.puml | 4 +- .../Complete (End-To-End)/Context - C4.svg | 2 +- .../Context - Sequence.png | Bin 51441 -> 53591 bytes .../Context - Sequence.puml | 14 +- .../Context - Sequence.svg | 2 +- .../Container - C4 Sequence.png | Bin 65726 -> 67075 bytes .../Container - C4 Sequence.puml | 14 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 64721 -> 68094 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 2 +- .../Create New Account/Container - C4.png | Bin 77126 -> 81100 bytes .../Create New Account/Container - C4.puml | 10 +- .../Create New Account/Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 69934 -> 70951 bytes .../Container - Sequence.puml | 8 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 37241 -> 38256 bytes .../Context - C4 Sequence.puml | 8 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 27700 -> 29152 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../Create New Account/Context - C4.png | Bin 33315 -> 35282 bytes .../Create New Account/Context - C4.puml | 4 +- .../Create New Account/Context - C4.svg | 2 +- .../Create New Account/Context - Sequence.png | Bin 32956 -> 34080 bytes .../Context - Sequence.puml | 6 +- .../Create New Account/Context - Sequence.svg | 2 +- .../Big Bank Plc/Container - C4 Static.png | Bin 58018 -> 59671 bytes .../Big Bank Plc/Container - C4 Static.puml | 10 +- .../Big Bank Plc/Container - C4 Static.svg | 2 +- .../Diagrams/Big Bank Plc/Container - C4.png | Bin 69968 -> 72397 bytes .../Diagrams/Big Bank Plc/Container - C4.puml | 10 +- .../Diagrams/Big Bank Plc/Container - C4.svg | 2 +- .../Big Bank Plc/Context - C4 Static.png | Bin 16867 -> 18540 bytes .../Big Bank Plc/Context - C4 Static.puml | 4 +- .../Big Bank Plc/Context - C4 Static.svg | 2 +- .../Diagrams/Big Bank Plc/Context - C4.png | Bin 20546 -> 22346 bytes .../Diagrams/Big Bank Plc/Context - C4.puml | 4 +- .../Diagrams/Big Bank Plc/Context - C4.svg | 2 +- .../Container - C4 Static.png | Bin 58019 -> 59673 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 2 +- .../Software Systems/Container - C4.png | Bin 69969 -> 72398 bytes .../Software Systems/Container - C4.puml | 10 +- .../Software Systems/Container - C4.svg | 2 +- .../Software Systems/Context - C4 Static.png | Bin 16868 -> 18541 bytes .../Software Systems/Context - C4 Static.puml | 4 +- .../Software Systems/Context - C4 Static.svg | 2 +- .../Software Systems/Context - C4.png | Bin 20547 -> 22347 bytes .../Software Systems/Context - C4.puml | 4 +- .../Software Systems/Context - C4.svg | 2 +- .../Container - C4 Static.png | Bin 58243 -> 59904 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 2 +- .../Internet Banking/Container - C4.png | Bin 70178 -> 72598 bytes .../Internet Banking/Container - C4.puml | 10 +- .../Internet Banking/Container - C4.svg | 2 +- .../API Application/Container - C4 Static.png | Bin 33528 -> 36310 bytes .../Container - C4 Static.puml | 8 +- .../API Application/Container - C4 Static.svg | 2 +- .../API Application/Container - C4.png | Bin 39519 -> 41266 bytes .../API Application/Container - C4.puml | 8 +- .../API Application/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 23358 -> 23576 bytes .../Container - C4 Sequence.puml | 4 +- .../Container - C4 Sequence.svg | 2 +- .../Change Password/Container - C4 Static.png | Bin 32196 -> 32441 bytes .../Container - C4 Static.puml | 4 +- .../Change Password/Container - C4 Static.svg | 2 +- .../Change Password/Container - C4.png | Bin 33018 -> 33246 bytes .../Change Password/Container - C4.puml | 4 +- .../Change Password/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 21426 -> 21821 bytes .../Container - C4 Sequence.puml | 6 +- .../Container - C4 Sequence.svg | 2 +- .../Create Account/Container - C4 Static.png | Bin 25853 -> 27997 bytes .../Create Account/Container - C4 Static.puml | 6 +- .../Create Account/Container - C4 Static.svg | 2 +- .../Create Account/Container - C4.png | Bin 26403 -> 28452 bytes .../Create Account/Container - C4.puml | 6 +- .../Create Account/Container - C4.svg | 2 +- .../Create Account/Container - Sequence.png | Bin 17565 -> 17854 bytes .../Create Account/Container - Sequence.puml | 2 +- .../Create Account/Container - Sequence.svg | 2 +- .../Create Account/Context - C4 Sequence.png | Bin 16985 -> 17391 bytes .../Create Account/Context - C4 Sequence.puml | 4 +- .../Create Account/Context - C4 Sequence.svg | 2 +- .../Create Account/Context - C4 Static.png | Bin 19889 -> 21835 bytes .../Create Account/Context - C4 Static.puml | 4 +- .../Create Account/Context - C4 Static.svg | 2 +- .../Create Account/Context - C4.png | Bin 20272 -> 22319 bytes .../Create Account/Context - C4.puml | 4 +- .../Create Account/Context - C4.svg | 2 +- .../Create Account/Context - Sequence.png | Bin 14435 -> 14719 bytes .../Create Account/Context - Sequence.puml | 2 +- .../Create Account/Context - Sequence.svg | 2 +- .../Container - C4 Sequence.png | Bin 19084 -> 19499 bytes .../Container - C4 Sequence.puml | 6 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 21629 -> 25601 bytes .../Container - C4 Static.puml | 6 +- .../Container - C4 Static.svg | 2 +- .../Container - C4.png | Bin 21912 -> 25842 bytes .../Container - C4.puml | 6 +- .../Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 15547 -> 15823 bytes .../Container - Sequence.puml | 2 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 14696 -> 15106 bytes .../Context - C4 Sequence.puml | 4 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 15559 -> 19437 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../Get Account Transactions/Context - C4.png | Bin 15898 -> 19695 bytes .../Context - C4.puml | 4 +- .../Get Account Transactions/Context - C4.svg | 2 +- .../Context - Sequence.png | Bin 12725 -> 13013 bytes .../Context - Sequence.puml | 2 +- .../Context - Sequence.svg | 2 +- .../Container - C4 Sequence.png | Bin 19105 -> 19535 bytes .../Container - C4 Sequence.puml | 6 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 21638 -> 25602 bytes .../Container - C4 Static.puml | 6 +- .../Container - C4 Static.svg | 1 + .../Get Customer Accounts/Container - C4.png | Bin 21945 -> 25859 bytes .../Get Customer Accounts/Container - C4.puml | 6 +- .../Get Customer Accounts/Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 15707 -> 15990 bytes .../Container - Sequence.puml | 2 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 14716 -> 15122 bytes .../Context - C4 Sequence.puml | 4 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 15562 -> 19452 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../Get Customer Accounts/Context - C4.png | Bin 15769 -> 19500 bytes .../Get Customer Accounts/Context - C4.puml | 4 +- .../Get Customer Accounts/Context - C4.svg | 2 +- .../Context - Sequence.png | Bin 12923 -> 13210 bytes .../Context - Sequence.puml | 2 +- .../Context - Sequence.svg | 2 +- .../Get Customer/Container - C4 Sequence.png | Bin 18159 -> 18552 bytes .../Get Customer/Container - C4 Sequence.puml | 6 +- .../Get Customer/Container - C4 Sequence.svg | 2 +- .../Get Customer/Container - C4 Static.png | Bin 20890 -> 24748 bytes .../Get Customer/Container - C4 Static.puml | 6 +- .../Get Customer/Container - C4 Static.svg | 2 +- .../Get Customer/Container - C4.png | Bin 20860 -> 24297 bytes .../Get Customer/Container - C4.puml | 6 +- .../Get Customer/Container - C4.svg | 2 +- .../Get Customer/Container - Sequence.png | Bin 14026 -> 14414 bytes .../Get Customer/Container - Sequence.puml | 2 +- .../Get Customer/Container - Sequence.svg | 2 +- .../Get Customer/Context - C4 Sequence.png | Bin 13877 -> 14285 bytes .../Get Customer/Context - C4 Sequence.puml | 4 +- .../Get Customer/Context - C4 Sequence.svg | 2 +- .../Get Customer/Context - C4 Static.png | Bin 15048 -> 18782 bytes .../Get Customer/Context - C4 Static.puml | 4 +- .../Get Customer/Context - C4 Static.svg | 2 +- .../Interfaces/Get Customer/Context - C4.png | Bin 14908 -> 18259 bytes .../Interfaces/Get Customer/Context - C4.puml | 4 +- .../Interfaces/Get Customer/Context - C4.svg | 2 +- .../Get Customer/Context - Sequence.png | Bin 11494 -> 11775 bytes .../Get Customer/Context - Sequence.puml | 2 +- .../Get Customer/Context - Sequence.svg | 2 +- .../Sign In/Container - C4 Sequence.png | Bin 17428 -> 17761 bytes .../Sign In/Container - C4 Sequence.puml | 4 +- .../Sign In/Container - C4 Sequence.svg | 2 +- .../Sign In/Container - C4 Static.png | Bin 24944 -> 25173 bytes .../Sign In/Container - C4 Static.puml | 4 +- .../Sign In/Container - C4 Static.svg | 2 +- .../Interfaces/Sign In/Container - C4.png | Bin 24720 -> 24968 bytes .../Interfaces/Sign In/Container - C4.puml | 4 +- .../Interfaces/Sign In/Container - C4.svg | 2 +- .../Database/Container - C4 Static.png | Bin 16969 -> 17156 bytes .../Database/Container - C4 Static.puml | 2 +- .../Database/Container - C4 Static.svg | 2 +- .../Containers/Database/Container - C4.png | Bin 16555 -> 16724 bytes .../Containers/Database/Container - C4.puml | 2 +- .../Containers/Database/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 14667 -> 14849 bytes .../Container - C4 Sequence.puml | 2 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 18376 -> 18559 bytes .../Container - C4 Static.puml | 2 +- .../Container - C4 Static.svg | 2 +- .../Authenticate User/Container - C4.png | Bin 17712 -> 17900 bytes .../Authenticate User/Container - C4.puml | 2 +- .../Authenticate User/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 14498 -> 14669 bytes .../Container - C4 Sequence.puml | 2 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 18200 -> 18383 bytes .../Container - C4 Static.puml | 2 +- .../Container - C4 Static.svg | 2 +- .../Select User Data/Container - C4.png | Bin 17393 -> 17583 bytes .../Select User Data/Container - C4.puml | 2 +- .../Select User Data/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 15125 -> 15323 bytes .../Container - C4 Sequence.puml | 2 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 18848 -> 19033 bytes .../Container - C4 Static.puml | 2 +- .../Container - C4 Static.svg | 2 +- .../Update User Password/Container - C4.png | Bin 18294 -> 18477 bytes .../Update User Password/Container - C4.puml | 2 +- .../Update User Password/Container - C4.svg | 2 +- .../Mobile App/Container - C4 Static.png | Bin 43011 -> 45657 bytes .../Mobile App/Container - C4 Static.puml | 8 +- .../Mobile App/Container - C4 Static.svg | 2 +- .../Containers/Mobile App/Container - C4.png | Bin 48975 -> 51147 bytes .../Containers/Mobile App/Container - C4.puml | 8 +- .../Containers/Mobile App/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 26239 -> 26451 bytes .../Container - C4 Sequence.puml | 4 +- .../Container - C4 Sequence.svg | 2 +- .../Change Password/Container - C4 Static.png | Bin 40569 -> 40801 bytes .../Container - C4 Static.puml | 4 +- .../Change Password/Container - C4 Static.svg | 2 +- .../Change Password/Container - C4.png | Bin 41862 -> 42082 bytes .../Change Password/Container - C4.puml | 4 +- .../Change Password/Container - C4.svg | 2 +- .../Sign In/Container - C4 Sequence.png | Bin 19832 -> 20068 bytes .../Sign In/Container - C4 Sequence.puml | 4 +- .../Sign In/Container - C4 Sequence.svg | 2 +- .../Sign In/Container - C4 Static.png | Bin 32219 -> 32468 bytes .../Sign In/Container - C4 Static.puml | 4 +- .../Sign In/Container - C4 Static.svg | 2 +- .../Interfaces/Sign In/Container - C4.png | Bin 32456 -> 32698 bytes .../Interfaces/Sign In/Container - C4.puml | 4 +- .../Interfaces/Sign In/Container - C4.svg | 2 +- .../Container - C4 Sequence.png | Bin 23066 -> 23578 bytes .../Container - C4 Sequence.puml | 6 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 30852 -> 34771 bytes .../Container - C4 Static.puml | 6 +- .../Container - C4 Static.svg | 2 +- .../Container - C4.png | Bin 32244 -> 36112 bytes .../Container - C4.puml | 6 +- .../Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 20341 -> 20619 bytes .../Container - Sequence.puml | 2 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 15314 -> 15723 bytes .../Context - C4 Sequence.puml | 4 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 15771 -> 19641 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../Context - C4.png | Bin 15869 -> 19632 bytes .../Context - C4.puml | 4 +- .../Context - C4.svg | 2 +- .../Context - Sequence.png | Bin 13197 -> 13489 bytes .../Context - Sequence.puml | 2 +- .../Context - Sequence.svg | 2 +- .../Container - C4 Sequence.png | Bin 26579 -> 27344 bytes .../Container - C4 Sequence.puml | 8 +- .../Container - C4 Sequence.svg | 2 +- .../Container - C4 Static.png | Bin 30748 -> 34659 bytes .../Container - C4 Static.puml | 6 +- .../Container - C4 Static.svg | 2 +- .../View Customer Details/Container - C4.png | Bin 31980 -> 35776 bytes .../View Customer Details/Container - C4.puml | 6 +- .../View Customer Details/Container - C4.svg | 2 +- .../Container - Sequence.png | Bin 25320 -> 25889 bytes .../Container - Sequence.puml | 4 +- .../Container - Sequence.svg | 2 +- .../Context - C4 Sequence.png | Bin 16752 -> 17501 bytes .../Context - C4 Sequence.puml | 6 +- .../Context - C4 Sequence.svg | 2 +- .../Context - C4 Static.png | Bin 15646 -> 19490 bytes .../Context - C4 Static.puml | 4 +- .../Context - C4 Static.svg | 2 +- .../View Customer Details/Context - C4.png | Bin 16005 -> 19705 bytes .../View Customer Details/Context - C4.puml | 4 +- .../View Customer Details/Context - C4.svg | 2 +- .../Context - Sequence.png | Bin 14865 -> 15440 bytes .../Context - Sequence.puml | 4 +- .../Context - Sequence.svg | 2 +- .../Single-Page App/Container - C4 Static.png | Bin 42443 -> 0 bytes .../Single-Page App/Container - C4 Static.svg | 1 - .../Single-Page App/Container - C4.png | Bin 51958 -> 0 bytes .../Single-Page App/Container - C4.svg | 1 - .../Container - C4 Sequence.png | Bin 26919 -> 0 bytes .../Container - C4 Sequence.svg | 1 - .../Change Password/Container - C4 Static.png | Bin 41635 -> 0 bytes .../Change Password/Container - C4 Static.svg | 1 - .../Change Password/Container - C4.png | Bin 43528 -> 0 bytes .../Change Password/Container - C4.svg | 1 - .../Change Password/Container - Sequence.png | Bin 26422 -> 0 bytes .../Change Password/Container - Sequence.svg | 1 - .../Change Password/Context - C4 Sequence.png | Bin 15256 -> 0 bytes .../Change Password/Context - C4 Sequence.svg | 1 - .../Change Password/Context - C4 Static.png | Bin 16720 -> 0 bytes .../Change Password/Context - C4 Static.svg | 1 - .../Change Password/Context - C4.png | Bin 17665 -> 0 bytes .../Change Password/Context - C4.svg | 1 - .../Change Password/Context - Sequence.png | Bin 13186 -> 0 bytes .../Change Password/Context - Sequence.svg | 1 - .../Container - C4 Sequence.png | Bin 25718 -> 0 bytes .../Container - C4 Sequence.svg | 1 - .../Create Account/Container - C4 Static.png | Bin 35607 -> 0 bytes .../Create Account/Container - C4 Static.svg | 1 - .../Create Account/Container - C4.png | Bin 36369 -> 0 bytes .../Create Account/Container - C4.svg | 1 - .../Create Account/Container - Sequence.png | Bin 21700 -> 0 bytes .../Create Account/Container - Sequence.svg | 1 - .../Create Account/Context - C4 Sequence.png | Bin 17058 -> 0 bytes .../Create Account/Context - C4 Sequence.svg | 1 - .../Create Account/Context - C4 Static.png | Bin 20010 -> 0 bytes .../Create Account/Context - C4 Static.svg | 1 - .../Create Account/Context - C4.png | Bin 20429 -> 0 bytes .../Create Account/Context - C4.svg | 1 - .../Create Account/Context - Sequence.png | Bin 14708 -> 0 bytes .../Create Account/Context - Sequence.svg | 1 - .../Container - C4 Sequence.png | Bin 14949 -> 0 bytes .../Container - C4 Sequence.svg | 1 - .../Load And Start/Container - C4 Static.png | Bin 18117 -> 0 bytes .../Load And Start/Container - C4 Static.svg | 1 - .../Load And Start/Container - C4.png | Bin 17612 -> 0 bytes .../Load And Start/Container - C4.svg | 1 - .../Load And Start/Container - Sequence.png | Bin 9312 -> 0 bytes .../Load And Start/Container - Sequence.svg | 1 - .../Load And Start/Context - C4 Sequence.png | Bin 10604 -> 0 bytes .../Load And Start/Context - C4 Sequence.svg | 1 - .../Load And Start/Context - C4 Static.png | Bin 10076 -> 0 bytes .../Load And Start/Context - C4 Static.svg | 1 - .../Load And Start/Context - C4.png | Bin 9724 -> 0 bytes .../Load And Start/Context - C4.svg | 1 - .../Load And Start/Context - Sequence.png | Bin 7029 -> 0 bytes .../Load And Start/Context - Sequence.svg | 1 - .../Sign In/Container - C4 Sequence.png | Bin 20235 -> 0 bytes .../Sign In/Container - C4 Sequence.svg | 1 - .../Sign In/Container - C4 Static.png | Bin 33949 -> 0 bytes .../Sign In/Container - C4 Static.svg | 1 - .../Interfaces/Sign In/Container - C4.png | Bin 33165 -> 0 bytes .../Interfaces/Sign In/Container - C4.svg | 1 - .../Sign In/Container - Sequence.png | Bin 18423 -> 0 bytes .../Sign In/Container - Sequence.svg | 1 - .../Sign In/Context - C4 Sequence.png | Bin 9903 -> 0 bytes .../Sign In/Context - C4 Sequence.svg | 1 - .../Sign In/Context - C4 Static.png | Bin 9657 -> 0 bytes .../Sign In/Context - C4 Static.svg | 1 - .../Interfaces/Sign In/Context - C4.png | Bin 9482 -> 0 bytes .../Interfaces/Sign In/Context - C4.svg | 1 - .../Interfaces/Sign In/Context - Sequence.png | Bin 6436 -> 0 bytes .../Interfaces/Sign In/Context - Sequence.svg | 1 - .../Container - C4 Sequence.png | Bin 23564 -> 0 bytes .../Container - C4 Sequence.svg | 1 - .../Container - C4 Static.png | Bin 31343 -> 0 bytes .../Container - C4 Static.svg | 1 - .../Container - C4.png | Bin 32623 -> 0 bytes .../Container - C4.svg | 1 - .../Container - Sequence.png | Bin 20459 -> 0 bytes .../Container - Sequence.svg | 1 - .../Context - C4 Sequence.png | Bin 15338 -> 0 bytes .../Context - C4 Sequence.svg | 1 - .../Context - C4 Static.png | Bin 15768 -> 0 bytes .../Context - C4 Static.svg | 1 - .../Context - C4.png | Bin 16172 -> 0 bytes .../Context - C4.svg | 1 - .../Context - Sequence.png | Bin 13240 -> 0 bytes .../Context - Sequence.svg | 1 - .../Container - C4 Sequence.png | Bin 26970 -> 0 bytes .../Container - C4 Sequence.svg | 1 - .../Container - C4 Static.png | Bin 31212 -> 0 bytes .../Container - C4 Static.svg | 1 - .../View Customer Details/Container - C4.png | Bin 32745 -> 0 bytes .../View Customer Details/Container - C4.svg | 1 - .../Container - Sequence.png | Bin 25368 -> 0 bytes .../Container - Sequence.svg | 1 - .../Context - C4 Sequence.png | Bin 16801 -> 0 bytes .../Context - C4 Sequence.svg | 1 - .../Context - C4 Static.png | Bin 15713 -> 0 bytes .../Context - C4 Static.svg | 1 - .../View Customer Details/Context - C4.png | Bin 16158 -> 0 bytes .../View Customer Details/Context - C4.svg | 1 - .../Context - Sequence.png | Bin 14897 -> 0 bytes .../Context - Sequence.svg | 1 - .../Container - C4 Static.png | Bin 0 -> 45742 bytes .../Container - C4 Static.puml | 12 +- .../Container - C4 Static.svg | 1 + .../Container - C4.png | Bin 0 -> 53209 bytes .../Container - C4.puml | 12 +- .../Container - C4.svg | 1 + .../Container - C4 Sequence.png | Bin 0 -> 27363 bytes .../Container - C4 Sequence.puml | 8 +- .../Container - C4 Sequence.svg | 1 + .../Change Password/Container - C4 Static.png | Bin 0 -> 42355 bytes .../Container - C4 Static.puml | 8 +- .../Change Password/Container - C4 Static.svg | 1 + .../Change Password/Container - C4.png | Bin 0 -> 45194 bytes .../Change Password/Container - C4.puml | 8 +- .../Change Password/Container - C4.svg | 1 + .../Change Password/Container - Sequence.png | Bin 0 -> 26780 bytes .../Change Password/Container - Sequence.puml | 4 +- .../Change Password/Container - Sequence.svg | 1 + .../Change Password/Context - C4 Sequence.png | Bin 0 -> 15434 bytes .../Context - C4 Sequence.puml | 2 +- .../Change Password/Context - C4 Sequence.svg | 1 + .../Change Password/Context - C4 Static.png | Bin 0 -> 16920 bytes .../Change Password/Context - C4 Static.puml | 2 +- .../Change Password/Context - C4 Static.svg | 1 + .../Change Password/Context - C4.png | Bin 0 -> 18190 bytes .../Change Password/Context - C4.puml | 2 +- .../Change Password/Context - C4.svg | 1 + .../Change Password/Context - Sequence.png | Bin 0 -> 13409 bytes .../Change Password/Context - Sequence.puml | 2 +- .../Change Password/Context - Sequence.svg | 1 + .../Container - C4 Sequence.png | Bin 0 -> 26324 bytes .../Container - C4 Sequence.puml | 10 +- .../Container - C4 Sequence.svg | 1 + .../Create Account/Container - C4 Static.png | Bin 0 -> 38500 bytes .../Create Account/Container - C4 Static.puml | 10 +- .../Create Account/Container - C4 Static.svg | 1 + .../Create Account/Container - C4.png | Bin 0 -> 40081 bytes .../Create Account/Container - C4.puml | 10 +- .../Create Account/Container - C4.svg | 1 + .../Create Account/Container - Sequence.png | Bin 0 -> 22102 bytes .../Create Account/Container - Sequence.puml | 6 +- .../Create Account/Container - Sequence.svg | 1 + .../Create Account/Context - C4 Sequence.png | Bin 0 -> 17988 bytes .../Create Account/Context - C4 Sequence.puml | 6 +- .../Create Account/Context - C4 Sequence.svg | 1 + .../Create Account/Context - C4 Static.png | Bin 0 -> 22700 bytes .../Create Account/Context - C4 Static.puml | 6 +- .../Create Account/Context - C4 Static.svg | 1 + .../Create Account/Context - C4.png | Bin 0 -> 23666 bytes .../Create Account/Context - C4.puml | 6 +- .../Create Account/Context - C4.svg | 1 + .../Create Account/Context - Sequence.png | Bin 0 -> 15381 bytes .../Create Account/Context - Sequence.puml | 4 +- .../Create Account/Context - Sequence.svg | 1 + .../Container - C4 Sequence.png | Bin 0 -> 15519 bytes .../Container - C4 Sequence.puml | 4 +- .../Container - C4 Sequence.svg | 1 + .../Load And Start/Container - C4 Static.png | Bin 0 -> 18840 bytes .../Load And Start/Container - C4 Static.puml | 4 +- .../Load And Start/Container - C4 Static.svg | 1 + .../Load And Start/Container - C4.png | Bin 0 -> 18585 bytes .../Load And Start/Container - C4.puml | 4 +- .../Load And Start/Container - C4.svg | 1 + .../Load And Start/Container - Sequence.png | Bin 0 -> 9799 bytes .../Load And Start/Container - Sequence.puml | 4 +- .../Load And Start/Container - Sequence.svg | 1 + .../Load And Start/Context - C4 Sequence.png | Bin 0 -> 10770 bytes .../Load And Start/Context - C4 Sequence.puml | 2 +- .../Load And Start/Context - C4 Static.png | Bin 0 -> 10347 bytes .../Load And Start/Context - C4 Static.puml | 2 +- .../Load And Start/Context - C4 Static.svg | 1 + .../Load And Start/Context - C4.png | Bin 0 -> 10136 bytes .../Load And Start}/Context - C4.puml | 2 +- .../Load And Start/Context - C4.svg | 1 + .../Load And Start/Context - Sequence.png | Bin 0 -> 7282 bytes .../Load And Start/Context - Sequence.puml | 2 +- .../Load And Start/Context - Sequence.svg | 1 + .../Sign In/Container - C4 Sequence.png | Bin 0 -> 20891 bytes .../Sign In/Container - C4 Sequence.puml | 8 +- .../Sign In/Container - C4 Sequence.svg | 1 + .../Sign In/Container - C4 Static.png | Bin 0 -> 35715 bytes .../Sign In/Container - C4 Static.puml | 8 +- .../Sign In/Container - C4 Static.svg | 1 + .../Interfaces/Sign In/Container - C4.png | Bin 0 -> 35331 bytes .../Interfaces/Sign In/Container - C4.puml | 8 +- .../Interfaces/Sign In/Container - C4.svg | 1 + .../Sign In/Container - Sequence.png | Bin 0 -> 19225 bytes .../Sign In/Container - Sequence.puml | 4 +- .../Sign In/Container - Sequence.svg | 1 + .../Sign In/Context - C4 Sequence.png | Bin 0 -> 10178 bytes .../Sign In/Context - C4 Sequence.puml | 2 +- .../Sign In/Context - C4 Sequence.svg | 1 + .../Sign In/Context - C4 Static.png | Bin 0 -> 9999 bytes .../Sign In/Context - C4 Static.puml | 2 +- .../Sign In/Context - C4 Static.svg | 1 + .../Interfaces/Sign In/Context - C4.png | Bin 0 -> 9659 bytes .../Interfaces/Sign In}/Context - C4.puml | 2 +- .../Interfaces/Sign In/Context - C4.svg | 1 + .../Interfaces/Sign In/Context - Sequence.png | Bin 0 -> 6592 bytes .../Sign In/Context - Sequence.puml | 2 +- .../Interfaces/Sign In/Context - Sequence.svg | 1 + .../Container - C4 Sequence.png | Bin 0 -> 24012 bytes .../Container - C4 Sequence.puml | 10 +- .../Container - C4 Sequence.svg | 1 + .../Container - C4 Static.png | Bin 0 -> 35975 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 1 + .../Container - C4.png | Bin 0 -> 37355 bytes .../Container - C4.puml | 10 +- .../Container - C4.svg | 1 + .../Container - Sequence.png | Bin 0 -> 21027 bytes .../Container - Sequence.puml | 6 +- .../Container - Sequence.svg | 1 + .../Context - C4 Sequence.png | Bin 0 -> 15906 bytes .../Context - C4 Sequence.puml | 6 +- .../Context - C4 Sequence.svg | 1 + .../Context - C4 Static.png | Bin 0 -> 19814 bytes .../Context - C4 Static.puml | 6 +- .../Context - C4 Static.svg | 1 + .../Context - C4.png | Bin 0 -> 20264 bytes .../Context - C4.puml | 6 +- .../Context - C4.svg | 1 + .../Context - Sequence.png | Bin 0 -> 13699 bytes .../Context - Sequence.puml | 4 +- .../Context - Sequence.svg | 1 + .../Container - C4 Sequence.png | Bin 0 -> 27910 bytes .../Container - C4 Sequence.puml | 12 +- .../Container - C4 Sequence.svg | 1 + .../Container - C4 Static.png | Bin 0 -> 35907 bytes .../Container - C4 Static.puml | 10 +- .../Container - C4 Static.svg | 1 + .../View Customer Details/Container - C4.png | Bin 0 -> 38917 bytes .../View Customer Details/Container - C4.puml | 10 +- .../View Customer Details/Container - C4.svg | 1 + .../Container - Sequence.png | Bin 0 -> 26274 bytes .../Container - Sequence.puml | 8 +- .../Container - Sequence.svg | 1 + .../Context - C4 Sequence.png | Bin 0 -> 17813 bytes .../Context - C4 Sequence.puml | 8 +- .../Context - C4 Sequence.svg | 1 + .../Context - C4 Static.png | Bin 0 -> 19856 bytes .../Context - C4 Static.puml | 6 +- .../Context - C4 Static.svg | 1 + .../View Customer Details/Context - C4.png | Bin 0 -> 21100 bytes .../View Customer Details/Context - C4.puml | 6 +- .../View Customer Details/Context - C4.svg | 1 + .../Context - Sequence.png | Bin 0 -> 15699 bytes .../Context - Sequence.puml | 6 +- .../Context - Sequence.svg | 1 + .../Web Application/Container - C4 Static.png | Bin 24091 -> 24358 bytes .../Container - C4 Static.puml | 2 +- .../Web Application/Container - C4 Static.svg | 2 +- .../Web Application/Container - C4.png | Bin 24168 -> 24435 bytes .../Web Application/Container - C4.puml | 2 +- .../Web Application/Container - C4.svg | 2 +- .../Navigate/Container - C4 Sequence.png | Bin 18005 -> 18069 bytes .../Navigate/Container - C4 Sequence.puml | 2 +- .../Navigate/Container - C4 Sequence.svg | 2 +- .../Navigate/Container - C4 Static.png | Bin 25393 -> 25673 bytes .../Navigate/Container - C4 Static.puml | 2 +- .../Navigate/Container - C4 Static.svg | 2 +- .../Interfaces/Navigate/Container - C4.png | Bin 24605 -> 24866 bytes .../Interfaces/Navigate/Container - C4.puml | 2 +- .../Interfaces/Navigate/Container - C4.svg | 2 +- .../Navigate/Container - Sequence.png | Bin 12901 -> 12938 bytes .../Navigate/Container - Sequence.puml | 2 +- .../Navigate/Container - Sequence.svg | 2 +- .../Internet Banking/Context - C4 Static.png | Bin 17413 -> 18854 bytes .../Internet Banking/Context - C4 Static.puml | 4 +- .../Internet Banking/Context - C4 Static.svg | 2 +- .../Internet Banking/Context - C4.png | Bin 20713 -> 22514 bytes .../Internet Banking/Context - C4.puml | 4 +- .../Internet Banking/Context - C4.svg | 2 +- .../Yaml/Diagrams/Container - C4 Static.png | Bin 58353 -> 60008 bytes .../Yaml/Diagrams/Container - C4 Static.puml | 10 +- .../Yaml/Diagrams/Container - C4 Static.svg | 2 +- .../Yaml/Diagrams/Container - C4.png | Bin 70354 -> 72767 bytes .../Yaml/Diagrams/Container - C4.puml | 10 +- .../Yaml/Diagrams/Container - C4.svg | 2 +- .../Yaml/Diagrams/Context - C4 Static.png | Bin 17181 -> 18854 bytes .../Yaml/Diagrams/Context - C4 Static.puml | 4 +- .../Yaml/Diagrams/Context - C4 Static.svg | 2 +- .../Yaml/Diagrams/Context - C4.png | Bin 20857 -> 22664 bytes .../Yaml/Diagrams/Context - C4.puml | 4 +- .../Yaml/Diagrams/Context - C4.svg | 2 +- 604 files changed, 3983 insertions(+), 643 deletions(-) create mode 100644 Documentation/Issue-62/Architecture/Environments/Development.yaml create mode 100644 Documentation/Issue-62/Architecture/Environments/Live.yaml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4.puml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4_Component.puml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4_Container.puml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4_Context.puml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4_Deployment.puml create mode 100644 Documentation/Issue-62/Diagrams/.c4s/C4_Sequence.puml create mode 100644 Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.png create mode 100644 Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.puml create mode 100644 Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Live/Container - C4 Deployment.png create mode 100644 Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Live/Container - C4 Deployment.puml create mode 100644 Documentation/Issue-62/README.md create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/API Application/Interfaces/Get Customer Accounts/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Change Password/Context - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Create Account/Context - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Load And Start/Context - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/Sign In/Context - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Account Transactions/Context - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Container - Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4 Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4 Sequence.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4 Static.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4 Static.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - C4.svg delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - Sequence.png delete mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page App/Interfaces/View Customer Details/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Container - C4 Static.puml (73%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Container - C4.puml (76%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Container - C4 Sequence.puml (69%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Container - C4 Static.puml (76%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Container - C4.puml (77%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Container - Sequence.puml (83%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Context - C4 Sequence.puml (84%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Context - C4 Static.puml (90%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Context - C4.puml (91%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Change Password/Context - Sequence.puml (82%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Change Password/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Container - C4 Sequence.puml (68%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Container - C4 Static.puml (74%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Container - C4.puml (75%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Container - Sequence.puml (80%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Context - C4 Sequence.puml (71%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Context - C4 Static.puml (79%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Context - C4.puml (80%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Create Account/Context - Sequence.puml (79%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Create Account/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Container - C4 Sequence.puml (62%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Container - C4 Static.puml (77%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Container - C4.puml (77%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Container - Sequence.puml (54%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Context - C4 Sequence.puml (76%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Context - C4 Static.puml (88%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App/Interfaces/Sign In => Single-Page Application/Interfaces/Load And Start}/Context - C4.puml (89%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Load And Start/Context - Sequence.puml (71%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Load And Start/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Container - C4 Sequence.puml (64%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Container - C4 Static.puml (73%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Container - C4.puml (74%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Container - Sequence.puml (79%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Context - C4 Sequence.puml (77%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Context - C4 Static.puml (89%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App/Interfaces/Load And Start => Single-Page Application/Interfaces/Sign In}/Context - C4.puml (90%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/Sign In/Context - Sequence.puml (72%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/Sign In/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Container - C4 Sequence.puml (62%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Container - C4 Static.puml (70%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Container - C4.puml (70%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Container - Sequence.puml (76%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Context - C4 Sequence.puml (69%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App/Interfaces/View Customer Details => Single-Page Application/Interfaces/View Account Transactions}/Context - C4 Static.puml (75%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Context - C4.puml (79%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Account Transactions/Context - Sequence.puml (71%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Account Transactions/Context - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Container - C4 Sequence.puml (67%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Container - C4 Static.puml (71%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Container - C4.puml (70%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Container - Sequence.puml (80%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Container - Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4 Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Context - C4 Sequence.puml (60%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4 Sequence.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4 Static.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App/Interfaces/View Account Transactions => Single-Page Application/Interfaces/View Customer Details}/Context - C4 Static.puml (75%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4 Static.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Context - C4.puml (79%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - C4.svg create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - Sequence.png rename Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/{Single-Page App => Single-Page Application}/Interfaces/View Customer Details/Context - Sequence.puml (68%) create mode 100644 Samples/Internet Banking System/Yaml/Diagrams/Big Bank Plc/Software Systems/Internet Banking/Containers/Single-Page Application/Interfaces/View Customer Details/Context - Sequence.svg diff --git a/Documentation/Issue-62/Architecture/Environments/Development.yaml b/Documentation/Issue-62/Architecture/Environments/Development.yaml new file mode 100644 index 000000000..cc758382a --- /dev/null +++ b/Documentation/Issue-62/Architecture/Environments/Development.yaml @@ -0,0 +1,36 @@ +BigBankPlc: + Environments: + Development: + Nodes: + DeveloperLaptop: + Type: Microsoft Windows 10 or Apple macOS + Nodes: + WebBrowser: + Type: Chrome, Firefox, Safari, or Edge + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp + DockerContainerWebServer: + Label: Docker Container - Web Server + Type: Docker + Nodes: + ApacheTomcat: + Type: Apache Tomcat 8.x + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication + DockerContainerDatabaseServer: + Type: Docker + Label: Docker Container - Database Server + Nodes: + DatabaseServer: + Type: Oracle 12c + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.Database + BigBankPlc: + Label: Big Bank plc + Type: Big Bank plc data center + Nodes: + BigBankDev001: + Deployments: + - BigBankPlc.SoftwareSystems.MainframeBankingSystem + diff --git a/Documentation/Issue-62/Architecture/Environments/Live.yaml b/Documentation/Issue-62/Architecture/Environments/Live.yaml new file mode 100644 index 000000000..96007b54d --- /dev/null +++ b/Documentation/Issue-62/Architecture/Environments/Live.yaml @@ -0,0 +1,75 @@ +BigBankPlc: + Environments: + Live: + Nodes: + CustomerMobileDevice: + Label: Customer's mobile device + Type: Apple iOS or Android + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp + CustomersComputer: + Label: Customer's computer + Type: Microsoft Windows or Apple macOS + Nodes: + WebBrowser: + Type: Chrome, Firefox, Safari, or Edge + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp + BigBankPlc: + Label: Big Bank plc + Type: Big Bank plc data center + Nodes: + BigBankWeb: + Label: bigbank-web*** + Type: Ubuntu 16.04 LTS + NumberOfInstances: 4 + Nodes: + ApacheTomcat: + Type: Apache Tomcat 8.x + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication + BigBankApi: + Label: bigbank-api*** + Type: Ubuntu 16.04 LTS + NumberOfInstances: 8 + Nodes: + ApacheTomcat: + Type: Apache Tomcat 8.x + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication + BigBankDb01: + Label: bigbank-db01 + Type: Ubuntu 16.04 LTS + Interfaces: + ReplicateData: + Flows: + - Type: Use + Expression: BigBankDb02.Interfaces.ReplicateData + Nodes: + PrimaryDatabaseServer: + Label: Oracle - Primary + Type: Oracle 12c + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.Database + BigBankDb02: + Label: bigbank-db02 + Type: Ubuntu 16.04 LTS + Nodes: + SecondaryDatabaseServer: + Label: Oracle - Secondary + Type: Oracle 12c + Deployments: + - BigBankPlc.SoftwareSystems.InternetBanking.Containers.Database + Interfaces: + ReplicateData: {} + BigBankProd001: + Deployments: + - BigBankPlc.SoftwareSystems.MainframeBankingSystem + LoadBalancer: {} + Routes: + - From: BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp.Interfaces.* + Via: BigBankPlc.Environments.Live.Nodes.BigBankPlc.Nodes.LoadBalancer + To: BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication.Interfases.* + - From: BigBankPlc.SoftwareSystems.InternetBanking.Containers.MobileApp.Interfaces.* + Via: BigBankPlc.Environments.Live.Nodes.BigBankPlc.Nodes.LoadBalancer + To: BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication.Interfases.* \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4.puml b/Documentation/Issue-62/Diagrams/.c4s/C4.puml new file mode 100644 index 000000000..86d568047 --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4.puml @@ -0,0 +1,1682 @@ +' C4-PlantUML + +' Global pre-settings +' ################################## +' ENABLE_ALL_PLANT_ELEMENTS +' If ENABLE_ALL_PLANT_ELEMENTS is set BEFORE the first C4_* file is loaded, nearly "all" PlantUML elements can be used like +' Component(StorageA, "Storage A ", $baseShape="storage") +' ENABLE_ALL_PLANT_ELEMENTS can be set via +' !ENABLE_ALL_PLANT_ELEMENTS = 1 +' or with additional command line argument -DENABLE_ALL_PLANT_ELEMENTS=1 + +'Version +' ################################## +!function C4Version() + ' 2 spaces and ' are used as unique marker, that the release scripts makes the correct version update + !$c4Version = "2.10.0beta1" + !return $c4Version +!end function + +!procedure C4VersionDetails() +rectangle C4VersionDetailsArea <> [ +| PlantUML | **%version()** | +| C4-PlantUML | **C4Version()** | +] +!end procedure + +' Colors +' ################################## +!$ELEMENT_FONT_COLOR ?= "#FFFFFF" + +!$ARROW_COLOR ?= "#666666" +!$ARROW_FONT_COLOR ?= $ARROW_COLOR + +!$BOUNDARY_COLOR ?= "#444444" +!$BOUNDARY_BG_COLOR ?= "transparent" +!$BOUNDARY_BORDER_STYLE ?= "dashed" +' boundary symbols written in the same line, typically only 50% of the size in element +!$BOUNDARY_IMAGE_SIZE_FACTOR ?= 0.5 +!$BOUNDARY_DESCR_MAX_CHAR_WIDTH ?= 35 + +!$LEGEND_TITLE_COLOR ?= "#000000" +!$LEGEND_FONT_COLOR ?= "#FFFFFF" +!$LEGEND_BG_COLOR ?= "transparent" +!$LEGEND_BORDER_COLOR ?= "transparent" +' %darken(darkkhaki,50), #khaki +!$LEGEND_DARK_COLOR ?= "#66622E" +!$LEGEND_LIGHT_COLOR ?= "#khaki" + +!$SKETCH_BG_COLOR ?= "#EEEBDC" +!$SKETCH_FONT_COLOR ?= "" +!$SKETCH_WARNING_COLOR ?= "red" +!$SKETCH_FONT_NAME ?= "Comic Sans MS" + +' Labels +' ################################## + +!$LEGEND_SHADOW_TEXT ?= "shadow" +!$LEGEND_NO_SHADOW_TEXT ?= "no shadow" +!$LEGEND_NO_FONT_BG_TEXT ?= "last text and back color" +!$LEGEND_NO_FONT_TEXT ?= "last text color" +!$LEGEND_NO_BG_TEXT ?= "last back color" +!$LEGEND_NO_LINE_TEXT ?= "last line color" +!$LEGEND_ROUNDED_BOX ?= "rounded box" +!$LEGEND_EIGHT_SIDED ?= "eight sided" +!$LEGEND_DOTTED_LINE ?= "dotted" +!$LEGEND_DASHED_LINE ?= "dashed" +!$LEGEND_BOLD_LINE ?= "bold" +!$LEGEND_SOLID_LINE ?= "solid" + +!$LEGEND_BOUNDARY ?= "boundary" +' ignore (boundary) transparent atm, that the legend is smaller +' !$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= "transparent, " +!$LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA ?= "" +' (boundary) dashed should not be ignored atm +!$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= "dashed, " +' !$LEGEND_BOUNDARY_DASHED_INCL_COMA ?= "" + +!$LEGEND_THICKNESS ?= "thickness" + +!$SKETCH_FOOTER_WARNING ?= "Warning:" +!$SKETCH_FOOTER_TEXT ?= "Created for discussion, needs to be validated" + +' Styling +' ################################## + +!$STEREOTYPE_FONT_SIZE ?= 12 +!global $TRANSPARENT_STEREOTYPE_FONT_SIZE = $STEREOTYPE_FONT_SIZE/2 +!$TECHN_FONT_SIZE ?= 12 + +!$ARROW_FONT_SIZE ?= 12 + +!$LEGEND_DETAILS_SMALL_SIZE ?= 10 +!$LEGEND_DETAILS_NORMAL_SIZE ?= 14 +!global $LEGEND_DETAILS_SIZE = $LEGEND_DETAILS_SMALL_SIZE + +' element symbols typically 4 times too big in legend +!$LEGEND_IMAGE_SIZE_FACTOR ?= 0.25 + +!$ROUNDED_BOX_SIZE ?= 25 +!$EIGHT_SIDED_SIZE ?= 18 + +' Default element wrap width (of an element) +!$DEFAULT_WRAP_WIDTH ?= 200 +' Maximum size in pixels, of a message (in a sequence diagram?) +!$MAX_MESSAGE_SIZE ?= 150 +' PlantUML supports no DETERMINISTIC/automatic line breaks of "PlantUML line" (C4 Relationships) +' therefore Rel...() implements an automatic line break based on spaces (like in all other objects). +' If a $type contains \n then these are used (and no automatic space based line breaks are done) +' $REL_TECHN_MAX_CHAR_WIDTH defines the automatic line break position +!$REL_TECHN_MAX_CHAR_WIDTH ?= 35 +!$REL_DESCR_MAX_CHAR_WIDTH ?= 32 + +' internal +' ################################## + +!global $ROUNDED_BOX = "roundedBox" +!global $EIGHT_SIDED = "eightSided" + +!global $DOTTED_LINE = "dotted" +!global $DASHED_LINE = "dashed" +!global $BOLD_LINE = "bold" +' solid is not defined in plantUML, but works as reset of all other styles too +!global $SOLID_LINE = "solid" + +!global $LEGEND_DETAILS_NONE = "none" +!global $LEGEND_DETAILS_NORMAL = "normal" +!global $LEGEND_DETAILS_SMALL = "small" + +skinparam defaultTextAlignment center + +skinparam wrapWidth $DEFAULT_WRAP_WIDTH +skinparam maxMessageSize $MAX_MESSAGE_SIZE + +skinparam LegendFontColor $LEGEND_FONT_COLOR +skinparam LegendBackgroundColor $LEGEND_BG_COLOR +skinparam LegendBorderColor $LEGEND_BORDER_COLOR + +skinparam rectangle<> { + backgroundcolor $LEGEND_BG_COLOR + bordercolor $LEGEND_BORDER_COLOR +} + +skinparam rectangle { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} + +skinparam database { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} + +skinparam queue { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} + +skinparam participant { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} + +skinparam arrow { + Color $ARROW_COLOR + FontColor $ARROW_FONT_COLOR + FontSize $ARROW_FONT_SIZE +} + +skinparam person { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} + +skinparam actor { + StereotypeFontSize $STEREOTYPE_FONT_SIZE + style awesome +} + +!if %variable_exists("ENABLE_ALL_PLANT_ELEMENTS") +skinparam agent { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam artifact { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam boundary { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam card { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam circle { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam cloud { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam collections { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam control { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam entity { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam file { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam folder { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam frame { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam hexagon { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam interface { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam label { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam stack { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam storage { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam usecase { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +skinparam person { + StereotypeFontSize $STEREOTYPE_FONT_SIZE +} +!endif + +' Some boundary skinparams have to be set as package skinparams too (PlantUML uses internal packages) +' UpdateBoundaryStyle() called in boundary section below +skinparam rectangle<> { + StereotypeFontSize $TRANSPARENT_STEREOTYPE_FONT_SIZE + StereotypeFontColor $BOUNDARY_BG_COLOR + BorderStyle $BOUNDARY_BORDER_STYLE +} + +skinparam package { + StereotypeFontSize $TRANSPARENT_STEREOTYPE_FONT_SIZE + StereotypeFontColor $BOUNDARY_BG_COLOR + FontStyle plain + BackgroundColor $BOUNDARY_BG_COLOR +} + +' Legend and Tags +' ################################## +!global $tagDefaultLegend = "" +!global $tagCustomLegend = "" + +' rel specific +!unquoted function $toStereos($tags) + !if (%strlen($tags) == 0) + !return '' + !endif + !$stereos = '' + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$stereos = $stereos + '<<' + $tag + '>>' +%set_variable_value("$" + $tag + "_LineLegend", %true()) + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$stereos = $stereos + '<<' + $tags + '>>' +%set_variable_value("$" + $tags + "_LineLegend", %true()) + !endif + !return $stereos +!endfunction + +' if $sprite/$techn is an empty argument, try to calculate it via the defined $tag +!unquoted function $toRelArg($arg, $tags, $varPostfix) + !if ($arg > "") + !return $arg + !endif + + !if (%strlen($tags) == 0) + !return $arg + !endif + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$newArg = %get_variable_value("$" + $tag + $varPostfix) + !if ($newArg > "") + !return $newArg + !endif + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$newArg = %get_variable_value("$" + $tags + $varPostfix) + !if ($newArg > "") + !return $newArg + !endif + !endif + !return $arg +!endfunction + +' element specific (unused are hidden based on mask) +!unquoted function $toStereos($elementType, $tags) + !if (%strlen($tags) == 0) + !$stereos = '<<' + $elementType + '>>' +%set_variable_value("$" + $elementType + "Legend", %true()) + !return $stereos + !endif + !$stereos = '' + !$mask = $resetMask() + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$stereos = $stereos + '<<' + $tag + '>>' + !$mergedMask = $combineMaskWithTag($mask, $tag) + !if ($mergedMask != $mask) +%set_variable_value("$" + $tag + "Legend", %true()) + !$mask = $mergedMask + !endif + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$stereos = $stereos + '<<' + $tags + '>>' + !$mergedMask = $combineMaskWithTag($mask, $tags) + !if ($mergedMask != $mask) +%set_variable_value("$" + $tags + "Legend", %true()) + !$mask = $mergedMask + !endif + !endif + ' has to be last, otherwise PlantUML overwrites all tag specific skinparams + !$stereos = $stereos + '<<' + $elementType + '>>' + !$mergedMask = $combineMaskWithTag($mask, $elementType) + !if ($mergedMask != $mask) +%set_variable_value("$" + $elementType + "Legend", %true()) + !$mask = $mergedMask + !endif + !return $stereos +!endfunction + +' if $sprite/$techn is an empty argument, try to calculate it via the defined $tag +!unquoted function $toElementArg($arg, $tags, $varPostfix, $elementType) + !if ($arg > "") + !return $arg + !endif + + !if (%strlen($tags) == 0) + !$newArg = %get_variable_value("$" + $elementType + $varPostfix) + !if ($newArg > "") + !return $newArg + !else + !return $arg + !endif + !endif + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$newArg = %get_variable_value("$" + $tag + $varPostfix) + !if ($newArg > "") + !return $newArg + !endif + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$newArg = %get_variable_value("$" + $tags + $varPostfix) + !if ($newArg > "") + !return $newArg + !endif + !$newArg = %get_variable_value("$" + $elementType + $varPostfix) + !if ($newArg > "") + !return $newArg + !endif + !endif + !return $arg +!endfunction + +' if $value is empty try to load it via variable, optional can it store the calculated value +!function $restoreEmpty($elementType, $property, $value, $store) + !$var = "$" + $elementType + "Restore" + $property + !if ($value == "") + !$value = %get_variable_value($var) + !elseif ($store) + %set_variable_value($var, $value) + !endif + !return $value +!endfunction + +' clear the restore property +!function $clearRestore($elementType, $property) + !$var = "$" + $elementType + "Restore" + $property + %set_variable_value($var, "") + !return "" +!endfunction + +!function $elementTagSkinparams($element, $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness) + !$elementSkin = "skinparam " + $element + "<<" + $tagStereo + ">> {" + %newline() + !if ($fontColor != "") + !if (%strpos($tagStereo, "boundary") < 0) + !$elementSkin = $elementSkin + " StereotypeFontColor " + $fontColor + %newline() + !endif + !$elementSkin = $elementSkin + " FontColor " + $fontColor + %newline() + !endif + !if ($bgColor != "") + !$elementSkin = $elementSkin + " BackgroundColor " + $bgColor + %newline() + !endif + !if ($borderColor != "") + !$elementSkin = $elementSkin + " BorderColor " + $borderColor+ %newline() + !endif + !if ($shadowing == "true") + !$elementSkin = $elementSkin + " Shadowing<<" + $tagStereo + ">> " + "true" + %newline() + !endif + !if ($shadowing == "false") + !$elementSkin = $elementSkin + " Shadowing<<" + $tagStereo + ">> " + "false" + %newline() + !endif + ' only rectangle supports shape(d corners), define both skinparam that overlays are working + !if ($shape != "" && $element == "rectangle") + !if ($shape == $ROUNDED_BOX) + !$elementSkin = $elementSkin + " RoundCorner " + $ROUNDED_BOX_SIZE+ %newline() + !$elementSkin = $elementSkin + " DiagonalCorner " + "0" + %newline() + !elseif ($shape == $EIGHT_SIDED) + !$elementSkin = $elementSkin + " RoundCorner " + "0" + %newline() + !$elementSkin = $elementSkin + " DiagonalCorner " + $EIGHT_SIDED_SIZE+ %newline() + !endif + !endif + !if ($borderStyle != "") + !$elementSkin = $elementSkin + " BorderStyle " + $borderStyle + %newline() + !endif + !if ($borderThickness != "") + !$elementSkin = $elementSkin + " BorderThickness " + $borderThickness + %newline() + !endif + !$elementSkin = $elementSkin + "}" + %newline() + !return $elementSkin +!endfunction + +!unquoted procedure $defineSkinparams($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness) + ' only rectangle supports shape(d corners) + !$tagSkin = $elementTagSkinparams("rectangle", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("database", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("queue", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + ' plantuml.jar bug - actor have to be after person + !$tagSkin = $tagSkin + $elementTagSkinparams("person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + ' actor has style awesome, therefore $fontColor is ignored and text uses $bgColor too + !$tagSkin = $tagSkin + $elementTagSkinparams("actor", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + ' sequence requires participant + !$tagSkin = $tagSkin + $elementTagSkinparams("participant", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("sequencebox", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !if (%strpos($tagStereo, "boundary") >= 0 && $bgColor != "") + !$tagSkin = $tagSkin + "skinparam package<<" + $tagStereo + ">>StereotypeFontColor " + $bgColor + %newline() + !$tagSkin = $tagSkin + "skinparam rectangle<<" + $tagStereo + ">>StereotypeFontColor " + $bgColor + %newline() + !endif + !if %variable_exists("ENABLE_ALL_PLANT_ELEMENTS") + !$tagSkin = $tagSkin + $elementTagSkinparams("agent", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("artifact", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("card", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("cloud", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("collections", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("file", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("folder", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("frame", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("hexagon", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("package", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("stack", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("storage", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("usecase", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + ' elements without background: font uses $bgColor + !$tagSkin = $tagSkin + $elementTagSkinparams("boundary", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("circle", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("control", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("entity", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + !$tagSkin = $tagSkin + $elementTagSkinparams("interface", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) + ' label uses wrong font color? (should be $bgColor too) + !$tagSkin = $tagSkin + $elementTagSkinparams("label", $tagStereo, $bgColor, $bgColor, $borderColor, $shadowing, "", $borderStyle, $borderThickness) +' label colors cannot be set via skinparam use additional style + !$tagSkin = $tagSkin + "" + %newline() + !endif +$tagSkin +!endprocedure + +' arrow colors cannot start with # (legend background has to start with #) +!function $colorWithoutHash($c) + !if (%substr($c, 0, 1) == "#") + !$c = %substr($c,1) + !endif + !return $c +!endfunction + +!unquoted procedure $defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness) + !$elementSkin = "skinparam arrow<<" + $tagStereo + ">> {" + %newline() + !if ($lineColor != "") || ($textColor != "") || ($lineStyle != "") + !$elementSkin = $elementSkin + " Color " + !if ($lineColor != "") + !$elementSkin = $elementSkin + $colorWithoutHash($lineColor) + !endif + !if ($textColor != "") + !$elementSkin = $elementSkin + ";text:" + $colorWithoutHash($textColor) + !endif + !if ($lineStyle != "") + !$elementSkin = $elementSkin + ";line." + $lineStyle + !endif + !$elementSkin = $elementSkin + %newline() + !endif + !if ($lineThickness != "") + !$elementSkin = $elementSkin + " thickness " + $lineThickness + %newline() + !endif + !$elementSkin = $elementSkin + "}" + %newline() +$elementSkin +!endprocedure + +' %is_dark() requires PlantUML version >= 1.2021.6 +!if (%function_exists("%is_dark")) + !$PlantUMLSupportsDynamicLegendColor = %true() +!else + !$PlantUMLSupportsDynamicLegendColor = %false() + !log "dynamic undefined legend colors" requires PlantUML version >= 1.2021.6, therefore only static assigned colors are used +!endif + +!unquoted function $contrastLegend($color) + !if (%is_dark($color)) + !$value = $LEGEND_LIGHT_COLOR + !else + !$value = $LEGEND_DARK_COLOR + !endif + !return $value +!endfunction + +!unquoted function $flatLegend($color) + !if (%is_dark($color)) + !$value = $LEGEND_DARK_COLOR + !else + !$value = $LEGEND_LIGHT_COLOR + !endif + !return $value +!endfunction + +' legend background has to start with # +!function $colorWithHash($c) + !if (%substr($c, 0, 1) != "#") + !$c = "#" + $c + !endif + !return $c +!endfunction + +!function $addMaskFlag($mask, $attr) + !if ($attr == "") + !$mask = $mask + "0" + !else + !$mask = $mask + "1" + !endif + !return $mask +!endfunction + +!function $orFlags($flag1, $flag2) + !if ($flag1 == "0" && $flag2 == "0") + !return "0" + !endif + !return "1" +!endfunction + +!function $tagLegendMask($bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness) + !$mask = "" + !$mask = $addMaskFlag($mask, $bgColor) + !$mask = $addMaskFlag($mask, $fontColor) + !$mask = $addMaskFlag($mask, $borderColor) + !$mask = $addMaskFlag($mask, $shadowing) + !$mask = $addMaskFlag($mask, $shape) + !$mask = $addMaskFlag($mask, $sprite) + !$mask = $addMaskFlag($mask, $borderStyle) + !$mask = $addMaskFlag($mask, $borderThickness) + !return $mask +!endfunction + +!function $resetMask() + !return "00000000" +!endfunction + +!function $combineMasks($mask1, $mask2) + !$mask = "" + !$mask = $mask + $orFlags(%substr($mask1, 0, 1), %substr($mask2, 0, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 1, 1), %substr($mask2, 1, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 2, 1), %substr($mask2, 2, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 3, 1), %substr($mask2, 3, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 4, 1), %substr($mask2, 4, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 5, 1), %substr($mask2, 5, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 6, 1), %substr($mask2, 6, 1)) + !$mask = $mask + $orFlags(%substr($mask1, 7, 1), %substr($mask2, 7, 1)) + !return $mask +!endfunction + +!function $combineMaskWithTag($mask1, $tag) + !$mask2 = %get_variable_value("$" + $tag+ "LegendMask") + !if ($mask2 == "") + ' !log combineMaskWithTag $mask1, $tag, ... only $mask1 + !return $mask1 + !endif + + ' !log combineMaskWithTag $mask1, $tag, $mask2 ... $combineMasks($mask1, $mask2) + !return $combineMasks($mask1, $mask2) +!endfunction + +' element symbols typically 4 times too big in legend +!function $smallVersionSprite($sprite, $imageScale = $LEGEND_IMAGE_SIZE_FACTOR) + ' ,scale= ... has to be first (...,color=black,scale=0.25... is invalid too) + !if (%strpos($sprite, "=") < 0) + !if (%substr($sprite, 0, 4) == "img:") + !$smallSprite = $sprite + "{scale=" + $imageScale + "}" + !else + !$smallSprite = $sprite + ",scale=" + $imageScale + !endif + !else + !$smallSprite = $sprite + !endif + !return $smallSprite +!endfunction + +' format sprite that it can be used in diagram +!function $getSprite($sprite) + ' if it starts with & it's a OpenIconic, details see https://useiconic.com/open/ + ' if it starts with img: it's an image, details see https://plantuml.com/creole + !if (%substr($sprite, 0, 1) != "&" && %substr($sprite, 0, 4) != "img:") + !$formatted = "<$" + $sprite + ">" + !else + !$formatted = "<" + $sprite + ">" + !endif + !return $formatted +!endfunction + +!function $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness) + !$bg = $bgColor + !$fo = $fontColor + !$bo = $borderColor + + !if ($fo == "") + !if ($bg != "") +!if ($PlantUMLSupportsDynamicLegendColor) + !$fo = $contrastLegend($bg) +!else + !$fo = $LEGEND_DARK_COLOR +!endif + !else + !if ($bo == "") + !$fo = $LEGEND_DARK_COLOR + !$bg = $LEGEND_LIGHT_COLOR + !else +!if ($PlantUMLSupportsDynamicLegendColor) + !$fo = $flatLegend($bo) + !$bg = $contrastLegend($bo) +!else + !$fo = $LEGEND_DARK_COLOR + !$bg = $LEGEND_LIGHT_COLOR +!endif + !endif + !endif + !else + !if ($bg == "") +!if ($PlantUMLSupportsDynamicLegendColor) + !$bg = $contrastLegend($fo) +!else + !$bg = $LEGEND_LIGHT_COLOR +!endif + !endif + !endif + + !if ($bo == "") + !$bo = $bg + !endif + + !$tagEntry = "|" + !$tagDetails = "(" + !$tagEntry = $tagEntry + "<" + $colorWithHash($bg) +">" + ' ..white rectangle + !$tagEntry = $tagEntry + " " + !$tagEntry = $tagEntry + "" + !if ($legendSprite != "") + !$tagEntry = $tagEntry + $getSprite($legendSprite) + " " + !endif + + !$isBoundary = 0 + !if ($legendText == "") + !if (%strpos($tagStereo, "boundary") >= 0) + !if ($tagStereo == "boundary") + !$isBoundary = 1 + !$tagEntry = $tagEntry + " " + $LEGEND_BOUNDARY + " " + !else + ' if contains/ends with _boundary remove _boundary and add "boundary (dashed)" + !$pos = %strpos($tagStereo, "_boundary") + !if ($pos > 0) + !$isBoundary = 1 + !$tagEntry = $tagEntry + " " + %substr($tagStereo, 0 ,$pos) + " " +$LEGEND_BOUNDARY + " " + !endif + !endif + !endif + !if ($isBoundary == 0) + !$tagEntry = $tagEntry + " " + $tagStereo + " " + !endif + + !if ($isBoundary == 1 && ($bgColor == "#00000000" || %lower($bgColor) == "transparent")) + !$tagDetails = $tagDetails + $LEGEND_BOUNDARY_TRANSPARENT_INCL_COMA + !endif + !if ($shadowing == "true") + !$tagDetails = $tagDetails + $LEGEND_SHADOW_TEXT + ", " + !endif + !if ($shadowing == "false") + !$tagDetails = $tagDetails + $LEGEND_NO_SHADOW_TEXT + ", " + !endif + !if ($shape == $ROUNDED_BOX) + !$tagDetails = $tagDetails + $LEGEND_ROUNDED_BOX + ", " + !endif + !if ($shape == $EIGHT_SIDED) + !$tagDetails = $tagDetails + $LEGEND_EIGHT_SIDED + ", " + !endif + !if ($fontColor == "" && $bgColor == "") + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_BG_TEXT + ", " + !else + !if ($fontColor == "") + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + ", " + !endif + !if ($bgColor == "") + !$tagDetails = $tagDetails + $LEGEND_NO_BG_TEXT + ", " + !endif + !endif + !if ($borderStyle != "") + !if ($borderStyle == $DOTTED_LINE) + !$tagDetails = $tagDetails + $LEGEND_DOTTED_LINE + ", " + !elseif ($borderStyle == $DASHED_LINE) + !if ($isBoundary == 1) + !$tagDetails = $tagDetails + $LEGEND_BOUNDARY_DASHED_INCL_COMA + !else + !$tagDetails = $tagDetails + $LEGEND_DASHED_LINE + ", " + !endif + !elseif ($borderStyle == $BOLD_LINE) + !$tagDetails = $tagDetails + $LEGEND_BOLD_LINE + ", " + !elseif ($borderStyle == $SOLID_LINE) + !$tagDetails = $tagDetails + $LEGEND_SOLID_LINE + ", " + !else + !$tagDetails = $tagDetails + $borderStyle + ", " + !endif + !endif + !if ($borderThickness != "") + !$tagDetails = $tagDetails + $LEGEND_THICKNESS + " " + $borderThickness + ", " + !endif + !if ($tagDetails=="(" || $tagDetails=="(, ") + !$tagDetails = "" + !else + !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2) + !$tagDetails = $tagDetails + ")" + !endif + !else + !$brPos = %strpos($legendText, "\n") + !if ($brPos > 0) + !$tagEntry = $tagEntry + %substr($legendText, 0, $brPos) + " " + !$details = %substr($legendText, $brPos + 2) + !if ($details=="") + !$tagDetails = "" + !else + !$tagDetails = $tagDetails + $details + ")" + !endif + !else + !$tagEntry = $tagEntry + " " + $legendText + " " + !$tagDetails = "" + !endif + !endif + + !$tagDetails = $tagDetails + " " + !$tagDetails = $tagDetails + "|" +%set_variable_value("$" + $tagStereo + "LegendEntry", $tagEntry) +%set_variable_value("$" + $tagStereo + "LegendDetails", $tagDetails) + !return $tagEntry +!endfunction + +!function $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) + !$tc = $textColor + !$lc = $lineColor + + !if ($tc == "") + !if ($PlantUMLSupportsDynamicLegendColor) + !$tc = $flatLegend($ARROW_FONT_COLOR) + !else + !$tc = $LEGEND_DARK_COLOR + !endif + !endif + !if ($lc == "") + !if ($PlantUMLSupportsDynamicLegendColor) + !$lc = $flatLegend($ARROW_COLOR) + !else + !$lc = $LEGEND_DARK_COLOR + !endif + !endif + + !$tagEntry = "|" + !$tagDetails = "(" + ' ..white line + !$tagEntry = $tagEntry + " " + !$tagEntry = $tagEntry + "" + !if ($legendSprite != "") + !$tagEntry = $tagEntry + $getSprite($legendSprite) + " " + !endif + !if ($legendText == "") + !$tagEntry = $tagEntry + " " + $tagStereo + " " + !if ($textColor == "") + !$tagDetails = $tagDetails + $LEGEND_NO_FONT_TEXT + ", " + !endif + !if ($lineColor == "") + !$tagDetails = $tagDetails + $LEGEND_NO_LINE_TEXT + ", " + !endif + !if ($lineStyle != "") + !if ($lineStyle == $DOTTED_LINE) + !$tagDetails = $tagDetails + $LEGEND_DOTTED_LINE + ", " + !elseif ($lineStyle == $DASHED_LINE) + !$tagDetails = $tagDetails + $LEGEND_DASHED_LINE + ", " + !elseif ($lineStyle == $BOLD_LINE) + !$tagDetails = $tagDetails + $LEGEND_BOLD_LINE + ", " + !else + !$tagDetails = $tagDetails + $lineStyle + ", " + !endif + !endif + !if ($lineThickness != "") + !$tagDetails = $tagDetails + $LEGEND_THICKNESS + " " + $lineThickness + ", " + !endif + !if ($tagDetails=="(") + !$tagDetails = "" + !else + !$tagDetails = %substr($tagDetails, 0, %strlen($tagDetails)-2) + !$tagDetails = $tagDetails + ")" + !endif + !else + !$brPos = %strpos($legendText, "\n") + !if ($brPos > 0) + !$tagEntry = $tagEntry + " " + %substr($legendText, 0, $brPos) + " " + !$details = %substr($legendText, $brPos + 2) + !if ($details=="") + !$tagDetails = "" + !else + !$tagDetails = $tagDetails + $details + ")" + !endif + !else + !$tagEntry = $tagEntry + " " + $legendText + " " + !$tagDetails = "" + !endif + !endif + + !$tagDetails = $tagDetails + " " + !$tagDetails = $tagDetails + "|" +%set_variable_value("$" + $tagStereo + "_LineLegendEntry", $tagEntry) +%set_variable_value("$" + $tagStereo + "_LineLegendDetails", $tagDetails) + !return $tagEntry +!endfunction + +!unquoted procedure $addTagToLegend($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") +'' if a combined element tag is defined (e.g. "v1.0&v1.1") then it is typically a merged color, +'' like a new $fontColor="#fdae61" therefore it should be added to the legend +'' and the & combined tags will be not removed +' !if (%strpos($tagStereo, "&") < 0) + !$dummyAlreadyVariables = $setTagLegendVariables($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness) + !$tagCustomLegend = $tagCustomLegend + $tagStereo + "\n" + !$tagMask = $tagLegendMask( $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness) +%set_variable_value("$" + $tagStereo + "LegendMask", $tagMask) +' !endif +!endprocedure + +!unquoted procedure $addRelTagToLegend($tagStereo, $textColor="", $lineColor="", $lineStyle="", $legendText="", $legendSprite="", $lineThickness="") +'' Arrows have a bug with stereotype/skinparams and cannot combine text colors of one stereotype +'' and the line color of another stereotype. Therefore the text color of one tag and the line color +'' of another tag have to be combined via a "workaround" tag ("v1.0&v1.1"). +'' This workaround tag could be theoretically removed in the legend but after that there would +'' be an inconsistency between the element tags and the rel tags and therefore +'' & combined workaround tags are not removed too (and in unlikely cases the color itself could be changed) +' !if (%strpos($tagStereo, "&") < 0) + !$dummyAlreadyVariables = $setTagRelLegendVariables($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) + !$tagCustomLegend = $tagCustomLegend + $tagStereo + "_Line\n" +' !endif +!endprocedure + +!procedure $showActiveLegendEntries($allDefined) + !$brPos = %strpos($allDefined, "\n") + !while ($brPos >= 0) + !$tagStereo = %substr($allDefined, 0, $brPos) + !$allDefined = %substr($allDefined, $brPos+2) + !$brPos = %strpos($allDefined, "\n") + !if (%variable_exists("$" + $tagStereo + "Legend")) + ' is part of legendDetails + !$part1 = %get_variable_value("$" + $tagStereo + "LegendEntry") + !$partSize = "" + !$part2 = %get_variable_value("$" + $tagStereo + "LegendDetails") + !$line = $part1 + $partSize + $part2 +$line + !endif + !endwhile + !if (%strlen($allDefined) > 0) + !$tagStereo = $allDefined + !if (%variable_exists("$" + $tagStereo + "Legend")) + ' is part of legendDetails + !$part1 = %get_variable_value("$" + $tagStereo + "LegendEntry") + !$partSize = "" + !$part2 = %get_variable_value("$" + $tagStereo + "LegendDetails") + !$line = $part1 + $partSize + $part2 +$line + !endif + !endif +!endprocedure + +!function RoundedBoxShape() +!return $ROUNDED_BOX +!endfunction + +!function EightSidedShape() +!return $EIGHT_SIDED +!endfunction + +!function DottedLine() +!return $DOTTED_LINE +!endfunction + +!function DashedLine() +!return $DASHED_LINE +!endfunction + +!function BoldLine() +!return $BOLD_LINE +!endfunction + +!function SolidLine() +!return $SOLID_LINE +!endfunction + +' used by new defined tags +!unquoted procedure AddElementTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") +$defineSkinparams($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness) + !if ($sprite!="") +%set_variable_value("$" + $tagStereo + "ElementTagSprite", $sprite) + !if ($legendSprite == "") + !$legendSprite = $smallVersionSprite($sprite) + !endif + !endif + !if ($techn != "") +%set_variable_value("$" + $tagStereo + "ElementTagTechn", $techn) + !endif +$addTagToLegend($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +!unquoted procedure $addElementTagInclReuse($elementName, $tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") + !$bgColor=$restoreEmpty($elementName, "bgColor", $bgColor, %false()) + !$fontColor=$restoreEmpty($elementName, "fontColor", $fontColor, %false()) + !$borderColor=$restoreEmpty($elementName, "borderColor", $borderColor, %false()) + !$shadowing=$restoreEmpty($elementName, "shadowing", $shadowing, %false()) + !$shape=$restoreEmpty($elementName, "shape", $shape, %false()) + !$sprite=$restoreEmpty($elementName, "sprite", $sprite, %false()) + !$techn=$restoreEmpty($elementName, "techn", $techn, %false()) + ' new style should has its own legend text + ' !$legendText=$restoreEmpty($elementName, "legendText", $legendText, %false()) + !$legendSprite=$restoreEmpty($elementName, "legendSprite", $legendSprite, %false()) + !$borderStyle=$restoreEmpty($elementName, "borderStyle", $borderStyle, %false()) + !$borderThickness=$restoreEmpty($elementName, "borderThickness", $borderThickness, %false()) + + AddElementTag($tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +' used by new defined rel tags +!unquoted procedure AddRelTag($tagStereo, $textColor="", $lineColor="", $lineStyle="", $sprite="", $techn="", $legendText="", $legendSprite="", $lineThickness="") +$defineRelSkinparams($tagStereo, $textColor, $lineColor, $lineStyle, $lineThickness) + !if ($sprite != "") +%set_variable_value("$" + $tagStereo + "RelTagSprite", $sprite) + !if ($legendSprite == "") + ' relation symbols typically 1:1 no additional scale required + !$legendSprite = $sprite + !endif + !endif + !if ($techn != "") +%set_variable_value("$" + $tagStereo + "RelTagTechn", $techn) + !endif +$addRelTagToLegend($tagStereo, $textColor, $lineColor, $lineStyle, $legendText, $legendSprite, $lineThickness) +!endprocedure + +' update the style of existing elements like person, ... +!unquoted procedure UpdateElementStyle($elementName, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") +!$bgColor=$restoreEmpty($elementName, "bgColor", $bgColor, %true()) +!$fontColor=$restoreEmpty($elementName, "fontColor", $fontColor, %true()) +!$borderColor=$restoreEmpty($elementName, "borderColor", $borderColor, %true()) +!$shadowing=$restoreEmpty($elementName, "shadowing", $shadowing, %true()) +!$shape=$restoreEmpty($elementName, "shape", $shape, %true()) +!$sprite=$restoreEmpty($elementName, "sprite", $sprite, %true()) +!$techn=$restoreEmpty($elementName, "techn", $techn, %true()) +!$legendText=$restoreEmpty($elementName, "legendText", $legendText, %true()) +!$legendSprite=$restoreEmpty($elementName, "legendSprite", $legendSprite, %true()) +!$borderStyle=$restoreEmpty($elementName, "borderStyle", $borderStyle, %true()) +!$borderThickness=$restoreEmpty($elementName, "borderThickness", $borderThickness, %true()) + +$defineSkinparams($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $borderStyle, $borderThickness) + !if ($sprite != "") +%set_variable_value("$" + $elementName + "ElementTagSprite", $sprite) + !if ($legendSprite == "") + !$legendSprite = $smallVersionSprite($sprite) + !endif + !endif + !if ($techn != "") +%set_variable_value("$" + $elementName + "ElementTagTechn", $techn) + !endif + !$dummyAlreadyVariables = $setTagLegendVariables($elementName, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $legendText, $legendSprite, $borderStyle, $borderThickness) + ' default tags sets at least bgColor and fontColor + !$tagMask = $tagLegendMask("CHANGED", "CHANGED", $borderColor, $shadowing, $shape, $sprite, $borderStyle, $borderThickness) +%set_variable_value("$" + $elementName + "LegendMask", $tagMask) +!endprocedure + +/' @deprecated in favor of UpdateElementStyle '/ +!unquoted procedure UpdateSkinparamsAndLegendEntry($elementName, $bgColor="", $fontColor="", $borderColor="", $shadowing="") +UpdateElementStyle($elementName, $bgColor, $fontColor, $borderColor, $shadowing) +!endprocedure + +' update the style of default relation, it has to set both properties (combined statement not working) +!unquoted procedure UpdateRelStyle($textColor, $lineColor) + !$elementSkin = "skinparam arrow {" + %newline() + !$elementSkin = $elementSkin + " Color " + $lineColor + %newline() + !$elementSkin = $elementSkin + " FontColor " + $textColor + %newline() + !$elementSkin = $elementSkin + "}" + %newline() +$elementSkin +!endprocedure + +' tags/stereotypes have to be delimited with \n +!unquoted procedure SetDefaultLegendEntries($tagStereoEntries) + !$tagDefaultLegend = $tagStereoEntries +!endprocedure + +' Links +' ################################## + +!function $getLink($link) + !if ($link != "") + !return "[[" + $link + "]]" + !else + !return "" + !endif +!endfunction + +' Line breaks +' ################################## + +!unquoted function $breakText($text, $usedNewLine, $widthStr="-1") +!$width = %intval($widthStr) +!$multiLine = "" +!if (%strpos($text, "\n") >= 0) + !while (%strpos($text, "\n") >= 0) + !$brPos = %strpos($text, "\n") + !if ($brPos > 0) + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine + !else + ' non breaking change that newLine breaks with formats can be used with \n\n + !$multiLine = $multiLine + "" + $usedNewLine + !endif + !$text = %substr($text, $brPos+2) + !if (%strlen($text) == 0) + !$text = "" + !endif + !endwhile +!else + !while ($width>0 && %strlen($text) > $width) + !$brPos = $width + !while ($brPos > 0 && %substr($text, $brPos, 1) != ' ') + !$brPos = $brPos - 1 + !endwhile + + !if ($brPos < 1) + !$brPos = %strpos($text, " ") + !else + !endif + + !if ($brPos > 0) + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $usedNewLine + !$text = %substr($text, $brPos + 1) + !else + !$multiLine = $multiLine+ $text + !$text = "" + !endif + !endwhile +!endif +!if (%strlen($text) > 0) + !$multiLine = $multiLine + $text +!endif +!return $multiLine +!endfunction + +!unquoted function $breakLabel($text) +!$usedNewLine = "\n== " +!$multiLine = $breakText($text, $usedNewLine) +!return $multiLine +!endfunction + +!unquoted function $breakDescr($text, $widthStr) + !$usedNewLine = "\n" + !return $breakText($text, $usedNewLine, $widthStr) +!endfunction + +' $breakTechn() supports //...//; $breakNode() in C4_Deployment supports no //....// +!unquoted function $breakTechn($text, $widthStr) + !$usedNewLine = '//\n//' + !return $breakText($text, $usedNewLine, $widthStr) +!endfunction + +' Element base layout +' ################################## + +!function $getElementBase($label, $techn, $descr, $sprite) + !$element = "" + !if ($sprite != "") + !$element = $element + $getSprite($sprite) + !if ($label != "") + !$element = $element + '\n' + !endif + !endif + !if ($label != "") + !$element = $element + '== ' + $breakLabel($label) + !else + !$element = $element + '.' + !endif + !if ($techn != "") + !$element = $element + '\n//[' + $breakTechn($techn, '-1') + ']//' + !endif + !if ($descr != "") + !$element = $element + '\n\n' + $descr + !endif + !return $element +!endfunction + +!function $getElementLine($umlShape, $elementType, $alias, $label, $techn, $descr, $sprite, $tags, $link) + !$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", $elementType) + !$techn=$toElementArg($techn, $tags, "ElementTagTechn", $elementType) + !$baseProp = $getElementBase($label, $techn, $descr, $sprite) + $getProps() + !$stereo = $toStereos($elementType,$tags) + !$calcLink = $getLink($link) + + !$line = $umlShape + " " + %chr(34) + $baseProp + %chr(34) +" " + $stereo + " as " + $alias + $calcLink + !return $line +!endfunction + +' Element properties +' ################################## + +' collect all defined properties as table rows +!global $propTable = "" +!global $propTableCaption = "" +!global $propColCaption = "=" + +!unquoted function SetPropertyHeader($col1Name, $col2Name, $col3Name = "", $col4Name = "") + !$propColCaption = "" + !$propTableCaption = "|= " + $col1Name + " |= " + $col2Name + " |" + !if ($col3Name != "") + !$propTableCaption = $propTableCaption + "= " + $col3Name + " |" + !endif + !if ($col4Name != "") + !$propTableCaption = $propTableCaption + "= " + $col4Name + " |" + !endif + !return "" +!endfunction + +!unquoted function WithoutPropertyHeader() + !$propTableCaption = "" + !$propColCaption = "=" + !return "" +!endfunction + +!unquoted function AddProperty($col1, $col2, $col3 = "", $col4 = "") + !if ($propTable == "") + !if ($propTableCaption != "") + !$propTable = $propTableCaption + "\n" + !endif + !else + !$propTable = $propTable + "\n" + !endif + !$propTable = $propTable + "| " + $col1 + " |" + $propColCaption + " " + $col2 + " |" + !if ($col3 != "") + !$propTable = $propTable + " " + $col3 + " |" + !endif + !if ($col4 != "") + !$propTable = $propTable + " " + $col4 + " |" + !endif + !return "" +!endfunction + +!unquoted function $getProps($alignedNL = "\n") + !if ($propTable != "") + !$retTable = $alignedNL + $propTable + !$propTable = "" + !return $retTable + !endif + !return "" +!endfunction + +!unquoted function $getProps_L() + !return $getProps("\l") +!endfunction + +!unquoted function $getProps_R() + !return $getProps("\r") +!endfunction + +SetPropertyHeader("Property","Value") + +' Layout +' ################################## + +!function $getLegendDetailsSize($detailsFormat) + !if $detailsFormat == $LEGEND_DETAILS_NONE + !$size = 0 + !elseif $detailsFormat == $LEGEND_DETAILS_SMALL + !$size = $LEGEND_DETAILS_SMALL_SIZE + !else + !$size = $LEGEND_DETAILS_NORMAL_SIZE + !endif + !return $size +!endfunction + +!procedure $getHideStereotype($hideStereotype) +!if ($hideStereotype == "true") +hide stereotype +!endif +!endprocedure + +!procedure $getLegendTable($detailsFormat) +!global $LEGEND_DETAILS_SIZE = $getLegendDetailsSize($detailsFormat) +<$colorWithHash(transparent),$colorWithHash(transparent)>|**Legend** | +$showActiveLegendEntries($tagDefaultLegend) +$showActiveLegendEntries($tagCustomLegend) +!endprocedure + +!procedure $getLegendArea($areaAlias, $hideStereotype, $details) +$getHideStereotype($hideStereotype) +rectangle $areaAlias<> [ +$getLegendTable($details) +] +!endprocedure + +!procedure HIDE_STEREOTYPE() +hide stereotype +!endprocedure + +!unquoted procedure SET_SKETCH_STYLE($bgColor="_dont_change_", $fontColor="_dont_change_", $warningColor="_dont_change_", $fontName="_dont_change_", $footerWarning="_dont_change_", $footerText="_dont_change_") +!if $bgColor != "_dont_change_" + !global $SKETCH_BG_COLOR = $bgColor +!endif +!if $fontColor != "_dont_change_" + !global $SKETCH_FONT_COLOR = $fontColor +!endif +!if $warningColor != "_dont_change_" + !global $SKETCH_WARNING_COLOR = $warningColor +!endif +!if $fontName != "_dont_change_" + !global $SKETCH_FONT_NAME = $fontName +!endif +!if $footerWarning != "_dont_change_" + !global $SKETCH_FOOTER_WARNING = $footerWarning +!endif +!if $footerText != "_dont_change_" + !global $SKETCH_FOOTER_TEXT = $footerText +!endif +!endprocedure + +!procedure LAYOUT_AS_SKETCH() + skinparam handwritten true +!if $SKETCH_BG_COLOR > "" + skinparam backgroundColor $SKETCH_BG_COLOR +!endif +!if $SKETCH_FONT_COLOR > "" + skinparam footer { + FontColor $SKETCH_FONT_COLOR + } + !if $ARROW_COLOR == "#666666" + !global $ARROW_COLOR = $SKETCH_FONT_COLOR + !global $ARROW_FONT_COLOR = $SKETCH_FONT_COLOR + skinparam arrow { + Color $ARROW_COLOR + FontColor $ARROW_FONT_COLOR + } + !endif + !if $BOUNDARY_COLOR == "#444444" + !global $BOUNDARY_COLOR = $SKETCH_FONT_COLOR + skinparam rectangle<> { + FontColor $BOUNDARY_COLOR + BorderColor $BOUNDARY_COLOR + } + !endif +!endif +!if $SKETCH_FONT_NAMES > "" + skinparam defaultFontName $SKETCH_FONT_NAME +!endif +!if $SKETCH_FOOTER_WARNING > "" || $SKETCH_FOOTER_TEXT > "" + !$line = "footer "+ $SKETCH_FOOTER_WARNING + " " + $SKETCH_FOOTER_TEXT + $line +!endif +!endprocedure + +!global $fix_direction=%false() + +!function $down($start,$end) +!if ($fix_direction) +!return $start+"RIGHT"+$end +!else +!return $start+"DOWN"+$end +!endif +!endfunction + +!function $up($start,$end) +!if ($fix_direction) +!return $start+"LEFT"+$end +!else +!return $start+"UP"+$end +!endif +!endfunction + +!function $left($start,$end) +!if ($fix_direction) +!return $start+"UP"+$end +!else +!return $start+"LEFT"+$end +!endif +!endfunction + +!function $right($start,$end) +!if ($fix_direction) +!return $start+"DOWN"+$end +!else +!return $start+"RIGHT"+$end +!endif +!endfunction + +!procedure LAYOUT_TOP_DOWN() +!global $fix_direction=%false() +top to bottom direction +!endprocedure + +!procedure LAYOUT_LEFT_RIGHT() +!global $fix_direction = %false() +left to right direction +!endprocedure + +!procedure LAYOUT_LANDSCAPE() +!global $fix_direction = %true() +left to right direction +!endprocedure + +' legend details can displayed as Normal(), Small(), None() +!function None() +!return $LEGEND_DETAILS_NONE +!endfunction + +!function Normal() +!return $LEGEND_DETAILS_NORMAL +!endfunction + +!function Small() +!return $LEGEND_DETAILS_SMALL +!endfunction + +' has to be last call in diagram +!unquoted procedure SHOW_LEGEND($hideStereotype="true", $details=Small()) +$getHideStereotype($hideStereotype) +legend right +$getLegendTable($details) +endlegend +!endprocedure + +/' @deprecated in favor of SHOW_LEGEND '/ +!unquoted procedure SHOW_DYNAMIC_LEGEND($hideStereotype="true") +SHOW_LEGEND($hideStereotype) +!endprocedure + +' legend is reserved and cannot be uses as alias of SHOW_FLOATING_LEGEND() therefore +' LEGEND() is introduced. It returns the default name of the floating alias "floating_legend_alias" +' and can be used in the Lay_Distance() calls +!function LEGEND() +!return "floating_legend_alias" +!endfunction + +' enables that legend can be located in drawing area of the diagram. It has to be last call in diagram followed by Lay_Distance() +!unquoted procedure SHOW_FLOATING_LEGEND($alias=LEGEND(), $hideStereotype="true", $details=Small()) +$getLegendArea($alias, $hideStereotype, $details) +!endprocedure + +' Boundaries +' ################################## + +!unquoted procedure UpdateBoundaryStyle($elementName="", $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $type="", $legendText="", $borderStyle="", $borderThickness="", $sprite="", $legendSprite="") + !if ($elementName != "") + !$elementBoundary = $elementName + '_boundary' + UpdateElementStyle($elementBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) + !else + UpdateElementStyle("boundary", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) + ' simulate color inheritance + UpdateBoundaryStyle("enterprise", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "Enterprise", "", $borderStyle, $borderThickness, $sprite, $legendSprite) + UpdateBoundaryStyle("system", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "System", "", $borderStyle, $borderThickness, $sprite, $legendSprite) + UpdateBoundaryStyle("container", $bgColor, $fontColor, $borderColor, $shadowing, $shape, "Container", "", $borderStyle, $borderThickness, $sprite, $legendSprite) + !endif +!endprocedure + +!unquoted procedure AddBoundaryTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $type="", $legendText="", $borderStyle="", $borderThickness="", $sprite="", $legendSprite="") + !$tagBoundary = $tagStereo + '_boundary' + AddElementTag($tagBoundary, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +' add _boundary to all tags that short tag version can be used +!unquoted function $addBoundaryPostfix($tags) + !if (%strlen($tags) == 0) + !return '' + !endif + !$boundaryTags = '' + !$brPos = %strpos($tags, "+") + !while ($brPos >= 0) + !$tag = %substr($tags, 0, $brPos) + !$boundaryTags = $boundaryTags + $tag + '_boundary+' + !$tags = %substr($tags, $brPos+1) + !$brPos = %strpos($tags, "+") + !endwhile + !if (%strlen($tags) > 0) + !$boundaryTags = $boundaryTags + $tags + '_boundary' + !endif + !return $boundaryTags +!endfunction + +!function $getBoundary($label, $type, $descr, $sprite) + !$line = '== ' + !if ($sprite != "") + ' add sprite in label line that it is more compact + !$line = $line + $getSprite($smallVersionSprite($sprite, $BOUNDARY_IMAGE_SIZE_FACTOR)) + ' ' + !endif + !$line = $line + $breakLabel($label) + !if ($type != "") + !$line = $line + '\n[' + $type + ']' + !endif + !if ($descr != "") + !$line = $line + '\n\n' + $breakDescr($descr, $BOUNDARY_DESCR_MAX_CHAR_WIDTH) + !endif + !return $line +!endfunction + +!unquoted procedure Boundary($alias, $label, $type="", $tags="", $link="", $descr = "") +!$boundaryTags = $addBoundaryPostfix($tags) +' boundary $type reuses $techn definition of $boundaryTags +!$type=$toElementArg($type, $boundaryTags, "ElementTagTechn", "boundary") +!$sprite=$toElementArg("", $boundaryTags, "ElementTagSprite", "boundary") +rectangle "$getBoundary($label, $type, $descr, $sprite)" $toStereos("boundary", $boundaryTags) as $alias $getLink($link) +!endprocedure + +' Boundary Styling +UpdateBoundaryStyle("", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR, $borderStyle=DashedLine()) + +' Index +' ################################## + +' Dynamic/Sequence diagram supports (automatically) numbered interactions: +' preferred function calls +' (Uppercase) LastIndex(): return the last used index (function which can be used as argument) +' (Uppercase) Index($offset=1): returns current index and calculates next index (function which can be used as argument) +' (Uppercase) SetIndex($new_index): returns new set index and calculates next index (function which can be used as argument) + +' old procedures calls +' (lowercase) increment($offset=1): increase current index (procedure which has no direct output) +' (lowercase) setIndex($new_index): set the new index (procedure which has no direct output) + +!$lastIndex = 0 +!$index = 1 + +!procedure increment($offset=1) + !$lastIndex = $index + !$index = $index + $offset +!endprocedure + +!procedure setIndex($new_index) + !$lastIndex = $index + !$index = $new_index +!endprocedure + +!function Index($offset=1) + !$lastIndex = $index + !$index = $lastIndex + $offset + !return $lastIndex +!endfunction + +!function LastIndex() + !return $lastIndex +!endfunction + +!function SetIndex($new_index, $offset=1) + !$lastIndex = $new_index + !$index = $new_index + $offset + !return $lastIndex +!endfunction + +!unquoted function $getPrefix($index) + !if ($index == "") + !$pre = Index() + ": " + !else + !$pre = $index + ": " + !endif + !return $pre +!endfunction + +' Relationship +' ################################## + +!function $getRel($direction, $alias1, $alias2, $label, $techn, $descr, $sprite, $tags, $link) + !$sprite = $toRelArg($sprite, $tags, "RelTagSprite") + !$techn = $toRelArg($techn, $tags, "RelTagTechn") + !$rel = $alias1 + ' ' + $direction + ' ' + $alias2 + !if ($tags != "") + !$rel = $rel + ' ' + $toStereos($tags) + !endif + !$rel = $rel + ' : ' + !if ($link != "") + !$rel = $rel + '**[[' + $link + ' ' + !endif + !if ($sprite != "") + !$rel = $rel + $getSprite($sprite) + !if ($label != "") + !$rel = $rel + ' ' + !endif + !endif + !if ($link != "") + !$usedNewLine = ']]**\n**[[' + $link + ' ' + ' if sprite and label is empty than the link url is shown (otherwise link cannot be activated at all) + !$rel = $rel + $breakText($label, $usedNewLine) + ']]**' + !else + !if ($label != "") + !$usedNewLine = '**\n**' + !$rel = $rel + '**' + $breakText($label, $usedNewLine) + '**' + !else + !$rel = $rel + '.' + !endif + !endif + !if ($techn != "") + ' line break is not deterministic, calculate it + !$rel = $rel + '\n//[' + $breakTechn($techn, $REL_TECHN_MAX_CHAR_WIDTH) + ']//' + !endif + !if ($descr != "") + ' line break is not deterministic, calculate it + !$rel = $rel + '\n\n' + $breakDescr($descr, $REL_DESCR_MAX_CHAR_WIDTH) + !endif + !$prop = $getProps() + !if ($prop != "") + ' reuse table + !$rel = $rel + $prop + !endif + !return $rel +!endfunction + +!unquoted procedure Rel_($alias1, $alias2, $label, $direction) +$getRel($direction, $alias1, $alias2, $label, "", "", "", "", "") +!endprocedure +!unquoted procedure Rel_($alias1, $alias2, $label, $techn, $direction) +$getRel($direction, $alias1, $alias2, $label, $techn, "", "", "", "") +!endprocedure + +!unquoted procedure Rel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("-->>", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("<<-->>", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_Back($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("<<--", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_Neighbor($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("->>", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel_Neighbor($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("<<->>", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_Back_Neighbor($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel("<<-", $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_D($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($down("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure Rel_Down($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($down("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel_D($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($down("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure BiRel_Down($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($down("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_U($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($up("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure Rel_Up($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($up("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel_U($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($up("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure BiRel_Up($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($up("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_L($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($left("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure Rel_Left($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($left("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel_L($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($left("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure BiRel_Left($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($left("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Rel_R($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($right("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure Rel_Right($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($right("-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure BiRel_R($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($right("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure BiRel_Right($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +$getRel($right("<<-","->>"), $from, $to, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +' Layout Helpers +' ################################## + +!function $getHiddenLine($distance) + !return '-[hidden]' + %substr('------------', 0, %intval($distance) + 1) +!endfunction + +!unquoted procedure Lay_D($from, $to) +$from -[hidden]D- $to +!endprocedure +!unquoted procedure Lay_Down($from, $to) +$from -[hidden]D- $to +!endprocedure + +!unquoted procedure Lay_U($from, $to) +$from -[hidden]U- $to +!endprocedure +!unquoted procedure Lay_Up($from, $to) +$from -[hidden]U- $to +!endprocedure + +!unquoted procedure Lay_R($from, $to) +$from -[hidden]R- $to +!endprocedure +!unquoted procedure Lay_Right($from, $to) +$from -[hidden]R- $to +!endprocedure + +!unquoted procedure Lay_L($from, $to) +$from -[hidden]L- $to +!endprocedure +!unquoted procedure Lay_Left($from, $to) +$from -[hidden]L- $to +!endprocedure + +' PlantUML bug: lines which does "not match" with the orientation/direction of the diagram +' use the same length therefore the method offers no direction at all. +' If a direction is required the Lay_...() methods can be used +!unquoted procedure Lay_Distance($from, $to, $distance="0") +$from $getHiddenLine($distance) $to +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4_Component.puml b/Documentation/Issue-62/Diagrams/.c4s/C4_Component.puml new file mode 100644 index 000000000..36cb0f2dc --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4_Component.puml @@ -0,0 +1,83 @@ +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally +!if %variable_exists("RELATIVE_INCLUDE") + !include ./C4_Container.puml +!else + !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml +!endif + +' Scope: A single container. +' Primary elements: Components within the container in scope. +' Supporting elements: Containers (within the software system in scope) plus people and software systems directly connected to the components. +' Intended audience: Software architects and developers. + +' Colors +' ################################## + +!$COMPONENT_FONT_COLOR ?= "#000000" +!$COMPONENT_BG_COLOR ?= "#85BBF0" +!$COMPONENT_BORDER_COLOR ?= "#78A8D8" + +!$EXTERNAL_COMPONENT_FONT_COLOR ?= $COMPONENT_FONT_COLOR +!$EXTERNAL_COMPONENT_BG_COLOR ?= "#CCCCCC" +!$EXTERNAL_COMPONENT_BORDER_COLOR ?= "#BFBFBF" + +' Styling +' ################################## + +UpdateElementStyle("component", $COMPONENT_BG_COLOR, $COMPONENT_FONT_COLOR, $COMPONENT_BORDER_COLOR) +UpdateElementStyle("external_component", $EXTERNAL_COMPONENT_BG_COLOR, $EXTERNAL_COMPONENT_FONT_COLOR, $EXTERNAL_COMPONENT_BORDER_COLOR) + +' shortcuts with default colors +!unquoted procedure AddComponentTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("component", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure +!unquoted procedure AddExternalComponentTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("external_component", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +' Layout +' ################################## + +SetDefaultLegendEntries("person\nsystem\ncontainer\ncomponent\nexternal_person\nexternal_system\nexternal_container\nexternal_component\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") + +!procedure LAYOUT_WITH_LEGEND() +hide stereotype +legend right +|**Legend** | +|<$PERSON_BG_COLOR> person | +|<$SYSTEM_BG_COLOR> system | +|<$CONTAINER_BG_COLOR> container | +|<$COMPONENT_BG_COLOR> component | +|<$EXTERNAL_PERSON_BG_COLOR> external person | +|<$EXTERNAL_SYSTEM_BG_COLOR> external system | +|<$EXTERNAL_CONTAINER_BG_COLOR> external container | +|<$EXTERNAL_COMPONENT_BG_COLOR> external component | +endlegend +!endprocedure + +' Elements +' ################################## + +!unquoted procedure Component($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getElementLine($baseShape, "component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentDb($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("database", "component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentQueue($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("queue", "component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Component_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getElementLine($baseShape, "external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentDb_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("database", "external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentQueue_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("queue", "external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4_Container.puml b/Documentation/Issue-62/Diagrams/.c4s/C4_Container.puml new file mode 100644 index 000000000..e178dcc95 --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4_Container.puml @@ -0,0 +1,103 @@ +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally +!if %variable_exists("RELATIVE_INCLUDE") + !include ./C4_Context.puml +!else + !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml +!endif + +' Scope: A single software system. +' Primary elements: Containers within the software system in scope. +' Supporting elements: People and software systems directly connected to the containers. +' Intended audience: Technical people inside and outside of the software development team; including software architects, developers and operations/support staff. + +' Colors +' ################################## + +!$CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$CONTAINER_BG_COLOR ?= "#438DD5" +!$CONTAINER_BORDER_COLOR ?= "#3C7FC0" + +!$CONTAINER_BOUNDARY_COLOR ?= $BOUNDARY_COLOR +!$CONTAINER_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR +!$CONTAINER_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE + +!$EXTERNAL_CONTAINER_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$EXTERNAL_CONTAINER_BG_COLOR ?= "#B3B3B3" +!$EXTERNAL_CONTAINER_BORDER_COLOR ?= "#A6A6A6" + +' Styling +' ################################## +UpdateElementStyle("container", $CONTAINER_BG_COLOR, $CONTAINER_FONT_COLOR, $CONTAINER_BORDER_COLOR) +UpdateElementStyle("external_container", $EXTERNAL_CONTAINER_BG_COLOR, $EXTERNAL_CONTAINER_FONT_COLOR, $EXTERNAL_CONTAINER_BORDER_COLOR) + +UpdateBoundaryStyle("container", $bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $type="Container") + +' shortcuts with default colors +!unquoted procedure AddContainerTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("container", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure +!unquoted procedure AddExternalContainerTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $techn="", $legendText="", $legendSprite="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("external_container", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $techn, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +!unquoted procedure UpdateContainerBoundaryStyle($bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $shadowing="", $shape="", $type="Container", $legendText="", $borderStyle="", $borderThickness="", $sprite="", $legendSprite="") + UpdateBoundaryStyle("container", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite) +!endprocedure + +' Layout +' ################################## + +SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") + +!procedure LAYOUT_WITH_LEGEND() +hide stereotype +legend right +|**Legend** | +|<$PERSON_BG_COLOR> person | +|<$SYSTEM_BG_COLOR> system | +|<$CONTAINER_BG_COLOR> container | +|<$EXTERNAL_PERSON_BG_COLOR> external person | +|<$EXTERNAL_SYSTEM_BG_COLOR> external system | +|<$EXTERNAL_CONTAINER_BG_COLOR> external container | +endlegend +!endprocedure + +' Elements +' ################################## + +!unquoted procedure Container($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getElementLine($baseShape , "container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerDb($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("database", "container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerQueue($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("queue", "container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Container_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getElementLine($baseShape , "external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerDb_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("database", "external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerQueue_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getElementLine("queue", "external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +' Boundaries +' ################################## + +!unquoted procedure Container_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+container' + !else + !$allTags = 'container' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4_Context.puml b/Documentation/Issue-62/Diagrams/.c4s/C4_Context.puml new file mode 100644 index 000000000..711d17149 --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4_Context.puml @@ -0,0 +1,434 @@ +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally +!if %variable_exists("RELATIVE_INCLUDE") + !include ./C4.puml +!else + !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4.puml +!endif + +' Scope: A single software system. +' Primary elements: The software system in scope. +' Supporting elements: People and software systems directly connected to the software system in scope. +' Intended audience: Everybody, both technical and non-technical people, inside and outside of the software development team. + +' Colors +' ################################## + +!$PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$PERSON_BG_COLOR ?= "#08427B" +!$PERSON_BORDER_COLOR ?= "#073B6F" + +!$EXTERNAL_PERSON_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$EXTERNAL_PERSON_BG_COLOR ?= "#686868" +!$EXTERNAL_PERSON_BORDER_COLOR ?= "#8A8A8A" + +!$SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$SYSTEM_BG_COLOR ?= "#1168BD" +!$SYSTEM_BORDER_COLOR ?= "#3C7FC0" + +!$SYSTEM_BOUNDARY_COLOR ?= $BOUNDARY_COLOR +!$SYSTEM_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR +!$SYSTEM_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE + +!$EXTERNAL_SYSTEM_FONT_COLOR ?= $ELEMENT_FONT_COLOR +!$EXTERNAL_SYSTEM_BG_COLOR ?= "#999999" +!$EXTERNAL_SYSTEM_BORDER_COLOR ?= "#8A8A8A" + +!$ENTERPRISE_BOUNDARY_COLOR ?= $BOUNDARY_COLOR +!$ENTERPRISE_BOUNDARY_BG_COLOR ?= $BOUNDARY_BG_COLOR +!$ENTERPRISE_BOUNDARY_BORDER_STYLE ?= $BOUNDARY_BORDER_STYLE + +' Styling +' ################################## + +UpdateElementStyle("person", $PERSON_BG_COLOR, $PERSON_FONT_COLOR, $PERSON_BORDER_COLOR) +UpdateElementStyle("external_person", $EXTERNAL_PERSON_BG_COLOR, $EXTERNAL_PERSON_FONT_COLOR, $EXTERNAL_PERSON_BORDER_COLOR) +UpdateElementStyle("system", $SYSTEM_BG_COLOR, $SYSTEM_FONT_COLOR, $SYSTEM_BORDER_COLOR) +UpdateElementStyle("external_system", $EXTERNAL_SYSTEM_BG_COLOR, $EXTERNAL_SYSTEM_FONT_COLOR, $EXTERNAL_SYSTEM_BORDER_COLOR) + +UpdateBoundaryStyle("system", $bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $type="System") +UpdateBoundaryStyle("enterprise", $bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $type="Enterprise") + +' shortcuts with default colors +!unquoted procedure AddPersonTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="", $type="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure +!unquoted procedure AddExternalPersonTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="", $type="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("external_person", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure +!unquoted procedure AddSystemTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="", $type="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("system", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure +!unquoted procedure AddExternalSystemTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $legendText="", $legendSprite="", $type="", $borderStyle="", $borderThickness="") + $addElementTagInclReuse("external_system", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +!unquoted procedure UpdateEnterpriseBoundaryStyle($bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $shadowing="", $shape="", $type="Enterprise", $legendText="", $borderStyle="", $borderThickness="", $sprite="", $legendSprite="") + UpdateBoundaryStyle("enterprise", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite) +!endprocedure +!unquoted procedure UpdateSystemBoundaryStyle($bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $shadowing="", $shape="", $type="System", $legendText="", $borderStyle="", $borderThickness="", $sprite="", $legendSprite="") + UpdateBoundaryStyle("system", $bgColor, $fontColor, $borderColor, $shadowing, $shape, $type, $legendText, $borderStyle, $borderThickness, $sprite, $legendSprite) +!endprocedure + +' Sprites +' ################################## + +sprite $person [48x48/16] { +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +0000000000000000000049BCCA7200000000000000000000 +0000000000000000006EFFFFFFFFB3000000000000000000 +00000000000000001CFFFFFFFFFFFF700000000000000000 +0000000000000001EFFFFFFFFFFFFFF80000000000000000 +000000000000000CFFFFFFFFFFFFFFFF6000000000000000 +000000000000007FFFFFFFFFFFFFFFFFF100000000000000 +00000000000001FFFFFFFFFFFFFFFFFFF900000000000000 +00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000 +0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000 +0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000 +0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000 +0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000 +0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000 +0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000 +00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000 +00000000000000EFFFFFFFFFFFFFFFFFF800000000000000 +000000000000007FFFFFFFFFFFFFFFFFF100000000000000 +000000000000000BFFFFFFFFFFFFFFFF5000000000000000 +0000000000000001DFFFFFFFFFFFFFF70000000000000000 +00000000000000000BFFFFFFFFFFFF500000000000000000 +0000000000000000005DFFFFFFFFA1000000000000000000 +0000000000000000000037ABB96100000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000025788300000000005886410000000000000 +000000000007DFFFFFFD9643347BFFFFFFFB400000000000 +0000000004EFFFFFFFFFFFFFFFFFFFFFFFFFFB1000000000 +000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD200000000 +00000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE10000000 +0000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0000000 +000000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5000000 +000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000 +000009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF200000 +00000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000 +00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000 +00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000 +00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000 +00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000 +00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000 +00001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA00000 +00000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF700000 +000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000 +0000008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3000000 +000000014555555555555555555555555555555300000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +} + +sprite $person2 [48x48/16] { +0000000000000000000049BCCA7200000000000000000000 +0000000000000000006EFFFFFFFFB3000000000000000000 +00000000000000001CFFFFFFFFFFFF700000000000000000 +0000000000000001EFFFFFFFFFFFFFF80000000000000000 +000000000000000CFFFFFFFFFFFFFFFF6000000000000000 +000000000000007FFFFFFFFFFFFFFFFFF100000000000000 +00000000000001FFFFFFFFFFFFFFFFFFF900000000000000 +00000000000006FFFFFFFFFFFFFFFFFFFF00000000000000 +0000000000000BFFFFFFFFFFFFFFFFFFFF40000000000000 +0000000000000EFFFFFFFFFFFFFFFFFFFF70000000000000 +0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000 +0000000000000FFFFFFFFFFFFFFFFFFFFF80000000000000 +0000000000000DFFFFFFFFFFFFFFFFFFFF60000000000000 +0000000000000AFFFFFFFFFFFFFFFFFFFF40000000000000 +00000000000006FFFFFFFFFFFFFFFFFFFE00000000000000 +00000000000000EFFFFFFFFFFFFFFFFFF800000000000000 +000000000000007FFFFFFFFFFFFFFFFFF100000000000000 +000000000000000BFFFFFFFFFFFFFFFF5000000000000000 +0000000000000001DFFFFFFFFFFFFFF70000000000000000 +00000000000000000BFFFFFFFFFFFF500000000000000000 +0000000000000000005DFFFFFFFFA1000000000000000000 +0000000000000000000037ABB96100000000000000000000 +000000000002578888300000000005888864100000000000 +0000000007DFFFFFFFFD9643347BFFFFFFFFFB4000000000 +00000004EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB10000000 +0000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2000000 +000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE100000 +00003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB00000 +0000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50000 +0003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0000 +0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2000 +000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000 +000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000 +001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000 +001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB000 +001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA000 +000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6000 +0009FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF2000 +0003FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFD0000 +0000BFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF50000 +00003FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFB00000 +000006FFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFE100000 +0000007FFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFD2000000 +00000004EFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFB10000000 +0000000007DF8FFFFFFFFFFFFFFFFFFFFFF8FB4000000000 +000000000002578888888888888888888864100000000000 +} + +sprite $robot [48x48/16] { +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000005BFFFFFFFFFFFFFFFFFFFFFE9100000000000 +0000000000AFFFFFFFFFFFFFFFFFFFFFFFFFE30000000000 +0000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFE1000000000 +000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000000000 +000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000699405FFFFFFC427FFFFFFFFFC427FFFFFFE009982000 +008FFF705FFFFFE10006FFFFFFFE00007FFFFFE00FFFF100 +00CFFF705FFFFFA00001FFFFFFF900002FFFFFE00FFFF500 +00DFFF705FFFFFB00002FFFFFFFA00003FFFFFE00FFFF500 +00DFFF705FFFFFF4000AFFFFFFFF3000BFFFFFE00FFFF500 +00DFFF705FFFFFFFA8DFFFFFFFFFFA8DFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00DFFF705FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00FFFF500 +00CFFF705FFFFFF87777777777777777CFFFFFE00FFFF500 +008FFF705FFFFFF100000000000000009FFFFFE00FFFF100 +000699405FFFFFF76666666666666666CFFFFFE009982000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000 +000000004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000000000 +000000000EFFFFFFFFFFFFFFFFFFFFFFFFFFFF7000000000 +0000000005FFFFFFFFFFFFFFFFFFFFFFFFFFFD0000000000 +00000000004CFFFFFFFFFFFFFFFFFFFFFFFF910000000000 +000000000000011111111111111111111110000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000 +} + +sprite $robot2 [48x48/16] { +000000000000000088888888888888880000000000000000 +000000000000000AFFFFFFFFFFFFFFFFA000000000000000 +00000000000000CFFFFFFFFFFFFFFFFFFC00000000000000 +00000000000004EFFFFFFFFFFFFFFFFFFE40000000000000 +0000000000000AFFFFFFFFFFFFFFFFFFFFA0000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000008FF8FFFFFFFFFFFFFFFFFFFF8FF80000000000 +00000000000888FFFFFFFFFFFFFFFFFFFF88800000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000008FFFFFFFFFFFFFFFFFFFF80000000000000 +00000000000004CFFFFFFFFFFFFFFFFFFC40000000000000 +000000488888848CFFFFFFFFFFFFFFFFC848888884000000 +00000CFFFFFFFFC888888888888888888CFFFFFFFFC00000 +00008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80000 +0000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0008FFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFF8000 +0000CFFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFFC0000 +00008FFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFF80000 +00000CFFFFFF8FFFFFFFFFFFFFFFFFFFFFF8FFFFFFC00000 +000000488887578888888888888888888864688884000000 +000000000000000000000000000000000000000000000000 +} + +' Layout +' ################################## + +SetDefaultLegendEntries("person\nsystem\nexternal_person\nexternal_system\nenterprise_boundary\nsystem_boundary\nboundary") + +!procedure LAYOUT_WITH_LEGEND() +hide stereotype +legend right +|**Legend** | +|<$PERSON_BG_COLOR> person | +|<$SYSTEM_BG_COLOR> system| +|<$EXTERNAL_PERSON_BG_COLOR> external person | +|<$EXTERNAL_SYSTEM_BG_COLOR> external system | +endlegend +!endprocedure + +!global $defaultPersonSprite = "person" +!$dummy = $restoreEmpty("person", "sprite", $defaultPersonSprite, %true()) +UpdateElementStyle("person") +' workaround of plantuml.jar bug - person overwrites external_person setting +!$dummy = $restoreEmpty("external_person", "sprite", $defaultPersonSprite, %true()) +UpdateElementStyle("external_person") +!global $portraitPerson = "false" + +!procedure $clearPersonRestore() + !$dummy = $clearRestore("person", "sprite") + !$dummy = $clearRestore("person", "legendSprite") + %set_variable_value("$" + "person" + "ElementTagSprite", "") + UpdateElementStyle("person") + ' workaround of plantuml.jar bug - person overwrites external_person setting + !$dummy = $clearRestore("external_person", "sprite") + !$dummy = $clearRestore("external_person", "legendSprite") + %set_variable_value("$" + "external_person" + "ElementTagSprite", "") + UpdateElementStyle("external_person") +!endprocedure + +!procedure HIDE_PERSON_SPRITE() + !$defaultPersonSprite = "" + !$portraitPerson = "false" + $clearPersonRestore() +!endprocedure + +!unquoted procedure SHOW_PERSON_SPRITE($sprite="") + !if ($sprite == "") + !$defaultPersonSprite = "person" + !else + !$defaultPersonSprite = $sprite + !endif + !$dummy = $restoreEmpty("person", "sprite", $defaultPersonSprite, %true()) + UpdateElementStyle("person") + ' workaround of plantuml.jar bug - person overwrites external_person setting + !$dummy = $restoreEmpty("external_person", "sprite", $defaultPersonSprite, %true()) + UpdateElementStyle("external_person") + !$portraitPerson = "false" +!endprocedure + +!unquoted procedure SHOW_PERSON_PORTRAIT() + !$defaultPersonSprite = "" + !$portraitPerson = "portrait" + $clearPersonRestore() +!endprocedure + +!unquoted procedure SHOW_PERSON_OUTLINE() + !$defaultPersonSprite = "" + !$portraitPerson = "outline" + $clearPersonRestore() +!endprocedure + +' Elements +' ################################## + +!function $getPerson($label, $type, $descr, $sprite) + !if ($sprite == "") && ($defaultPersonSprite != "") + !$sprite = $defaultPersonSprite + !endif + !return $getElementBase($label, $type, $descr, $sprite) +!endfunction + +!unquoted procedure Person($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "person") +' $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "person") +!if ($portraitPerson == "portrait") && ($sprite == "") +actor "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("person", $tags) as $alias $getLink($link) +!elseif ($portraitPerson == "outline") && ($sprite == "") +person "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("person", $tags) as $alias $getLink($link) +!else +rectangle "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("person", $tags) as $alias $getLink($link) +!endif +!endprocedure + +!unquoted procedure Person_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "external_person") +' $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "external_person") +!if ($portraitPerson == "portrait") && ($sprite == "") +actor "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("external_person", $tags) as $alias $getLink($link) +!elseif ($portraitPerson == "outline") && ($sprite == "") +person "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("external_person", $tags) as $alias $getLink($link) +!else +rectangle "$getPerson($label, $type, $descr, $sprite)$getProps()" $toStereos("external_person", $tags) as $alias $getLink($link) +!endif +!endprocedure + +!unquoted procedure System($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="", $baseShape="rectangle") + ' $type reuses $techn definition of $tags + $getElementLine($baseShape, "system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemDb($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getElementLine("database", "system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemQueue($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getElementLine("queue", "system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure System_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="", $baseShape="rectangle") + ' $type reuses $techn definition of $tags + $getElementLine($baseShape , "external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemDb_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getElementLine("database", "external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemQueue_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getElementLine("queue", "external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +' Boundaries +' ################################## + +!unquoted procedure Enterprise_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+enterprise' + !else + !$allTags = 'enterprise' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure + +!unquoted procedure System_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+system' + !else + !$allTags = 'system' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4_Deployment.puml b/Documentation/Issue-62/Diagrams/.c4s/C4_Deployment.puml new file mode 100644 index 000000000..b780d0e7c --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4_Deployment.puml @@ -0,0 +1,140 @@ +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally +!if %variable_exists("RELATIVE_INCLUDE") + !include ./C4_Container.puml +!else + !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml +!endif + +' Colors +' ################################## + +!$NODE_FONT_COLOR ?= "#000000" +!$NODE_BG_COLOR ?= "#FFFFFF" +!$NODE_BORDER_COLOR ?= "#A2A2A2" + +' Styling +' ################################## + +' PlantUML supports no automatic line breaks of "PlantUML containers" (C4 Deployment_Node is a "PlantUML container") +' therefore (Deployment_)Node() implements an automatic line break based on spaces (like in all other objects). +' If a $type contains \n then these are used (and no automatic space based line breaks are done) +' $NODE_TYPE_MAX_CHAR_WIDTH defines the automatic line break position +!$NODE_TYPE_MAX_CHAR_WIDTH ?= 35 +!$NODE_DESCR_MAX_CHAR_WIDTH ?= 32 + +UpdateElementStyle("node", $bgColor=$NODE_BG_COLOR, $fontColor=$NODE_FONT_COLOR, $borderColor=$NODE_BORDER_COLOR) +skinparam rectangle<> { + FontStyle normal +} + +' shortcuts with default colors +' node specific: $techn is only used in old scripts, new scripts uses $type ($techn has to remain, it could be called via named argument) +!unquoted procedure AddNodeTag($tagStereo, $bgColor="", $fontColor="", $borderColor="", $shadowing="", $shape="", $sprite="", $type="", $legendText="", $legendSprite="", $techn="", $borderStyle="", $borderThickness="") + !$type=$type+$techn + $addElementTagInclReuse("node", $tagStereo, $bgColor, $fontColor, $borderColor, $shadowing, $shape, $sprite, $type, $legendText, $legendSprite, $borderStyle, $borderThickness) +!endprocedure + +' Layout +' ################################## + +' comment if node should not be added to legend. No calculated legend extension required +SetDefaultLegendEntries("person\nsystem\ncontainer\nexternal_person\nexternal_system\nexternal_container\nnode\nenterprise_boundary\nsystem_boundary\ncontainer_boundary\nboundary") + +' Line breaks +' ################################## + +' $breakTechn() in C4 supports //...//; $breakNode() in C4_Deployment supports no //....// +!unquoted function $breakNode($text, $widthStr) + !$usedNewLine = '\n' + !return $breakText($text, $usedNewLine, $widthStr) +!endfunction + +' Elements +' ################################## + +!function $getNode($label, $type, $descr, $sprite) + !$nodeText = "" + !if ($sprite != "") + !$nodeText = $nodeText + $getSprite($sprite) + '\n' + !endif + !$nodeText = $nodeText + '== ' + $breakText($label, "\n== ") + !if ($type != "") + !$nodeText = $nodeText + '\n[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' + !endif + !if ($descr != "") + !$nodeText = $nodeText + '\n\n' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH) + !endif + !return $nodeText +!endfunction + +!function $getNode_L($label, $type, $descr, $sprite) + !$nodeText = "" + !if ($sprite != "") + !$nodeText = $nodeText + $getSprite($sprite) + '\l' + !endif + !$nodeText = $nodeText + '== ' + $breakText($label, "\l== ") + !if ($type != "") + !$nodeText = $nodeText + '\l[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' + !endif + !if ($descr != "") + !$nodeText = $nodeText + '\l\l' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH) + !endif + !return $nodeText +!endfunction + +!function $getNode_R($label, $type, $descr, $sprite) + !$nodeText = "" + !if ($sprite != "") + !$nodeText = $nodeText + $getSprite($sprite) + '\r' + !endif + !$nodeText = $nodeText + '== ' + $breakText($label, "\r== ") + !if ($type != "") + !$nodeText = $nodeText + '\r[' + $breakNode($type, $NODE_TYPE_MAX_CHAR_WIDTH) + ']' + !endif + !if ($descr != "") + !$nodeText = $nodeText + '\r\r' + $breakDescr($descr, $NODE_DESCR_MAX_CHAR_WIDTH) + !endif + !return $nodeText +!endfunction + +!unquoted procedure Deployment_Node($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode($label, $type, $descr, $sprite)$getProps()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure + +!unquoted procedure Deployment_Node_L($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode_L($label, $type, $descr, $sprite)$getProps_L()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure + +!unquoted procedure Deployment_Node_R($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode_R($label, $type, $descr, $sprite)$getProps_R()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure + +!unquoted procedure Node($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode($label, $type, $descr, $sprite)$getProps()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure + +!unquoted procedure Node_L($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode_L($label, $type, $descr, $sprite)$getProps_L()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure + +!unquoted procedure Node_R($alias, $label, $type="", $descr="", $sprite="", $tags="", $link="") +!$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", "node") +' nodes $type reuses $techn definition of $tags +!$type=$toElementArg($type, $tags, "ElementTagTechn", "node") +rectangle "$getNode_R($label, $type, $descr, $sprite)$getProps_R()" $toStereos("node",$tags) as $alias $getLink($link) +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/.c4s/C4_Sequence.puml b/Documentation/Issue-62/Diagrams/.c4s/C4_Sequence.puml new file mode 100644 index 000000000..81e051610 --- /dev/null +++ b/Documentation/Issue-62/Diagrams/.c4s/C4_Sequence.puml @@ -0,0 +1,406 @@ +' convert it with additional command line argument -DRELATIVE_INCLUDE="relative/absolute" to use locally +!if %variable_exists("RELATIVE_INCLUDE") + !include ./C4_Component.puml +!else + !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml +!endif + +' Scope: Interactions in an enterprise, software system or container. +' Primary and supporting elements: Depends on the diagram scope - +' enterprise - people and software systems Related to the enterprise in scope +' software system - see system context or container diagrams, +' container - see component diagram. +' Intended audience: Technical and non-technical people, inside and outside of the software development team. + +' Sequence diagram introduces (automatically) numbered interactions: +' (lowercase) increment($offset=1): increase current index (procedure which has no direct output) +' (lowercase) setIndex($new_index): set the new index (procedure which has no direct output) +' +' (Uppercase) LastIndex(): return the last used index (function which can be used as argument) +' (Uppercase) Index($offset=1): returns current index and calculates next index (function which can be used as argument) +' (Uppercase) SetIndex($new_index): returns new set index and calculates next index (function which can be used as argument) + +' enables multi-level boxes +!pragma teoz true + + +' Legend redefintion +' ################################## +' sequence has no dashed boxes +!if ($LEGEND_DASHED_BOUNDARY == "dashed") + !$LEGEND_DASHED_BOUNDARY = "" +!endif +!if ($LEGEND_DASHED_TRANSPARENT_BOUNDARY == "dashed") + !$LEGEND_DASHED_TRANSPARENT_BOUNDARY = "" +!endif +UpdateBoundaryStyle("", $bgColor=$BOUNDARY_BG_COLOR, $fontColor=$BOUNDARY_COLOR, $borderColor=$BOUNDARY_COLOR) +UpdateBoundaryStyle("enterprise", $bgColor=$ENTERPRISE_BOUNDARY_BG_COLOR, $fontColor=$ENTERPRISE_BOUNDARY_COLOR, $borderColor=$ENTERPRISE_BOUNDARY_COLOR, $type="Enterprise") +UpdateBoundaryStyle("system", $bgColor=$SYSTEM_BOUNDARY_BG_COLOR, $fontColor=$SYSTEM_BOUNDARY_COLOR, $borderColor=$SYSTEM_BOUNDARY_COLOR, $type="System") +UpdateBoundaryStyle("container", $bgColor=$CONTAINER_BOUNDARY_BG_COLOR, $fontColor=$CONTAINER_BOUNDARY_COLOR, $borderColor=$CONTAINER_BOUNDARY_COLOR, $type="Container") + +' Styling and Layout +' ################################## + +!global $display_element_description = %false() + +' typically the element/participant descriptions are not displayed in a sequence diagram, but it can be activated with this call +!unquoted procedure SHOW_ELEMENT_DESCRIPTIONS($show="true") +!if ($show == "true") + !global $display_element_description = %true() +!else + !global $display_element_description = %false() +!endif +!endprocedure + +' typically the foot boxes descriptions are not displayed in a sequence diagram, but it can be activated with this call +!unquoted procedure SHOW_FOOT_BOXES($show="true") +!if ($show == "true") + show footbox +!else + hide footbox +!endif +!endprocedure + +!global $show_index = %false() +' All relation specific (default) ordinary index numbers can be shown with this call +!unquoted procedure SHOW_INDEX($show="true") +!if ($show == "true") + !global $show_index = %true() +!else + !global $show_index = %false() +!endif +!endprocedure + +' ======= if no theme is defined hide foot box and activate C4_blue styles +!if (%variable_exists("$THEME")) +!else +' $BOUNDARY_BG_COLOR... have to be defined in theme itself that it can be used in styles,... +' (no default values which are defined in C4.puml) +' If skinparams and styles are defined with concrete values no variables are required +!$BOUNDARY_BG_COLOR ?= "transparent" +!$BOUNDARY_COLOR ?= "#444444" +!$ARROW_COLOR ?= "#666666" + +' replace transparent with concrete background that it can be used as font color too +!if ($BOUNDARY_BG_COLOR == "transparent") + !$SEQUENCE_BG_COLOR = white +!else + !$SEQUENCE_BG_COLOR = $BOUNDARY_BG_COLOR +!endif + +' "C4 styled" default is no foot boxes +hide footbox +' "C4 styled" default is that lifeline is arrow color +skinparam SequenceLifelineBorderColor $ARROW_COLOR + +skinparam SequenceGroupBodyBackgroundColor $SEQUENCE_BG_COLOR +skinparam SequenceGroupFontColor $BOUNDARY_COLOR +skinparam SequenceGroupBackgroundColor $BOUNDARY_COLOR +skinparam SequenceGroupHeaderFontColor $SEQUENCE_BG_COLOR +skinparam SequenceGroupBorderColor $BOUNDARY_COLOR + +skinparam SequenceReferenceBackgroundColor $SEQUENCE_BG_COLOR +skinparam SequenceReferenceFontColor $BOUNDARY_COLOR +skinparam SequenceReferenceHeaderBackgroundColor $BOUNDARY_COLOR +' VIA STYLE +' skinparam SequenceReferenceHeaderFontColor $SEQUENCE_BG_COLOR + +skinparam SequenceReferenceBorderColor $BOUNDARY_COLOR + +skinparam SequenceDividerBackgroundColor $SEQUENCE_BG_COLOR +skinparam SequenceDividerFontColor $BOUNDARY_COLOR +skinparam SequenceDividerBorderColor $BOUNDARY_COLOR + +' VIA STYLE +' skinparam SequenceDelayFontColor green + +!endif +' ======= if no theme is defined hide foot box and activate C4_blue styles + +' Elements redefinition +' ################################## + +' all elements have to be displayed as participant +' participants requires ` %newline()` instead of `\n` + +!unquoted function $breakWithNewline($text, $lineEnd, $lineStart, $widthStr="-1") +!$width = %intval($widthStr) +!$multiLine = "" +!if (%strpos($text, "\n") >= 0) + !while (%strpos($text, "\n") >= 0) + !$brPos = %strpos($text, "\n") + !if ($brPos > 0) + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $lineEnd + %newline() + $lineStart + !else + ' non breaking change that newLine breaks with formats can be used with \n\n + !$multiLine = $multiLine + "" + $lineEnd + %newline() + $lineStart + !endif + !$text = %substr($text, $brPos+2) + !if (%strlen($text) == 0) + !$text = "" + !endif + !endwhile +!else + !while ($width>0 && %strlen($text) > $width) + !$brPos = $width + !while ($brPos > 0 && %substr($text, $brPos, 1) != ' ') + !$brPos = $brPos - 1 + !endwhile + + !if ($brPos < 1) + !$brPos = %strpos($text, " ") + !else + !endif + + !if ($brPos > 0) + !$multiLine = $multiLine + %substr($text, 0, $brPos) + $lineEnd + %newline() + $lineStart + !$text = %substr($text, $brPos + 1) + !else + !$multiLine = $multiLine+ $text + !$text = "" + !endif + !endwhile +!endif +!if (%strlen($text) > 0) + !$multiLine = $multiLine + $text +!endif +!return $multiLine +!endfunction + +!unquoted function $breakNewLineLabel($text) +!$multiLine = $breakWithNewline($text, "", "==") +!return $multiLine +!endfunction + +!unquoted function $breakNewLineDescr($text) + !return $breakWithNewline($text, "", "", $REL_DESCR_MAX_CHAR_WIDTH) +!endfunction + +!unquoted function $breakNewLineTechn($text) + !$lineStart = "//" + !$lineEnd = '//' + !return $breakWithNewline($text, $lineStart, $lineEnd, $REL_TECHN_MAX_CHAR_WIDTH) +!endfunction + +' properties are not displayed in sequence diagram (size would be too big) +' $breakLabel() not required by participant +!procedure $getParticipant($elementType, $alias, $label, $techn, $descr, $sprite, $tags, $link) + !$sprite=$toElementArg($sprite, $tags, "ElementTagSprite", $elementType) + !$techn=$toElementArg($techn, $tags, "ElementTagTechn", $elementType) + !$stereo = $toStereos($elementType,$tags) + !$calcLabel = "== " + $breakNewLineLabel($label) + !$calcTech = "//[" + $breakNewLineTechn($techn) + "]//" + !$calcDescr = $breakNewLineDescr($descr) + !$calcLink = $getLink($link) + +participant $alias $stereo $calcLink [ +!if ($sprite != "") +$getSprite($sprite) +!endif +!if ($label != "") +$calcLabel +!endif +!if ($techn != "") +$calcTech +!endif +!if ($display_element_description == %true() && $descr != "") + +$calcDescr +!endif +] +!endprocedure + + +!unquoted procedure Person($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("person", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Person_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("external_person", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure System($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="", $baseShape="rectangle") + ' $type reuses $techn definition of $tags + $getParticipant("system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemDb($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemQueue($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure System_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="", $baseShape="rectangle") + ' $type reuses $techn definition of $tags + $getParticipant("external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemDb_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure SystemQueue_Ext($alias, $label, $descr="", $sprite="", $tags="", $link="", $type="") + ' $type reuses $techn definition of $tags + $getParticipant("external_system", $alias, $label, $type, $descr, $sprite, $tags, $link) +!endprocedure + + + +!unquoted procedure Container($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getParticipant("container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerDb($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerQueue($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Container_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getParticipant("external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerDb_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ContainerQueue_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("external_container", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + + + +!unquoted procedure Component($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getParticipant("component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentDb($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentQueue($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure Component_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $baseShape="rectangle") + $getParticipant("external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentDb_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + +!unquoted procedure ComponentQueue_Ext($alias, $label, $techn="", $descr="", $sprite="", $tags="", $link="") + $getParticipant("external_component", $alias, $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure + + +' Boundary redefinition +' ################################## + +' all boundaries have to be displayed as box and +' !!! important changes: without { at the end; and boundary ends with Boundary_End() instead of } + +' alias ignored +' $breakLabel() not required by participant + +!unquoted procedure Boundary($alias, $label, $type="", $tags="", $link="", $descr = "") +!$boundaryTags = $addBoundaryPostfix($tags) +' boundary $type reuses $techn definition of $boundaryTags +!$type=$toElementArg($type, $boundaryTags, "ElementTagTechn", "boundary") +!$sprite=$toElementArg("", $boundaryTags, "ElementTagSprite", "boundary") +!$labelSprite="" +!if ($sprite != "") + ' add sprite in label line that it is more compact + !$labelSprite = $getSprite($smallVersionSprite($sprite, $BOUNDARY_IMAGE_SIZE_FACTOR)) + ' ' +!endif +!if ($link != "") + !$usedNewLine = ']]\n== [[' + $link + ' ' + !$labelType = '== [[' + $link + ' ' + $labelSprite + $breakText($label, $usedNewLine) + ']]' +!else + !$usedNewLine = '\n== ' + !$labelType = $labelSprite + $breakText($label, $usedNewLine) +!endif +!if (type != "") + !$labelType = $labelType + '\n[' + $type + ']' +!endif +!if ($display_element_description == %true() && $descr != "") + !$labelType = $labelType + '\n\n' + $breakDescr($descr, $BOUNDARY_DESCR_MAX_CHAR_WIDTH) +!endif +box "$labelType" $toStereos("boundary", $boundaryTags) +!endprocedure + +!procedure Boundary_End() +end box +!endprocedure + +!unquoted procedure Enterprise_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+enterprise' + !else + !$allTags = 'enterprise' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure + +!unquoted procedure System_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+system' + !else + !$allTags = 'system' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure + +!unquoted procedure Container_Boundary($alias, $label, $tags="", $link="", $descr = "") + !if ($tags != "") + !$allTags = $tags + '+container' + !else + !$allTags = 'container' + !endif + ' $type defined via $tag style + Boundary($alias, $label, "", $allTags, $link, $descr) +!endprocedure + +' Relationship (redefinition) +' ################################## + +' only Rel is supported in sequence diagram + +' first Rel() supports the $index and $rel argument too; second Rel() overwrites C4.puml definition +' don't add empty lines in procedure otherwise & calls are not working anymore '& a -> b: call' are not working anymore +!unquoted procedure Rel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="", $index="", $rel="") + !if ($show_index == %true()) + !$pre = $getPrefix($index) + !else + !$pre = "" + !endif + !if ($rel == "") + !$rel = "->" + !endif +$getRel($rel, $from, $to, $pre + $label, $techn, $descr, $sprite, $tags, $link) +!endprocedure +!unquoted procedure Rel($from, $to, $label, $techn="", $descr="", $sprite="", $tags="", $link="") +Rel($from, $to, $label, $techn, $descr, $sprite, $tags, $link, "", "") +!endprocedure \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.png b/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae61f4e5a0b6613fc883ddb5de1d36e72a05169 GIT binary patch literal 96606 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­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 literal 0 HcmV?d00001 diff --git a/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.puml b/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.puml new file mode 100644 index 000000000..e451dfc25 --- /dev/null +++ b/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Development/Container - C4 Deployment.puml @@ -0,0 +1,38 @@ +@startuml +!include ..\..\..\.c4s\C4_Container.puml +!include ..\..\..\.c4s\C4_Deployment.puml + +title Big Bank Plc - Development - C4 Deployment - Container level + +Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop, "Developer Laptop", $type="Microsoft Windows 10 or Apple macOS", "") { + Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.WebBrowser, "Web Browser", $type="Chrome, Firefox, Safari, or Edge", "") { + Container(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.WebBrowser.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp, "Single-Page Application", "JavaScript, Angular", "Provides all of the Internet banking functionality to customers via their web browser.") + } + + Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer, "Docker Container - Web Server", $type="Docker", "") { + Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat, "Apache Tomcat", $type="Apache Tomcat 8.x", "") { + Container(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication, "Web Application", "Java, Spring MVC", "Delivers the static content and the Internet banking SPA") + Container(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication, "API Application", "Java, Spring MVC", "Provides Internet banking functionality via API") + } + } + + Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerDatabaseServer, "Docker Container - Database Server", $type="Docker", "") { + Deployment_Node(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerDatabaseServer.Nodes.DatabaseServer, "Database Server", $type="Oracle 12c", "") { + ContainerDb(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerDatabaseServer.Nodes.DatabaseServer.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.Database, "Database", "Oracle Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") + } + } +} + +Deployment_Node(BigBankPlc.Environments.Development.Nodes.BigBankPlc, "Big Bank plc", $type="Big Bank plc data center", "") { + Deployment_Node(BigBankPlc.Nodes.BigBankDev001, "bigbank-dev001", $type="", "") { + System(BigBankPlc.Environments.Development.Nodes.BigBankPlc.Nodes.BigBankDev001.Deployments.BigBankPlc.SoftwareSystems.MainframeBankingSystem, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") + } +} + +Rel(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.WebApplication, BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.WebBrowser.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp, "Load And Start", "HTTPS", $tags='protocol:https') +Rel(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.WebBrowser.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.SinglePageApp, BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication, "Sign In\nChange Password\nGet Customer\nGet Customer Accounts\nGet Account Transactions\nCreate Account", "HTTPS", $tags='protocol:https') +Rel(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication, BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerDatabaseServer.Nodes.DatabaseServer.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.Database, "Authenticate User\nUpdate User Password", "TCP/IP, SQL", $tags='protocol:tcp/ip, sql') +Rel(BigBankPlc.Environments.Development.Nodes.DeveloperLaptop.Nodes.DockerContainerWebServer.Nodes.ApacheTomcat.Deployments.BigBankPlc.SoftwareSystems.InternetBanking.Containers.APIApplication, BigBankPlc.Environments.Development.Nodes.BigBankPlc.Nodes.BigBankDev001.Deployments.BigBankPlc.SoftwareSystems.MainframeBankingSystem, "Get Customer\nGet Customer Accounts\nGet Account Transactions\nCreate Account", "XML/HTTPS", $tags='protocol:xml/https') + +SHOW_LEGEND(true) +@enduml \ No newline at end of file diff --git a/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Live/Container - C4 Deployment.png b/Documentation/Issue-62/Diagrams/Big Bank Plc/Envirinments/Live/Container - C4 Deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..4170016289c4b68dd55956c7b87bc7e05675c619 GIT binary patch literal 155413 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