diff --git a/Taskfile.yaml b/Taskfile.yaml index 0d8ed7a5838eee2464762f031dce50834174e289..03bc9599a1dea2039ce1f35dcfe6b1a1b50f57d4 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -64,6 +64,7 @@ tasks: - w08-asynchronism/08-asynchronism.html - w08-high-availability/08-high-availability.html - w09-cloud/09-cloud.html + - w10-hexa/10-hexa.html - w12-rendu/12-criteres-notation.html cmds: - for: sources diff --git a/images/hexa.png b/images/hexa.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb0ba40131fd4fa96da4d12da71eb9a8c5f43f4 Binary files /dev/null and b/images/hexa.png differ diff --git a/index.html b/index.html index 2404b46a4579972f216b5ce76adb05e90d20a49a..6c90b1e9025fe43409e3925671d62a8c3b86dbb8 100644 --- a/index.html +++ b/index.html @@ -311,7 +311,7 @@ <div class="card h-100"> <img class="card-img-top" - src="images/placeholder.png" + src="images/hexa.png" alt="Clean Archi, et Archi Hexagonale" /> <div class="card-body"> @@ -321,6 +321,12 @@ </h5> <p class="card-text">Salade, Tomates, Oignons 🥙</p> </div> + <div class="card-footer"> + <div class="btn-group" role="group"> + <a href="w10-hexa/10-hexa.html" class="btn btn-primary">Cours</a> + <a href="w10-hexa/10-hexa.pdf" class="btn btn-secondary"><i class="bi bi-file-earmark-pdf-fill"></i></a> + </div> + </div> </div> </div> <div class="col"> diff --git a/w10-hexa/10-hexa.html b/w10-hexa/10-hexa.html new file mode 100644 index 0000000000000000000000000000000000000000..83d558c110527ab730404c1a90481bbead1e6504 --- /dev/null +++ b/w10-hexa/10-hexa.html @@ -0,0 +1,340 @@ +<!doctype html> +<html lang="fr"> + +<head> + <meta charset="utf-8"> + + <title>ALOM - Clean Archi et Archi Hexagonale</title> + + <meta name="description" content="ALOM - Clean Archi et Archi Hexagonale"> + <meta name="author" content="Julien WITTOUCK <julien@codeka.io>"> + + <meta name="apple-mobile-web-app-capable" content="yes"/> + <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/> + + <meta name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui"> + + <link rel="stylesheet" href="../reveal/dist/reveal.css"> + <link rel="stylesheet" href="../reveal/dist/theme/white.css" id="theme"> + + <link rel="stylesheet" href="../css/miage-lille.css"/> + + <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" + integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"> +</head> + +<body> + +<div class="reveal"> + + <div class="slides"> + <section> + <h1>ALOM</h1> + <h2>🥙 Clean Archi et Archi Hexagonale</h2> + <em>Salade, Tomates, Architecture Oignons</em> + </section> + + <section> + <h3><i class="fab fa-uber"></i> UBER</h3> + <img src="images/Microservice-Architecture-Of-UBER.png" style="width: 50%"/> + </section> + + <section> + <h2>Problématiques : </h2> + <p>Comment organiser le code ?</p> + <p>Comment être capable de changer de type de BDD ?</p> + <p>Minimiser le <i>Blast-Radius 💣💥</i> d'un changement</p> + <p>Séparer les responsabilités</p> + </section> + + <section> + <h2>L'architecture logicielle</h2> + <ul> + <li> + Donner forme à la construction d'un système + <ul> + <li>Division en composants</li> + <li>Arrangement des composants</li> + <li>Communication des composants</li> + </ul> + </li> + <li> + Le but : + <ul> + <li>Faciliter le développement</li> + <li>Faciliter le déploiement</li> + <li>Faciliter les opérations</li> + <li>Faciliter la maintenance</li> + </ul> + </li> + </ul> + </section> + + <section> + <h2>Les concepts des architectures logicielles</h2> + <ul> + <li> + Separation of concerns + <ul> + <li>La BDD ne doit pas dépendre des IHM</li> + <li>Les règles métier ne doivent pas dépendre de la BDD</li> + <li>Les règles métier ne doivent pas dépendre des IHM</li> + </ul> + </li> + </ul> + </section> + + <section> + <h3>👮 S.O.L.I.D principles</h3> + <ul> + <li>S : Single Responsability</li> + <span class="fragment">Une classe doit avoir une seule responsabilité</span> + <li>O : Open/Closed</li> + <span class="fragment">Ouvert à l'extension, mais fermé à la modification</span> + <li>L : Liskov Substitution</li> + <span class="fragment">Pouvoir utiliser un sous-type</span> + <li>I : Interface Segregation</li> + <span class="fragment">Présenter plusieurs interfaces spécifiques</span> + <li>D : Dependency Inversion</li> + <span class="fragment">Dépendre d'abstractions, et non d'implémentations</span> + </ul> + </section> + + <section> + <h3>Domain-Driven Design (DDD)</h3> + <img src="./images/DDD.jpg" class="img-right visible" width="15%"> + <p>Les archis modernes prennent souvent racine dans les concepts de DDD.</p> + <ul> + <li>Domaine Métier : Le cœur de l'application est la logique métier.</li> + <li>Ubiquitous Language : Un langage commun entre les développeurs et les experts métier.</li> + <li>Entities et Value Objects : Des objets qui représentent les concepts fondamentaux du métier.</li> + </ul> + </section> + + <section> + <h3>L'architecture n-tier (années 90)</h3> + <p>Séparatation physique entre les programmes et les BDD, entre les clients et les serveurs</p> + <img src="images/n-tier.png"/> + </section> + <section> + <h3>L'architecture n-tier avec Spring</h3> + <p>La vision "classique"</p> + <img src="images/n-tier-spring.png"/> + </section> + + <section> + <h3>L'architecture Hexagonale (ports et adapters)</h3> + <p>Conceptualisé par Alistair Cockburn en 2005</p> + <img src="./images/hexagon.png"/> + </section> + + <section> + <h3>La Onion Architecture</h3> + <p>Conceptualisé par Jeffrey Palermo en 2008</p> + <img src="./images/onion.png"/> + </section> + + <section> + <h3>La Clean Architecture</h3> + <p>Conceptualisé par Robert C. Martin en 2012</p> + <img src="./images/CleanArchitecture.jpg"/> + </section> + + <section> + <h3>Les éléments communs (et importants)</h3> + <ul> + <li>Séparer la logique métier des détails techniques</li> + <li>Indépendance d'un framework</li> + <li>Testabilité</li> + <li>Indépendance de la partie UI</li> + <li>Indépendance de la partie BDD</li> + </ul> + </section> + + <section data-markdown> + <textarea data-template> + ## Les moyens de mise en place + ### Packages Java +  + --- + ## Les moyens de mise en place + ### Packages Java +  + --- + ### En vision hexagonale +  + --- + ### Séparation des classes +  + --- + ### Séparation en modules +  + --- + ### Séparation en modules - parent + ```xml + <project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.example</groupId> + <artifactId>hexagonal-architecture-sample</artifactId> + <version>1.0-SNAPSHOT</version> + <packaging>pom</packaging> + + <modules> + <module>domain</module> + <module>web</module> + <module>data-jpa</module> + </modules> + +</project> + ``` + --- + ### Séparation en modules - domain + ```xml + <project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>com.example</groupId> + <artifactId>hexagonal-architecture-sample</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <artifactId>domain</artifactId> + + <dependencies> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> + ``` + --- + ### Séparation en modules - web + ```xml + <project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>com.example</groupId> + <artifactId>hexagonal-architecture-sample</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <artifactId>web</artifactId> + + <dependencies> + <dependency> + <groupId>com.example</groupId> + <artifactId>domain</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + </dependencies> +</project> + ``` + --- + ### Séparation en modules - data-jpa + ```xml + <project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>com.example</groupId> + <artifactId>hexagonal-architecture-sample</artifactId> + <version>1.0-SNAPSHOT</version> + </parent> + + <artifactId>data-jpa</artifactId> + + <dependencies> + <dependency> + <groupId>com.example</groupId> + <artifactId>domain</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + </dependencies> +</project> + ``` + --- + ## Ce qu'il faut retenir + * Organisation du code et séparation des responsabilités + * SOLID ! + * Le domaine métier est "pur", sans framework + * annotations customs + * tolérance pour certaines librairies (commons-lang, lombok, etc.) + * Pas de "meilleure" façon, toujours adapter au contexte + + --- + ## Vocabulaires +  + --- + ## Vocabulaires + * Controlleurs - DTO (Data Transfer Object) - VO (Value Object) + * Use Cases - Services - Domain Objects + * Repositories - Entities + * Ports = interfaces + * Adapters = implémentations + + ### Hexa / Clean + * Ports / Adapters + * API / SPI : Application Programming Interface, Service Provider Interface + * In / Out + + </textarea> + </section> + + + <section> + <h2>TP</h2> + <img src="../images/leonidas.png"/> + <p> + <a href="../w12-rendu/12-criteres-notation.html">Critères de notation <i class="em em-cloud"></i></a> + </p> + </section> + + </div> + +</div> + +<script src="../reveal/dist/reveal.js"></script> +<script src="../reveal/plugin/markdown/markdown.js"></script> +<link rel="stylesheet" href="../reveal/plugin/highlight/zenburn.css"> +<script src="../reveal/plugin/highlight/highlight.js"></script> +<script> + // More info about initialization & config: + // - https://revealjs.com/initialization/ + // - https://revealjs.com/config/ + Reveal.initialize({ + hash: true, + + // Learn about plugins: https://revealjs.com/plugins/ + plugins: [RevealMarkdown, RevealHighlight], + markdown: { + smartypants: true + } + }); +</script> + +<aside class="miage_aside_logo"></aside> + +</body> +</html> diff --git a/w10-hexa/images/.$diagrams.drawio.bkp b/w10-hexa/images/.$diagrams.drawio.bkp new file mode 100644 index 0000000000000000000000000000000000000000..298f50e7de7ab1119aab200c1000a0aaf5786c88 --- /dev/null +++ b/w10-hexa/images/.$diagrams.drawio.bkp @@ -0,0 +1,421 @@ +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="24.7.17" pages="4"> + <diagram name="n-tier" id="c5Fhrs3pAfpylfDjKvyY"> + <mxGraphModel dx="539" dy="837" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-2" value="@Controller" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="600" y="80" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-3" value="@Service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="600" y="140" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-4" value="@Repository" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="600" y="200" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="29rr4kCg7Ml6QkJ_xFnF-5" target="29rr4kCg7Ml6QkJ_xFnF-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-5" value="User interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="400" y="80" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="29rr4kCg7Ml6QkJ_xFnF-6" target="29rr4kCg7Ml6QkJ_xFnF-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-6" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="400" y="140" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-7" value="Database" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="400" y="200" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-8" value="1st tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="280" y="80" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-9" value="2nd tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="280" y="140" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-10" value="3d tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="280" y="200" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-13" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.cone;direction=north;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> + <mxGeometry x="520" y="100" width="80" height="120" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="7pg7vUrIsKb24wAKwi6E" name="packages"> + <mxGraphModel dx="1976" dy="1171" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-1" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-2" value="service" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="160" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-3" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="360" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-4" target="OYEMWmDmDcUV23dBQ6uk-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-4" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-5" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-6" target="OYEMWmDmDcUV23dBQ6uk-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-6" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-9" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-10" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-6" target="OYEMWmDmDcUV23dBQ6uk-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="220" as="sourcePoint" /> + <mxPoint x="170" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-10" target="OYEMWmDmDcUV23dBQ6uk-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="340" as="sourcePoint" /> + <mxPoint x="170" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-13" value="pokemons" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="320" y="40" width="240" height="500" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-17" target="OYEMWmDmDcUV23dBQ6uk-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-17" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-18" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-20" target="OYEMWmDmDcUV23dBQ6uk-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-20" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-21" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-22" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-20" target="OYEMWmDmDcUV23dBQ6uk-21"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="220" as="sourcePoint" /> + <mxPoint x="450" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-22" target="OYEMWmDmDcUV23dBQ6uk-21"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="340" as="sourcePoint" /> + <mxPoint x="450" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-25" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-26" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="160" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-27" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="440" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-29" target="OYEMWmDmDcUV23dBQ6uk-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-29" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-30" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-32" target="OYEMWmDmDcUV23dBQ6uk-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-32" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-33" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="360" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-34" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-32" target="OYEMWmDmDcUV23dBQ6uk-33"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="220" as="sourcePoint" /> + <mxPoint x="730" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-34" target="OYEMWmDmDcUV23dBQ6uk-33"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="340" as="sourcePoint" /> + <mxPoint x="730" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram name="packages-highlights" id="FimorQUkRpZz5n_3ckBc"> + <mxGraphModel dx="2075" dy="1230" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="k0NfVkmA0NVjakYlGoJw-0" /> + <mxCell id="k0NfVkmA0NVjakYlGoJw-1" parent="k0NfVkmA0NVjakYlGoJw-0" /> + <mxCell id="k0NfVkmA0NVjakYlGoJw-2" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-3" value="service" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="160" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-4" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="360" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-6" target="k0NfVkmA0NVjakYlGoJw-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-6" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-7" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-9" target="k0NfVkmA0NVjakYlGoJw-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-9" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-10" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-11" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-9" target="k0NfVkmA0NVjakYlGoJw-10"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="220" as="sourcePoint" /> + <mxPoint x="170" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-11" target="k0NfVkmA0NVjakYlGoJw-10"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="340" as="sourcePoint" /> + <mxPoint x="170" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-14" value="pokemons" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="320" y="40" width="240" height="500" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-16" target="k0NfVkmA0NVjakYlGoJw-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-16" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-17" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-19" target="k0NfVkmA0NVjakYlGoJw-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-19" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-20" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-21" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-19" target="k0NfVkmA0NVjakYlGoJw-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="220" as="sourcePoint" /> + <mxPoint x="450" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-21" target="k0NfVkmA0NVjakYlGoJw-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="340" as="sourcePoint" /> + <mxPoint x="450" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-24" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-25" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="160" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-26" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="440" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-28" target="k0NfVkmA0NVjakYlGoJw-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-28" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-29" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-31" target="k0NfVkmA0NVjakYlGoJw-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-31" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-32" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="360" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-33" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-31" target="k0NfVkmA0NVjakYlGoJw-32"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="220" as="sourcePoint" /> + <mxPoint x="730" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-33" target="k0NfVkmA0NVjakYlGoJw-32"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="340" as="sourcePoint" /> + <mxPoint x="730" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="NRJLp39u4D51DtysMQp5" name="hexa-packages"> + <mxGraphModel dx="1729" dy="1025" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-13" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=110;" vertex="1" parent="1"> + <mxGeometry x="240" y="40" width="400" height="360" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-1" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="80" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-2" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="320" y="80" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-3" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="250" width="240" height="90" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-5" target="EpVNv-dTxgGB9FQMOEVZ-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-5" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="120" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-6" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="360" y="120" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-8" target="EpVNv-dTxgGB9FQMOEVZ-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-8" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-9" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-10" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-8" target="EpVNv-dTxgGB9FQMOEVZ-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="140" as="sourcePoint" /> + <mxPoint x="450" y="180" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-10" target="EpVNv-dTxgGB9FQMOEVZ-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="380" as="sourcePoint" /> + <mxPoint x="170" y="340" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-14" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=110;" vertex="1" parent="1"> + <mxGeometry x="240" y="480" width="400" height="360" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-15" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="520" width="240" height="160" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-16" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="320" y="520" width="240" height="320" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-17" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="690" width="240" height="220" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-19" target="EpVNv-dTxgGB9FQMOEVZ-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-19" target="ypqpasVO_qo0887bOKWy-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-19" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="560" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-20" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="360" y="560" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-22" target="EpVNv-dTxgGB9FQMOEVZ-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-22" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="640" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-23" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="360" y="720" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="KsEOFNJlquhdU8HGQCLY-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-24" target="KsEOFNJlquhdU8HGQCLY-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-24" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="720" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-22" target="EpVNv-dTxgGB9FQMOEVZ-23"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="580" as="sourcePoint" /> + <mxPoint x="450" y="620" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-24" target="EpVNv-dTxgGB9FQMOEVZ-23"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="820" as="sourcePoint" /> + <mxPoint x="170" y="780" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="KsEOFNJlquhdU8HGQCLY-1" target="ypqpasVO_qo0887bOKWy-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="KsEOFNJlquhdU8HGQCLY-1" value="«interface»<br><b>PokemonRepoJPAImpl</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="800" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-1" value="PokemonDTO" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="80" y="620" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-3" value="PokemonEntity" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="640" y="860" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-5" value="Pokemon" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="360" y="780" width="160" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/w10-hexa/images/CleanArchitecture.jpg b/w10-hexa/images/CleanArchitecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cd44fb58d87e5fd2fe1f0a75533f132bb163c61 Binary files /dev/null and b/w10-hexa/images/CleanArchitecture.jpg differ diff --git a/w10-hexa/images/DDD.jpg b/w10-hexa/images/DDD.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31d54debf5e721888c8c8aa56a1ab4435bcb5424 Binary files /dev/null and b/w10-hexa/images/DDD.jpg differ diff --git a/w10-hexa/images/Microservice-Architecture-Of-UBER.png b/w10-hexa/images/Microservice-Architecture-Of-UBER.png new file mode 100644 index 0000000000000000000000000000000000000000..d2bbb7e3e59aafb758e8d7fe49efe6c2d8b473f1 Binary files /dev/null and b/w10-hexa/images/Microservice-Architecture-Of-UBER.png differ diff --git a/w10-hexa/images/diagrams-hexa-modules.png b/w10-hexa/images/diagrams-hexa-modules.png new file mode 100644 index 0000000000000000000000000000000000000000..9b175851aaa51387063865cb1b11b2db0a90d06e Binary files /dev/null and b/w10-hexa/images/diagrams-hexa-modules.png differ diff --git a/w10-hexa/images/diagrams-hexa-packages-dtos.png b/w10-hexa/images/diagrams-hexa-packages-dtos.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef42b4c71b0626241b647d784eec6b657606f85 Binary files /dev/null and b/w10-hexa/images/diagrams-hexa-packages-dtos.png differ diff --git a/w10-hexa/images/diagrams-hexa-packages.png b/w10-hexa/images/diagrams-hexa-packages.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8d98ad1a363ae8db2718b9f71276fa5c46f9f8 Binary files /dev/null and b/w10-hexa/images/diagrams-hexa-packages.png differ diff --git a/w10-hexa/images/diagrams-packages-highlights.png b/w10-hexa/images/diagrams-packages-highlights.png new file mode 100644 index 0000000000000000000000000000000000000000..60f7a1908790637087798078712afa9e31cc7ae3 Binary files /dev/null and b/w10-hexa/images/diagrams-packages-highlights.png differ diff --git a/w10-hexa/images/diagrams-packages.png b/w10-hexa/images/diagrams-packages.png new file mode 100644 index 0000000000000000000000000000000000000000..14e19b95e0f484027af21570621d166268f678af Binary files /dev/null and b/w10-hexa/images/diagrams-packages.png differ diff --git a/w10-hexa/images/diagrams-vocabulary.png b/w10-hexa/images/diagrams-vocabulary.png new file mode 100644 index 0000000000000000000000000000000000000000..270640a957b65a00b0ce17692d127f6008e05e01 Binary files /dev/null and b/w10-hexa/images/diagrams-vocabulary.png differ diff --git a/w10-hexa/images/diagrams.drawio b/w10-hexa/images/diagrams.drawio new file mode 100644 index 0000000000000000000000000000000000000000..920f4390aa10496817f850451b0c520b0cc8242f --- /dev/null +++ b/w10-hexa/images/diagrams.drawio @@ -0,0 +1,556 @@ +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.17 Chrome/128.0.6613.186 Electron/32.2.5 Safari/537.36" version="24.7.17" pages="6"> + <diagram name="n-tier" id="c5Fhrs3pAfpylfDjKvyY"> + <mxGraphModel dx="539" dy="837" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-2" value="@Controller" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="600" y="80" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-3" value="@Service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="600" y="140" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-4" value="@Repository" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="600" y="200" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="29rr4kCg7Ml6QkJ_xFnF-5" target="29rr4kCg7Ml6QkJ_xFnF-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-5" value="User interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="400" y="80" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="29rr4kCg7Ml6QkJ_xFnF-6" target="29rr4kCg7Ml6QkJ_xFnF-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-6" value="Backend" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="400" y="140" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-7" value="Database" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="400" y="200" width="120" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-8" value="1st tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="280" y="80" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-9" value="2nd tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="280" y="140" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-10" value="3d tier" style="ellipse;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="280" y="200" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="29rr4kCg7Ml6QkJ_xFnF-13" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.cone;direction=north;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> + <mxGeometry x="520" y="100" width="80" height="120" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="7pg7vUrIsKb24wAKwi6E" name="packages"> + <mxGraphModel dx="1976" dy="1171" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-1" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-2" value="service" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="160" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-3" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="40" y="360" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-4" target="OYEMWmDmDcUV23dBQ6uk-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-4" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-5" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-6" target="OYEMWmDmDcUV23dBQ6uk-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-6" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-9" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-10" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="80" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-6" target="OYEMWmDmDcUV23dBQ6uk-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="220" as="sourcePoint" /> + <mxPoint x="170" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-10" target="OYEMWmDmDcUV23dBQ6uk-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="340" as="sourcePoint" /> + <mxPoint x="170" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-13" value="pokemons" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="320" y="40" width="240" height="500" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-17" target="OYEMWmDmDcUV23dBQ6uk-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-17" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-18" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-20" target="OYEMWmDmDcUV23dBQ6uk-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-20" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-21" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-22" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-20" target="OYEMWmDmDcUV23dBQ6uk-21"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="220" as="sourcePoint" /> + <mxPoint x="450" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-22" target="OYEMWmDmDcUV23dBQ6uk-21"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="340" as="sourcePoint" /> + <mxPoint x="450" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-25" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-26" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="160" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-27" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="1"> + <mxGeometry x="600" y="440" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-29" target="OYEMWmDmDcUV23dBQ6uk-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-29" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-30" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-32" target="OYEMWmDmDcUV23dBQ6uk-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-32" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-33" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="360" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-34" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-32" target="OYEMWmDmDcUV23dBQ6uk-33"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="220" as="sourcePoint" /> + <mxPoint x="730" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="OYEMWmDmDcUV23dBQ6uk-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="1" source="OYEMWmDmDcUV23dBQ6uk-34" target="OYEMWmDmDcUV23dBQ6uk-33"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="340" as="sourcePoint" /> + <mxPoint x="730" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram name="packages-highlights" id="FimorQUkRpZz5n_3ckBc"> + <mxGraphModel dx="2075" dy="1230" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="k0NfVkmA0NVjakYlGoJw-0" /> + <mxCell id="k0NfVkmA0NVjakYlGoJw-1" parent="k0NfVkmA0NVjakYlGoJw-0" /> + <mxCell id="k0NfVkmA0NVjakYlGoJw-2" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-3" value="service" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="160" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-4" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="40" y="360" width="240" height="180" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-6" target="k0NfVkmA0NVjakYlGoJw-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-6" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-7" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-9" target="k0NfVkmA0NVjakYlGoJw-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-9" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-10" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-11" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="80" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-9" target="k0NfVkmA0NVjakYlGoJw-10"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="220" as="sourcePoint" /> + <mxPoint x="170" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-11" target="k0NfVkmA0NVjakYlGoJw-10"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="340" as="sourcePoint" /> + <mxPoint x="170" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-14" value="pokemons" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="320" y="40" width="240" height="500" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-16" target="k0NfVkmA0NVjakYlGoJw-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-16" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-17" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-19" target="k0NfVkmA0NVjakYlGoJw-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-19" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-20" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="400" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-21" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="360" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-19" target="k0NfVkmA0NVjakYlGoJw-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="220" as="sourcePoint" /> + <mxPoint x="450" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-21" target="k0NfVkmA0NVjakYlGoJw-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="340" as="sourcePoint" /> + <mxPoint x="450" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-24" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="40" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-25" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="160" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-26" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="600" y="440" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-28" target="k0NfVkmA0NVjakYlGoJw-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-28" value="PokemonController" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="80" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-29" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-31" target="k0NfVkmA0NVjakYlGoJw-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-31" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-32" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="360" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-33" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" vertex="1" parent="k0NfVkmA0NVjakYlGoJw-1"> + <mxGeometry x="640" y="480" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-31" target="k0NfVkmA0NVjakYlGoJw-32"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="220" as="sourcePoint" /> + <mxPoint x="730" y="260" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="k0NfVkmA0NVjakYlGoJw-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" edge="1" parent="k0NfVkmA0NVjakYlGoJw-1" source="k0NfVkmA0NVjakYlGoJw-33" target="k0NfVkmA0NVjakYlGoJw-32"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="730" y="340" as="sourcePoint" /> + <mxPoint x="730" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="NRJLp39u4D51DtysMQp5" name="hexa-packages"> + <mxGraphModel dx="447" dy="694" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-13" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=110;" parent="1" vertex="1"> + <mxGeometry x="240" y="40" width="400" height="360" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-1" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="40" y="80" width="240" height="100" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-2" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="320" y="80" width="240" height="260" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-3" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="600" y="250" width="240" height="90" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-5" target="EpVNv-dTxgGB9FQMOEVZ-6" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-5" value="PokemonController" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="80" y="120" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-6" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="360" y="120" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-8" target="EpVNv-dTxgGB9FQMOEVZ-6" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-8" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="360" y="200" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-9" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="360" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-10" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="640" y="280" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-8" target="EpVNv-dTxgGB9FQMOEVZ-9" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="140" as="sourcePoint" /> + <mxPoint x="450" y="180" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-10" target="EpVNv-dTxgGB9FQMOEVZ-9" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="380" as="sourcePoint" /> + <mxPoint x="170" y="340" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-14" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=110;" parent="1" vertex="1"> + <mxGeometry x="240" y="480" width="400" height="360" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-15" value="web" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="40" y="520" width="240" height="160" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-16" value="domain" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="320" y="520" width="240" height="320" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-17" value="data" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;verticalAlign=bottom;align=left;" parent="1" vertex="1"> + <mxGeometry x="600" y="690" width="240" height="220" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-19" target="EpVNv-dTxgGB9FQMOEVZ-20" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-19" target="ypqpasVO_qo0887bOKWy-1" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-19" value="PokemonController" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="80" y="560" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-20" value="«interface»<br><b>PokemonService</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="360" y="560" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-22" target="EpVNv-dTxgGB9FQMOEVZ-20" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-22" value="PokemonServiceImpl" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="360" y="640" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-23" value="«interface»<br><b>PokemonRepository</b>" style="html=1;whiteSpace=wrap;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="360" y="720" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="KsEOFNJlquhdU8HGQCLY-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-24" target="KsEOFNJlquhdU8HGQCLY-1" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-24" value="PokemonRepositoryImpl" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="640" y="720" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-22" target="EpVNv-dTxgGB9FQMOEVZ-23" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="450" y="580" as="sourcePoint" /> + <mxPoint x="450" y="620" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EpVNv-dTxgGB9FQMOEVZ-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;fillColor=#f8cecc;strokeColor=#b85450;strokeWidth=3;" parent="1" source="EpVNv-dTxgGB9FQMOEVZ-24" target="EpVNv-dTxgGB9FQMOEVZ-23" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="170" y="820" as="sourcePoint" /> + <mxPoint x="170" y="780" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" parent="1" source="KsEOFNJlquhdU8HGQCLY-1" target="ypqpasVO_qo0887bOKWy-3" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="KsEOFNJlquhdU8HGQCLY-1" value="«interface»<br><b>PokemonRepoJPAImpl</b>" style="html=1;whiteSpace=wrap;" parent="1" vertex="1"> + <mxGeometry x="640" y="800" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-1" value="PokemonDTO" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="80" y="620" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-3" value="PokemonEntity" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="640" y="860" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="ypqpasVO_qo0887bOKWy-5" value="Pokemon" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="360" y="780" width="160" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="MEdb4AUAbgb11SuPAlvX" name="hexa-modules"> + <mxGraphModel dx="782" dy="1214" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="d-9lFKzfhhLQQYkVDo1D-1" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=60;" vertex="1" parent="1"> + <mxGeometry x="120" y="240" width="240" height="200" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-1" target="v59GMtOM7vevkp0YK9PX-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-1" value="web" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="80" y="80" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-2" value="domain" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="200" y="80" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-3" target="v59GMtOM7vevkp0YK9PX-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-3" value="data" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="320" y="80" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-6" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-7" target="v59GMtOM7vevkp0YK9PX-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-7" value="web" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="90" y="260" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-8" value="domain" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="200" y="320" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-9" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-10" target="v59GMtOM7vevkp0YK9PX-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-10" value="data jpa" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="310" y="320" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-12" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-11" target="v59GMtOM7vevkp0YK9PX-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-11" value="data mongo" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="290" y="380" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-13" target="v59GMtOM7vevkp0YK9PX-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-13" value="kafka" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="100" y="380" width="80" height="40" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-16" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="v59GMtOM7vevkp0YK9PX-15" target="v59GMtOM7vevkp0YK9PX-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="v59GMtOM7vevkp0YK9PX-15" value="kafka" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="290" y="260" width="80" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="u8svijj-Xorm958uWhtm" name="vocabulary"> + <mxGraphModel dx="1502" dy="1012" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="BkyBxnSlllpmX_6EBPTR-1" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=40;" vertex="1" parent="1"> + <mxGeometry x="80" y="40" width="240" height="210" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-5" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-2" target="BkyBxnSlllpmX_6EBPTR-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-2" value="API" style="rounded=0;whiteSpace=wrap;html=1;rotation=-70;" vertex="1" parent="1"> + <mxGeometry x="66.19" y="79.67" width="103.29" height="35.3" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-3" value="SPI" style="rounded=0;whiteSpace=wrap;html=1;rotation=70;direction=west;flipH=1;flipV=1;" vertex="1" parent="1"> + <mxGeometry x="230" y="79.67" width="103.29" height="35.3" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-6" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-4" target="BkyBxnSlllpmX_6EBPTR-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-4" value="Domain" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="160" y="114.97000000000003" width="80" height="70" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-13" value="" style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;size=40;" vertex="1" parent="1"> + <mxGeometry x="80.26" y="320" width="240" height="210" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-15" target="BkyBxnSlllpmX_6EBPTR-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-15" value="Port" style="rounded=0;whiteSpace=wrap;html=1;rotation=-70;" vertex="1" parent="1"> + <mxGeometry x="66.45" y="359.67" width="103.29" height="35.3" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-16" value="Port" style="rounded=0;whiteSpace=wrap;html=1;rotation=70;direction=west;flipH=1;flipV=1;" vertex="1" parent="1"> + <mxGeometry x="230.26" y="359.67" width="103.29" height="35.3" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-17" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-18" target="BkyBxnSlllpmX_6EBPTR-16"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-18" value="Domain" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="160.26" y="394.97" width="80" height="70" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-20" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;dashed=1;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-19" target="BkyBxnSlllpmX_6EBPTR-16"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-19" value="Adapter" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> + <mxGeometry x="360" y="320" width="103.29" height="40" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-21" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;dashed=1;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-22" target="BkyBxnSlllpmX_6EBPTR-3"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="268.7436401189607" y="84.0667186770745" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-22" value="Infrastructure" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> + <mxGeometry x="360" y="40" width="103.29" height="40" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-23" value="Application" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> + <mxGeometry x="-60" y="39.67" width="103.29" height="40" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-24" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-23" target="BkyBxnSlllpmX_6EBPTR-2"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="144" y="113" as="sourcePoint" /> + <mxPoint x="170" y="132" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-25" value="Use Cases" style="rounded=0;whiteSpace=wrap;html=1;rotation=0;" vertex="1" parent="1"> + <mxGeometry x="-60" y="319.67" width="103.29" height="40" as="geometry" /> + </mxCell> + <mxCell id="BkyBxnSlllpmX_6EBPTR-26" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=open;endFill=0;" edge="1" parent="1" source="BkyBxnSlllpmX_6EBPTR-25" target="BkyBxnSlllpmX_6EBPTR-15"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="53" y="85" as="sourcePoint" /> + <mxPoint x="111" y="102" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/w10-hexa/images/hexagon.png b/w10-hexa/images/hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..b04a44a7a8388ed315a0ce09278393c0c5db5e7e Binary files /dev/null and b/w10-hexa/images/hexagon.png differ diff --git a/w10-hexa/images/n-tier-spring.png b/w10-hexa/images/n-tier-spring.png new file mode 100644 index 0000000000000000000000000000000000000000..dd121acc2c7086fac3a2525bfcc65d99ec5752f7 Binary files /dev/null and b/w10-hexa/images/n-tier-spring.png differ diff --git a/w10-hexa/images/n-tier.png b/w10-hexa/images/n-tier.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea528e0fe3a7138c7e5361085f97299afb6883e Binary files /dev/null and b/w10-hexa/images/n-tier.png differ diff --git a/w10-hexa/images/onion.png b/w10-hexa/images/onion.png new file mode 100644 index 0000000000000000000000000000000000000000..1bfccc1eb49f68ec2928e05ebfb999feac4381e0 Binary files /dev/null and b/w10-hexa/images/onion.png differ diff --git a/w10-hexa/images/package-by-layer-access.svg b/w10-hexa/images/package-by-layer-access.svg new file mode 100644 index 0000000000000000000000000000000000000000..68035b2fc7c2c0fa058616ab2431e29e6275d54c --- /dev/null +++ b/w10-hexa/images/package-by-layer-access.svg @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="556px" height="283px" viewBox="-0.5 -0.5 556 283" content="<mxfile host="Electron" modified="2020-04-06T09:31:46.774Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.9.3 Chrome/80.0.3987.158 Electron/8.2.0 Safari/537.36" etag="NhT2Ko_UiLjGesFHZO84" version="12.9.3" type="device"><diagram id="zfgmmOZhkC7bbb6hCqzr" name="Page-1">7Vtde6I4FP41XtqHgCBeqq3tbGd3uqu73c4dQoppg3FD/GB+/SYSKl9l6DwdSEf0Qs9JSE7O+57kJEDPmAaHa+psVr8TD+KernmHnnHZ03UAbJP/CE0UayxbixU+RZ6sdFLM0TcolUm1LfJgmKnICMEMbbJKl6zX0GUZnUMp2WerPRKc7XXj+LCgmLsOLmrvkcdWsdbWhyf9DUT+KukZWKO4JHCSynIk4crxyD6lMq56xpQSwuJ/wWEKsXBe4pf4utkrpS+GUbhmdS5g+Mm4sf+JcPTnPOpbG/Cwo/3EuJ2Dt3LEvDnEEPd5bDWLElfwAWzEX+FDSHvG5JGs2VyWAy6HG8dFa39BNkKhcQ1zlonXBlJ+8RYYxIo7EvL+yJqrMHzkJZMVC7BsUnQxcwKEBX2mZEsR71nX/oDckRPsLCFOXe5y04+G7SBliGP4OVeBCcsmDkZ+qrek8liql4QxEoi+EcZTggk9Dt94NMVXDJNR8gxTJdbxI61N6eMP1xehkuiJvuEhpZLQXUMSQEYjXiUpNaz4EhlHxlAG1v7ESpDoVmlGGhJiR0aC/9L2iSz8j+TLW7hjFbjjMdLxRinemEA53oAib1yM+BA76ihNHX2g1aSOZv4s6ujFKcchHW1Uok1+pVKANmZxwuHjpwRjgVFHHnXIY+htkuev/STsa/fm/af+ZGETuLx/tvtWgSHQ41sEKa7Jmv9MKNmuPSiaEfgTylbEJ2sODYlZwpVPkLFIbnCcLSMVDLiBeAcFWgn74quOXHvVySGnjSsttL6h2+Ban/X/u32Yf3qeeb/RRT/ZPjnUh6yinnSkGGUlZBRih6FddqP07u4fNuJ+7kwa/ZsWHkRjF2YiXh5k47EUSUkh2JIdsyK42c3ipn0E3D77gy9Py/Fl/3aqPc2/2ovgbpbUUwS2hEUdbt+LN0st3ECHW71409vCrcrqVGp6R4m3dXmC9WqGmkVxv0IMznlOKkr31Nm8IbVMex8Uc8ZsCig5lMv+wFh8c3mkrPoeCWF+NzEqSQjNkoRQf4fji/JI+1XyQb3mRDdQaqLTzz0frAubrRRsRquwDT8QbiOlcBuce1pRFzZgKIWb2eFWE7fWlrcqs1P54N8hpF0yWJ4MWiU3s5pNBs8+HTFqxplap4qg3XzkA+Gm2LEiOPuEpAQ4tc4Vq6xOrWtXhw0HplvZSlc2A7S+sjV9gH8hnhXMBJtmfSfajtIdpIgPWdwRfVsIwgNimZ65LDoGF9pQiqd+hRClhHyvPx7Pg5oTsVr7eTBqmh5iLCl69DlsoCF+cEQy/ACGgvxo7dygyurcPuZy/OWsp3kwUG4D88s83mAqn9BWmV28AdTFinJ3fpo5VGsgVqyaewhdqVApPjc8Z8R9nkO6Qy6cHp8h/iAh45IAudKmlxdDhOBjJwyTTOWnxJWZf8SuyTWo8ug8nywsznsCzAM10BqcACvPylNAjT2PwjDssMphpbcdVHZpTF2Jl7uis4Yqn1e0H1aj16KqQ6uIVuuBBYqvTMqMvYOrCJfZYHBVHYOX7K+6JUsxqPQCVMf8vgMqB1TZK5zvBBQXT2+kH8tS7/UbV/8D</diagram></mxfile>"><defs/><g><path d="M 0 151 L 40 151 L 40 165 L 175 165 L 175 281 L 0 281 L 0 165 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 165 L 40 165" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 148px; margin-left: 2px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Courier New; color: #333333; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap; ">entities</div></div></div></foreignObject><text x="2" y="148" fill="#333333" font-family="Courier New" font-size="12px" font-weight="bold">entities</text></switch></g><path d="M 380 151 L 420 151 L 420 165 L 555 165 L 555 281 L 380 281 L 380 165 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><path d="M 380 165 L 420 165" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 148px; margin-left: 382px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Courier New; color: #333333; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap; ">dtos</div></div></div></foreignObject><text x="382" y="148" fill="#333333" font-family="Courier New" font-size="12px" font-weight="bold">dtos</text></switch></g><path d="M 380 16 L 420 16 L 420 30 L 555 30 L 555 121 L 380 121 L 380 30 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><path d="M 380 30 L 420 30" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 13px; margin-left: 382px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Courier New; color: #333333; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap; ">clients</div></div></div></foreignObject><text x="382" y="13" fill="#333333" font-family="Courier New" font-size="12px" font-weight="bold">clients</text></switch></g><path d="M 0 16 L 40 16 L 40 30 L 175 30 L 175 121 L 0 121 L 0 30 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><path d="M 0 30 L 40 30" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 13px; margin-left: 2px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Courier New; color: #333333; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap; ">dao</div></div></div></foreignObject><text x="2" y="13" fill="#333333" font-family="Courier New" font-size="12px" font-weight="bold">dao</text></switch></g><path d="M 190 16 L 230 16 L 230 30 L 365 30 L 365 121 L 190 121 L 190 30 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><path d="M 190 30 L 230 30" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 13px; margin-left: 192px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 12px; font-family: Courier New; color: #333333; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: nowrap; ">controller</div></div></div></foreignObject><text x="192" y="13" fill="#333333" font-family="Courier New" font-size="12px" font-weight="bold">controller</text></switch></g><path d="M 200 76 L 171.37 76" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 166.12 76 L 173.12 72.5 L 171.37 76 L 173.12 79.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 270.47 86 L 168.66 230.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 165.64 235.09 L 166.81 227.35 L 168.66 230.79 L 172.53 231.37 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 284.53 86 L 386.34 230.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.36 235.09 L 382.47 231.37 L 386.34 230.79 L 388.19 227.35 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 322.5 66 L 383.78 52.38" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 388.91 51.24 L 382.83 56.18 L 383.78 52.38 L 381.32 49.34 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 283.58 86 L 386.69 255.56" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.42 260.04 L 382.79 255.88 L 386.69 255.56 L 388.77 252.25 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="200" y="66" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 76px; margin-left: 202px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ProductController</div></div></div></foreignObject><text x="202" y="79" fill="#1A1A1A" font-family="Courier New" font-size="11px">ProductController</text></switch></g><path d="M 200 51 L 171.37 51" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 166.12 51 L 173.12 47.5 L 171.37 51 L 173.12 54.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 269.17 61 L 169.08 181.11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 165.72 185.14 L 167.51 177.52 L 169.08 181.11 L 172.89 182 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 270.68 61 L 168.59 210.74" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 165.63 215.08 L 166.68 207.32 L 168.59 210.74 L 172.46 211.26 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 285.83 61 L 385.92 181.11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.28 185.14 L 382.11 182 L 385.92 181.11 L 387.49 177.52 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 284.53 61 L 386.34 205.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.36 210.09 L 382.47 206.37 L 386.34 205.79 L 388.19 202.35 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="200" y="41" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 51px; margin-left: 202px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">UserController</div></div></div></foreignObject><text x="202" y="54" fill="#1A1A1A" font-family="Courier New" font-size="11px">UserController</text></switch></g><path d="M 232.5 91 L 171.22 77.38" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 166.09 76.24 L 173.68 74.34 L 171.22 77.38 L 172.17 81.18 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 269.17 111 L 169.08 231.11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 165.72 235.14 L 167.51 227.52 L 169.08 231.11 L 172.89 232 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 285.83 111 L 385.92 231.11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.28 235.14 L 382.11 232 L 385.92 231.11 L 387.49 227.52 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="200" y="91" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 101px; margin-left: 202px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ExportController</div></div></div></foreignObject><text x="202" y="104" fill="#1A1A1A" font-family="Courier New" font-size="11px">ExportController</text></switch></g><path d="M 38.68 62.4 L 38.68 170.83" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 38.68 176.08 L 35.18 169.08 L 38.68 170.83 L 42.18 169.08 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 45.03 63.6 L 44.29 192.43" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 44.26 197.68 L 40.8 190.66 L 44.29 192.43 L 47.8 190.7 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="10" y="41" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 51px; margin-left: 12px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">UserDAO</div></div></div></foreignObject><text x="12" y="54" fill="#1A1A1A" font-family="Courier New" font-size="11px">UserDAO</text></switch></g><path d="M 87.5 86 L 87.5 219.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 87.5 224.88 L 84 217.88 L 87.5 219.63 L 91 217.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="10" y="66" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 76px; margin-left: 12px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ProductDAO</div></div></div></foreignObject><text x="12" y="79" fill="#1A1A1A" font-family="Courier New" font-size="11px">ProductDAO</text></switch></g><path d="M 467.5 61 L 467.5 244.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 467.5 249.88 L 464 242.88 L 467.5 244.63 L 471 242.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="390" y="41" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 51px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">StockServiceClient</div></div></div></foreignObject><text x="392" y="54" fill="#1A1A1A" font-family="Courier New" font-size="11px">StockServiceClient</text></switch></g><rect x="390" y="176" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 186px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">UserDTO</div></div></div></foreignObject><text x="392" y="189" fill="#1A1A1A" font-family="Courier New" font-size="11px">UserDTO</text></switch></g><rect x="390" y="201" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 211px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">AddressDTO</div></div></div></foreignObject><text x="392" y="214" fill="#1A1A1A" font-family="Courier New" font-size="11px">AddressDTO</text></switch></g><rect x="10" y="176" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 186px; margin-left: 12px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">UserEntity</div></div></div></foreignObject><text x="12" y="189" fill="#1A1A1A" font-family="Courier New" font-size="11px">UserEntity</text></switch></g><rect x="10" y="201" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 211px; margin-left: 12px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">AddressEntity</div></div></div></foreignObject><text x="12" y="214" fill="#1A1A1A" font-family="Courier New" font-size="11px">AddressEntity</text></switch></g><rect x="10" y="226" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 236px; margin-left: 12px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ProductEntity</div></div></div></foreignObject><text x="12" y="239" fill="#1A1A1A" font-family="Courier New" font-size="11px">ProductEntity</text></switch></g><rect x="390" y="226" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 236px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">ProductDTO</div></div></div></foreignObject><text x="392" y="239" fill="#1A1A1A" font-family="Courier New" font-size="11px">ProductDTO</text></switch></g><rect x="390" y="251" width="155" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 153px; height: 1px; padding-top: 261px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 11px; font-family: Courier New; color: #1A1A1A; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">StockDTO</div></div></div></foreignObject><text x="392" y="264" fill="#1A1A1A" font-family="Courier New" font-size="11px">StockDTO</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> \ No newline at end of file