diff --git a/3-Domain/src/main/java/category/CategoryRepository.java b/3-Domain/src/main/java/category/CategoryRepository.java index 9a16da2..b668540 100644 --- a/3-Domain/src/main/java/category/CategoryRepository.java +++ b/3-Domain/src/main/java/category/CategoryRepository.java @@ -27,7 +27,6 @@ public class CategoryRepository { return getByName(name) .orElseThrow(() -> new CategroyDoesNotExist("A Category with name " + name + " does not exits. You must create it first.")) .getId(); - } public Optional getById(CategoryId id) { diff --git a/Documentation/programmEntwurf.org b/Documentation/programmEntwurf.org index 2206f02..dbb3a03 100644 --- a/Documentation/programmEntwurf.org +++ b/Documentation/programmEntwurf.org @@ -66,12 +66,34 @@ Allgemeine Anmerkungen: [Was macht die Applikation? Wie funktioniert sie? Welches Problem löst sie/welchen Zweck hat sie?] +Die Anwendung ist zur organisierten Abspeicherung von Links bzw. URLs gedacht. +Diese können durch die Anwendung abgespeichert werden. +Zur besseren Organisation ist es außerdem möglich, Kategorien anzulegen und die Links diesen zuzuordnen, wie beispielsweise 'Libary', 'Selfhostable', 'Dienst' usw. +Zusätzlich kann die Anwendung auch Tags zu Links hinzufügen können, wenn die Implementation Webseite beispielsweise bereits kennt (z.B. 'Github'). +Eigene Regeln für Tags können auch angelegt werden, sie werden durch einen Regulären Ausdruck beschrieben. +Der User, welcher einen Eintrag angelegt hat wird auch gespeichert. + +TODO: Die Anwendung soll Persistenz enthalten sowie verschiedene Methoden zum Durchsuchen (nach Kategorie, User) und Exportieren der Daten. + *** Wie startet man die Applikation? :PROPERTIES: :CUSTOM_ID: wie-startet-man-die-applikation :END: [Wie startet man die Applikation? Welche Voraussetzungen werden benötigt? Schritt-für-Schritt-Anleitung] +**** Voraussetzungen: +- Java 17 +- Maven + +**** Compilieren + #+begin_src shell +mvn clean install + #+end_src + +**** Ausführen + #+begin_src +java -jar 0-Plugin/target/0-Plugin-1.0-SNAPSHOT-jar-with-dependencies.jar [PARAMETER] + #+end_src *** Wie testet man die Applikation? :PROPERTIES: @@ -80,6 +102,9 @@ benötigt? Schritt-für-Schritt-Anleitung] [Wie testet man die Applikation? Welche Voraussetzungen werden benötigt? Schritt-für-Schritt-Anleitung] + #+begin_src +mvn clean test + #+end_src * Kapitel 2: Clean Architecture :PROPERTIES: :CUSTOM_ID: kapitel-2-clean-architecture @@ -90,6 +115,20 @@ Schritt-für-Schritt-Anleitung] :END: [allgemeine Beschreibung der Clean Architecture in eigenen Worten] +Die Clean Architecture ist eine Software Architektur, die es ermöglichen soll langlebige Systeme zu entwickeln. +Dazu wird der eigentliche Zweck einer Anwendung von möglichst vielen technischen Details getrennt. +Auf diese Weise soll ein Kern der Anwendung entstehen, welcher beispielsweise die Businessregeln enthält und bis auf die Wahl der Programmiersprache (für Langlebigkeit von Sprachen siehe bspw. Java) keine Abhängigkeiten zu technischen Entscheidungen hat. +Konkretere technische Details, wie beispielsweise die Wahl einer Datenbank oder ob für die Benutzerschnittstelle ein CLI oder ein Webserver genutzt wird, werden an den Rand der Anwendung gedrängt und nur durch Zwischenschichten mit dem Kern verbunden. + +Die konkreten Schichten sind (von langlebig nach kurzlebig und von wenigen (keinen) nach vielen Abhängigkeiten sortiert): + - Abstraction Code + - Domain Code + - Application Code + - Adapters + - Plugins + +Durch die Dependency Rule wird sichergestellt, dass Abhängigkeiten immer von außen nach innen sind, und somit eine äußere Schicht ausgetauscht werden könnte, ohne, dass die inneren Schichten angepasst werden müssten. + *** Analyse der Dependency Rule :PROPERTIES: :CUSTOM_ID: analyse-der-dependency-rule @@ -99,14 +138,30 @@ Dependency Rule verletzt); jeweils UML der Klasse und Analyse der Abhängigkeiten in beide Richtungen (d.h., von wem hängt die Klasse ab und wer hängt von der Klasse ab) in Bezug auf die Dependency Rule] + +Da die Abhängigkeiten zwischen den einzelnen Schichten durch Maven restriktiv kontrolliert werden gibt es kein negativ Beispiel. + **** Positiv-Beispiel: Dependency Rule :PROPERTIES: :CUSTOM_ID: positiv-beispiel-dependency-rule :END: -**** Negativ-Beispiel: Dependency Rule - :PROPERTIES: - :CUSTOM_ID: negativ-beispiel-dependency-rule - :END: + + [[./uml/LinkCliAdapter.png]] + + [[./uml/LinkCliAdapterClasses.png]] + +Die Klasse LinkCliAdapter ist selbst abhängig von einigen Value Object der Domäne (LinkUrl, UserName, CategoryName) und dem LinkUseCase sowie seinem speziellen Format LinkDto aus der Application Schicht. +Abhängig von der Klasse LinkCliAdapter ist die Klasse LinkCommands aus der Plugin Schicht. +**** 2. Positiv-Beispiel: Dependency Rule + + [[./uml/CSVCategoryPersistenceAdapter.png]] + [[./uml/CSVCategoryPersistenceAdapterClasses.png]] + +Die Klasse CSVCategoryPersistenceAdapter ist abhängig von dem Domänen Entity Category und Implementiert das Interface der Domäne PersistenceAdapter. Außerdem ist es abhängig vom Persitenz Entity CategorEntity, das in der Adapter Schicht definiert ist und dem Interface GenericDAO aus der Adapter Schicht. +In der Plugin Schicht ist mit dem GenericCSVDAO eine Klasse gegeben, die dieses Interface implementiert. + +Das Domänen Repository CategoryRepository ist abhängig von einem PersistenceAdapter (Interface), welche das CSVCategoryPersistenceAdapter implementiert. +Somit ist das Repository der Domäne zur Compile Zeit nicht abhängig von dem CSVCategoryPersistenceAdapter des Adapter sondern nur zur Runtime, da im Adapter eine Implementation des benötigten Interfaces liegt. *** *Analyse der Schichten* :PROPERTIES: :CUSTOM_ID: analyse-der-schichten @@ -116,15 +171,27 @@ Clean-Architecture: jeweils UML der Klasse (ggf. auch zusammenspielenden Klassen), Beschreibung der Aufgabe, Einordnung mit Begründung in die Clean-Architecture] -**** Schicht: [Name] +**** Schicht: Domain :PROPERTIES: :CUSTOM_ID: schicht-name :END: -**** Schicht: [Name] + + [[./uml/LinkUrl.png]] + + Die Klasse LinkUrl ist ein Klasse, welche einen zentralen Bestandteil der zu speichernden Daten repräsentiert: Die URL eines Links. + Damit ist sie Teil der Domäne, da es sich direkt um die Businessregeln der zu verarbeiten Daten handelt. + So stellt sie beispielsweise durch die Verwendung der Java Klasse URL sicher, dass die Url ein valides Format hat und somit die Domänenregeln erfüllt. + +**** Schicht: Plugin :PROPERTIES: :CUSTOM_ID: schicht-name-1 :END: + [[./uml/GitHubTagMatcher.png]] + + Die Klasse GitHubTagMatcher ist eine Implementation der des Interface TagMatcher und dafür verantwortlich festzustellen, ob ein Link auf eine GitHub Url verweist und im positiv Fall zu versuchen über die GitHub Repository-Api zusätzliche Informationen über das verlinkte Repository zu erhalten. + Die Klasse ist Teil der Plugin Schicht, da die Interaktion mit der GitHub Repository-Rest-Api eindeutig eine Abhängigkeiten zu einem fremden Bestandteil darstellt und solche Abhängigkeiten an den Rand der Anwendung gedrängt werden sollten. + * Kapitel 3: SOLID :PROPERTIES: :CUSTOM_ID: kapitel-3-solid @@ -296,11 +363,11 @@ zusätzlich jeweils UML Diagramm der Klasse] [4 Beispiele für die Ubiquitous Language; jeweils Bezeichung, Bedeutung und kurze Begründung, warum es zur Ubiquitous Language gehört] -| Bezeichung | Bedeutung | Begründung | -| Link | Steht für eine eindeutige URL, die von der Anwendung gespeichert werden soll | Gehört zur Ubiquitous-Laguage, weil Link außerhalb der Domäne der Anwendung auch anders verwendet werden kann | -| Category | Steht für eine Kategorie, die einem Link zugeordnet werden kann | Gehört zur Ubiquitous-Laguage, weil nur im Kontext der Anwendung klar ist, wofür die Kategorien verwendet werden | -| Tag | Steht für einen Tag der automatisch bestimmten Link-Typen zugeordnet wird | Gehört zur Ubiquitous-Laguage, weil nur im Kontext der Anwendung klar ist, was genau getaggt wird und wie dies geschieht | -| | | | +| Bezeichung | Bedeutung | Begründung | +| Link | Steht für eine eindeutige URL, die von der Anwendung gespeichert werden soll | Gehört zur Ubiquitous-Laguage, weil Link außerhalb der Domäne der Anwendung auch anders verwendet werden kann | +| Category | Steht für eine Kategorie, die einem Link zugeordnet werden kann | Gehört zur Ubiquitous-Laguage, weil nur im Kontext der Anwendung klar ist, wofür die Kategorien verwendet werden | +| Tag | Steht für einen Tag der automatisch bestimmten Link-Typen zugeordnet wird | Gehört zur Ubiquitous-Laguage, weil nur im Kontext der Anwendung klar ist, was genau getaggt wird und wie dies geschieht | +| *TagMatcher | Steht für eine spezielle Implementation des Interfaces TagMatcher (z.B. GitHubTagMatcher), das dafür sorgt, dass einem Link ein Tag zugewiesen werden kann | Gehört zur Ubiquitous-Laguage, weil nur im Kontext der Anwendung klar ist, auf welche Tag sich die Funktion bezieht und was deren Bedeutung ist. | *** Entities :PROPERTIES: diff --git a/Documentation/programmEntwurf.pdf b/Documentation/programmEntwurf.pdf index 650e5f7..0a86364 100644 Binary files a/Documentation/programmEntwurf.pdf and b/Documentation/programmEntwurf.pdf differ diff --git a/Documentation/uml/CSVCategoryPersistenceAdapter.png b/Documentation/uml/CSVCategoryPersistenceAdapter.png new file mode 100644 index 0000000..6cdd347 Binary files /dev/null and b/Documentation/uml/CSVCategoryPersistenceAdapter.png differ diff --git a/Documentation/uml/CSVCategoryPersistenceAdapterClasses.png b/Documentation/uml/CSVCategoryPersistenceAdapterClasses.png new file mode 100644 index 0000000..e01f40a Binary files /dev/null and b/Documentation/uml/CSVCategoryPersistenceAdapterClasses.png differ diff --git a/Documentation/uml/GitHubTagMatcher.png b/Documentation/uml/GitHubTagMatcher.png new file mode 100644 index 0000000..aa50c0c Binary files /dev/null and b/Documentation/uml/GitHubTagMatcher.png differ diff --git a/Documentation/uml/LinkCliAdapter.png b/Documentation/uml/LinkCliAdapter.png new file mode 100644 index 0000000..66610a3 Binary files /dev/null and b/Documentation/uml/LinkCliAdapter.png differ diff --git a/Documentation/uml/LinkCliAdapter.uml b/Documentation/uml/LinkCliAdapter.uml new file mode 100644 index 0000000..b6fa5aa --- /dev/null +++ b/Documentation/uml/LinkCliAdapter.uml @@ -0,0 +1,159 @@ + + + JAVA + cli.link.LinkCliAdapter + + category.CategoryName + cli.link.LinkCliAdapter + link.LinkUrl + link.LinkDto + link.LinkUseCase + cli.link.LinkCommands + user.Username + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + All + private + + diff --git a/Documentation/uml/LinkCliAdapterClasses.png b/Documentation/uml/LinkCliAdapterClasses.png new file mode 100644 index 0000000..8e3b14d Binary files /dev/null and b/Documentation/uml/LinkCliAdapterClasses.png differ diff --git a/Documentation/uml/LinkUrl.png b/Documentation/uml/LinkUrl.png new file mode 100644 index 0000000..84dd5d6 Binary files /dev/null and b/Documentation/uml/LinkUrl.png differ