L'ancienne syntaxe pour les diagrammes d'activité possédait plusieurs limitations et inconvénients (par exemple, la difficulté à maintenir un diagramme lors de modifications).
Une nouvelle syntaxe est maintenant proposée aux utilisateurs. Un autre avantage de cette nouvelle implémentation est qu'il n'y a pas besoin d'avoir Graphviz d'installé (comme pour les diagrammes de séquences).
La nouvelle syntaxe remplace l'ancienne. Cependant, pour des raisons de compatibilité, l'ancienne syntaxe reste reconnue, pour assurer la compatibilité ascendante.
Les utilisateurs sont simplement encouragés à migrer vers la nouvelle syntaxe.
Activity Diagram (new)
Old syntax for activity diagram had several limitations and
drawbacks (for example, it's difficult to maintain).
So a completely new syntax and implementation is now available to users. Another advantage of this implementation is that it's done without the need of having
Graphviz installed (as for sequence diagrams).
This syntax will replace the old legacy one. However, for compatibility reason, the old syntax will still be recognized, to ensure ascending compatibility.
Users are simply encouraged to migrate to the new syntax.
Activité simple
Les étiquettes d'activités commencent avec : et finissent avec ;.
Le formatage de texte peut être fait en utilisant la syntaxe créole wiki.
Les activités sont implicitement liées à leur ordre de définition.
@startuml
:Hello world;
:This is on defined on
several **lines**;
@enduml
Simple action
Activities label starts with : and ends with ;.
Text formatting can be done using creole wiki syntax.
They are implicitly linked in their definition order.
@startuml
:Hello world;
:This is defined on
several **lines**;
@enduml
Départ/Arrêt [start, stop, end]
Vous pouvez utiliser les mots clés start et stop pour indiquer le début et la fin du diagramme.
@startuml
start
:Hello world;
:This is on defined on
several **lines**;
stop
@enduml
Vous pouvez aussi utiliser le mot clé end.
@startuml
start
:Hello world;
:This is on defined on
several **lines**;
end
@enduml
Start/Stop/End
You can use start and stop keywords to denote the
beginning and the end of a diagram.
@startuml
start
:Hello world;
:This is defined on
several **lines**;
stop
@enduml
You can also use the end keyword.
@startuml
start
:Hello world;
:This is defined on
several **lines**;
end
@enduml
Conditionnel [if, then, else]
Vous pouvez utiliser les mots clés if, then et else pour mettre des tests dans votre diagramme.
Les étiquettes peuvent être fournies entre parenthèses.
Les trois syntaxes possibles sont:
if (...) then (...)
@startuml
start
if (Graphviz installed?) then (yes)
:process all\ndiagrams;
else (no)
:process only
__sequence__ and __activity__ diagrams;
endif
stop
@enduml
if (...) is (...) then
@startuml
if (color?) is (<color:red>red) then
:print red;
else
:print not red;
@enduml
if (...) equals (...) then
@startuml
if (counter?) equals (5) then
:print 5;
else
:print not 5;
@enduml
Vous pouvez utiliser le mot clé elseif pour avoir plusieurs tests, par défaut le mode est horizontal :
@startuml
start
if (condition A) then (yes)
:Text 1;
elseif (condition B) then (yes)
:Text 2;
stop
elseif (condition C) then (yes)
:Text 3;
elseif (condition D) then (yes)
:Text 4;
else (nothing)
:Text else;
endif
stop
@enduml
Plusieurs conditions (en mode vertical)
Vous pouvez utiliser la commande !pragma useVerticalIf on pour avoir les conditions en mode vertical :
@startuml
!pragma useVerticalIf on
start
if (condition A) then (yes)
:Text 1;
elseif (condition B) then (yes)
:Text 2;
stop
elseif (condition C) then (yes)
:Text 3;
elseif (condition D) then (yes)
:Text 4;
else (nothing)
:Text else;
endif
stop
@enduml
You can use if, then and else keywords to put tests in your diagram.
Labels can be provided using parentheses.
The 3 syntaxes are possible:
if (...) then (...)
@startuml
start
if (Graphviz installed?) then (yes)
:process all\ndiagrams;
else (no)
:process only
__sequence__ and __activity__ diagrams;
endif
stop
@enduml
if (...) is (...) then
@startuml
if (color?) is (<color:red>red) then
:print red;
else
:print not red;
@enduml
if (...) equals (...) then
@startuml
if (counter?) equals (5) then
:print 5;
else
:print not 5;
@enduml
You can use the elseif keyword to have several tests (by default, it is the horizontal mode):
@startuml
start
if (condition A) then (yes)
:Text 1;
elseif (condition B) then (yes)
:Text 2;
stop
elseif (condition C) then (yes)
:Text 3;
elseif (condition D) then (yes)
:Text 4;
else (nothing)
:Text else;
endif
stop
@enduml
Several tests (vertical mode)
You can use the command !pragma useVerticalIf on to have the tests in vertical mode:
@startuml
!pragma useVerticalIf on
start
if (condition A) then (yes)
:Text 1;
elseif (condition B) then (yes)
:Text 2;
stop
elseif (condition C) then (yes)
:Text 3;
elseif (condition D) then (yes)
:Text 4;
else (nothing)
:Text else;
endif
stop
@enduml
d'utiliser une vrai action comme cible de répétition, après le premier mot clé repeat,
d'insérer une action dans le chemin de retour à l'aide du mot clé backward.
@startuml
start
repeat :foo as starting label;
:read data;
:generate diagrams;
backward:This is backward;
repeat while (more data?)
stop
@enduml
Repeat loop
You can use repeat and repeatwhile keywords to have repeat loops.
@startuml
start
repeat
:read data;
:generate diagrams;
repeat while (more data?) is (yes)
->no;
stop
@enduml
It is also possible to use a full action as repeat target and insert an action in the return path using the backward keyword.
@startuml
start
repeat :foo as starting label;
:read data;
:generate diagrams;
backward:This is backward;
repeat while (more data?)
stop
@enduml
Interruption d'une boucle [break]
Vous pouvez interrompre une boucle après une action en utilisant
le mot clé break :
@startuml
start
repeat
:Test something;
if (Something went wrong?) then (no)
#palegreen:OK;
break
endif
->NOK;
:Alert "Error with long text";
repeat while (Something went wrong with long text?) is (yes) not (no)
->//merged step//;
:Alert "Sucess";
stop
@enduml
@startuml
start
repeat
:Test something;
if (Something went wrong?) then (no)
#palegreen:OK;
break
endif
->NOK;
:Alert "Error with long text";
repeat while (Something went wrong with long text?) is (yes) not (no)
->//merged step//;
:Alert "Sucess";
stop
@enduml
You can use kill or detach to make an output split (multi-end):
@startuml
start
split
:A;
kill
split again
:B;
detach
split again
:C;
kill
end split
@enduml
@startuml
start
split
:A;
kill
split again
:b;
:c;
detach
split again
(Z)
detach
split again
end
split again
stop
end split
@enduml
Notes
Le formattage de texte peut être fait en utilisant la syntaxe créole wiki.
Une note peut aussi être détachée, à l'aide du mot-clé floating.
@startuml
start
:foo1;
floating note left: This is a note
:foo2;
note right
This note is on several
//lines// and can
contain <b>HTML</b>
====
* Calling the method ""foo()"" is prohibited
end note
stop
@enduml
Vous pouvez ajouter une note sur un chemin de retour.
@startuml
start
repeat :Enter data;
:Submit;
backward :Warning;
note right: Note
repeat while (Valid?) is (No) not (Yes)
stop
@enduml
Text formatting can be done using creole wiki syntax.
A note can be floating, using floating keyword.
@startuml
start
:foo1;
floating note left: This is a note
:foo2;
note right
This note is on several
//lines// and can
contain <b>HTML</b>
====
* Calling the method ""foo()"" is prohibited
end note
stop
@enduml
You can add note on backward activity.
@startuml
start
repeat :Enter data;
:Submit;
backward :Warning;
note right: Note
repeat while (Valid?) is (No) not (Yes)
stop
@enduml
Vous pouvez spécifier une couleur pour certaines activités.
@startuml
start
:starting progress;
#HotPink:reading configuration files
These files should edited at this point!;
#AAAAAA:ending of the process;
@enduml
@startuml
start
:starting progress;
#HotPink:reading configuration files
These files should be edited at this point!;
#AAAAAA:ending of the process;
@enduml
Lignes sans pointe de flèches
Vous pouvez utiliser skinparam ArrowHeadColor none pour connecter des activités en utilisant uniquement des lignes, sans flèches (sans pointe sur les flèches).
@startuml
skinparam ArrowHeadColor none
start
:Hello world;
:This is on defined on
several **lines**;
stop
@enduml
@startuml
skinparam ArrowHeadColor none
start
repeat :Enter data;
:Submit;
backward :Warning;
repeat while (Valid?) is (No) not (Yes)
stop
@enduml
Lines without arrows
You can use skinparam ArrowHeadColor none in order to connect activities using lines only, without arrows.
@startuml
skinparam ArrowHeadColor none
start
:Hello world;
:This is on defined on
several **lines**;
stop
@enduml
@startuml
skinparam ArrowHeadColor none
start
repeat :Enter data;
:Submit;
backward :Warning;
repeat while (Valid?) is (No) not (Yes)
stop
@enduml
Flèches
En utilisant la notation ->, vous pouvez ajouter du texte à une flèche, et changer sa couleur.
Il est aussi possible d'avoir des flèches en pointillé, en gras, avec des tirets ou bien complètement cachées.
@startuml
:foo1;
-> You can put text on arrows;
if (test) then
-[#blue]->
:foo2;
-[#green,dashed]-> The text can
also be on several lines
and **very** long...;
:foo3;
else
-[#black,dotted]->
:foo4;
endif
-[#gray,bold]->
:foo5;
@enduml
Arrows
Using the -> notation, you can add texts to arrow, and change
their color.
It's also possible to have dotted, dashed, bold or hidden arrows.
@startuml
:foo1;
-> You can put text on arrows;
if (test) then
-[#blue]->
:foo2;
-[#green,dashed]-> The text can
also be on several lines
and **very** long...;
:foo3;
else
-[#black,dotted]->
:foo4;
endif
-[#gray,bold]->
:foo5;
@enduml
Connecteurs
Il est possible d'utiliser des parenthèses pour dessiner des connecteurs.
@startuml
start
:The connector below
wishes he was blue;
#blue:(B)
:This next connector
feels that she would
be better off green;
#green:(G)
stop
@enduml
@startuml
start
:The connector below
wishes he was blue;
#blue:(B)
:This next connector
feels that she would
be better off green;
#green:(G)
stop
@enduml
You can add if conditional or repeat or while loop within swimlanes.
@startuml
|#pink|Actor_For_red|
start
if (color?) is (red) then
#pink:**action red**;
:foo1;
else (not red)
|#lightgray|Actor_For_no_red|
#lightgray:**action not red**;
:foo2;
endif
|Next_Actor|
#lightblue:foo3;
:foo4;
|Final_Actor|
#palegreen:foo5;
stop
@enduml
Détacher ou arrêter [detach, kill]
Il est possible de supprimer une flèche en utilisant le mot clé detach ou kill :
detach
@startuml
:start;
fork
:foo1;
:foo2;
fork again
:foo3;
detach
endfork
if (foo4) then
:foo5;
detach
endif
:foo6;
detach
:foo7;
stop
@enduml
kill
@startuml
:start;
fork
:foo1;
:foo2;
fork again
:foo3;
kill
endfork
if (foo4) then
:foo5;
kill
endif
:foo6;
kill
:foo7;
stop
@enduml
Detach or kill [detach, kill]
It's possible to remove an arrow using the detach or kill keyword:
detach
@startuml
:start;
fork
:foo1;
:foo2;
fork again
:foo3;
detach
endfork
if (foo4) then
:foo5;
detach
endif
:foo6;
detach
:foo7;
stop
@enduml
kill
@startuml
:start;
fork
:foo1;
:foo2;
fork again
:foo3;
kill
endfork
if (foo4) then
:foo5;
kill
endif
:foo6;
kill
:foo7;
stop
@enduml
SDL (Specification and Description Language)
En changeant le séparateur final ;, vous pouvez déterminer différents rendus pour l’activité, conformément au langage de description et de spécification (LDS) ou Specification and Description Language (SDL) (en anglais) :
|
<
>
/
\\
]
}
@startuml
:Ready;
:next(o)|
:Receiving;
split
:nak(i)<
:ack(o)>
split again
:ack(i)<
:next(o)
on several line|
:i := i + 1]
:ack(o)>
split again
:err(i)<
:nak(o)>
split again
:foo/
split again
:bar\\
split again
:i > 5}
stop
end split
:finish;
@enduml
SDL (Specification and Description Language)
By changing the final ; separator, you can set different rendering for the activity:
|
<
>
/
\\
]
}
@startuml
:Ready;
:next(o)|
:Receiving;
split
:nak(i)<
:ack(o)>
split again
:ack(i)<
:next(o)
on several lines|
:i := i + 1]
:ack(o)>
split again
:err(i)<
:nak(o)>
split again
:foo/
split again
:bar\\
split again
:i > 5}
stop
end split
:finish;
@enduml
Exemple complet
@startuml
start
:ClickServlet.handleRequest();
:new page;
if (Page.onSecurityCheck) then (true)
:Page.onInit();
if (isForward?) then (no)
:Process controls;
if (continue processing?) then (no)
stop
endif
if (isPost?) then (yes)
:Page.onPost();
else (no)
:Page.onGet();
endif
:Page.onRender();
endif
else (false)
endif
if (do redirect?) then (yes)
:redirect process;
else
if (do forward?) then (yes)
:Forward request;
else (no)
:Render page template;
endif
endif
stop
@enduml
Complete example
@startuml
start
:ClickServlet.handleRequest();
:new page;
if (Page.onSecurityCheck) then (true)
:Page.onInit();
if (isForward?) then (no)
:Process controls;
if (continue processing?) then (no)
stop
endif
if (isPost?) then (yes)
:Page.onPost();
else (no)
:Page.onGet();
endif
:Page.onRender();
endif
else (false)
endif
if (do redirect?) then (yes)
:redirect process;
else
if (do forward?) then (yes)
:Forward request;
else (no)
:Render page template;
endif
endif
stop
@enduml