M1-AP03: hexagonale Paketstruktur, Ist-Code migriert

This commit is contained in:
2026-04-09 07:44:19 +02:00
parent d0aac6a9ac
commit bd45de8d08
42 changed files with 323 additions and 102 deletions

View File

@@ -0,0 +1,160 @@
# Abschlussbericht Arbeitspaket AP03 Hexagonale Paketstruktur anlegen und Ist-Code migrieren
> **Bezug:** `docs/arbeitspakete/m1/AP03-hexagonale-paketstruktur.md`
> **Bearbeiter:** Claude Code (claude-sonnet-4-6)
> **Datum:** 2026-04-09
> **Commit(s):** _ausstehend wird vom Menschen nach Sichtung gesetzt_
> **Status:** ✅ abgeschlossen
## 1. Zusammenfassung
Die hexagonale Soll-Paketstruktur wurde vollständig angelegt und alle 16 bestehenden Klassen aus den Ist-Paketen (`cli`, `parser`, `validation`, `validation.model`, `validation.field`, `validation.structure`) in die neuen Soll-Pakete verschoben. Alle 147 Tests laufen weiterhin grün. Keine Logik wurde geändert, keine Klassen wurden gelöscht oder neu erzeugt (außer den 8 obligatorischen `package-info.java`-Dateien).
## 2. Umgesetzte Änderungen
### 2.1 Neue Verzeichnisstruktur (Soll-Pakete)
Folgende Pakete wurden als Java-Packages angelegt:
| Paket | Status |
|---|---|
| `de.gecheckt.asv.domain` | ✅ vorhanden (kein Inhalt verschoben; bereits korrekt) |
| `de.gecheckt.asv.application` | ✅ neu angelegt, mit Inhalt befüllt |
| `de.gecheckt.asv.adapter.in.cli` | ✅ neu angelegt, mit Inhalt befüllt |
| `de.gecheckt.asv.adapter.out.filesystem` | ✅ neu angelegt, leer (AP07) |
| `de.gecheckt.asv.adapter.out.parsing` | ✅ neu angelegt, mit Inhalt befüllt |
| `de.gecheckt.asv.adapter.out.reporting` | ✅ neu angelegt, mit Inhalt befüllt |
| `de.gecheckt.asv.adapter.out.logging` | ✅ neu angelegt, leer (AP04) |
| `de.gecheckt.asv.bootstrap` | ✅ neu angelegt, leer (AP06) |
### 2.2 Vorher-Nachher-Tabelle aller migrierten Klassen (Produktivcode)
| Alter Pfad (Ist) | Neuer Pfad (Soll) |
|---|---|
| `de.gecheckt.asv.cli.AsvValidatorApplication` | `de.gecheckt.asv.adapter.in.cli.AsvValidatorApplication` |
| `de.gecheckt.asv.cli.ValidationResultPrinter` | `de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinter` |
| `de.gecheckt.asv.parser.InputFileParser` | `de.gecheckt.asv.adapter.out.parsing.InputFileParser` |
| `de.gecheckt.asv.parser.DefaultInputFileParser` | `de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser` |
| `de.gecheckt.asv.parser.SegmentLineTokenizer` | `de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer` |
| `de.gecheckt.asv.parser.DefaultSegmentLineTokenizer` | `de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer` |
| `de.gecheckt.asv.parser.InputFileParseException` | `de.gecheckt.asv.adapter.out.parsing.InputFileParseException` |
| `de.gecheckt.asv.validation.InputFileValidator` | `de.gecheckt.asv.application.InputFileValidator` |
| `de.gecheckt.asv.validation.DefaultInputFileValidator` | `de.gecheckt.asv.application.DefaultInputFileValidator` |
| `de.gecheckt.asv.validation.model.ValidationError` | `de.gecheckt.asv.application.model.ValidationError` |
| `de.gecheckt.asv.validation.model.ValidationResult` | `de.gecheckt.asv.application.model.ValidationResult` |
| `de.gecheckt.asv.validation.model.ValidationSeverity` | `de.gecheckt.asv.application.model.ValidationSeverity` |
| `de.gecheckt.asv.validation.field.FieldValidator` | `de.gecheckt.asv.application.field.FieldValidator` |
| `de.gecheckt.asv.validation.field.DefaultFieldValidator` | `de.gecheckt.asv.application.field.DefaultFieldValidator` |
| `de.gecheckt.asv.validation.structure.StructureValidator` | `de.gecheckt.asv.application.structure.StructureValidator` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidator` | `de.gecheckt.asv.application.structure.DefaultStructureValidator` |
**Nicht migriert (Absicht):**
- `de.gecheckt.asv.domain.model.*` — Zielpfad ist identisch zum Quellpfad; keine Verschiebung nötig.
### 2.3 Vorher-Nachher-Tabelle aller migrierten Testklassen
| Alter Pfad (Ist) | Neuer Pfad (Soll) |
|---|---|
| `de.gecheckt.asv.cli.AsvValidatorApplicationTest` | `de.gecheckt.asv.adapter.in.cli.AsvValidatorApplicationTest` |
| `de.gecheckt.asv.cli.AsvValidatorApplicationAdditionalTest` | `de.gecheckt.asv.adapter.in.cli.AsvValidatorApplicationAdditionalTest` |
| `de.gecheckt.asv.cli.ValidationResultPrinterTest` | `de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinterTest` |
| `de.gecheckt.asv.parser.DefaultInputFileParserTest` | `de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParserTest` |
| `de.gecheckt.asv.parser.DefaultSegmentLineTokenizerTest` | `de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizerTest` |
| `de.gecheckt.asv.validation.DefaultInputFileValidatorTest` | `de.gecheckt.asv.application.DefaultInputFileValidatorTest` |
| `de.gecheckt.asv.validation.model.ValidationErrorTest` | `de.gecheckt.asv.application.model.ValidationErrorTest` |
| `de.gecheckt.asv.validation.model.ValidationResultTest` | `de.gecheckt.asv.application.model.ValidationResultTest` |
| `de.gecheckt.asv.validation.field.DefaultFieldValidatorTest` | `de.gecheckt.asv.application.field.DefaultFieldValidatorTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorTestAdditional` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorTestAdditional` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvfehFhlSegmentTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvfehFhlSegmentTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvrecRechnungsbetragTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvrecRechnungsbetragTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvrecRechnungskennzeichenTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvrecRechnungskennzeichenTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvrecSegmentCardinalityTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvrecSegmentCardinalityTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvrecSegmentOrderTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvrecSegmentOrderTest` |
| `de.gecheckt.asv.validation.structure.DefaultStructureValidatorAsvrecSegmentsTest` | `de.gecheckt.asv.application.structure.DefaultStructureValidatorAsvrecSegmentsTest` |
### 2.4 Neue package-info.java-Dateien
Für jede der 8 Soll-Paket-Wurzeln wurde eine `package-info.java` mit deutscher JavaDoc-Kurzbeschreibung angelegt:
- `de/gecheckt/asv/domain/package-info.java`
- `de/gecheckt/asv/application/package-info.java`
- `de/gecheckt/asv/adapter/in/cli/package-info.java`
- `de/gecheckt/asv/adapter/out/filesystem/package-info.java`
- `de/gecheckt/asv/adapter/out/parsing/package-info.java`
- `de/gecheckt/asv/adapter/out/reporting/package-info.java`
- `de/gecheckt/asv/adapter/out/logging/package-info.java`
- `de/gecheckt/asv/bootstrap/package-info.java`
Das Paket `adapter.out.crypto` wurde bewusst nicht angelegt (kommt erst in M8).
## 3. Scope-Treue
| Scope-Punkt aus dem Arbeitspaket | Erfüllt? | Bemerkung |
|---|---|---|
| Anlage aller 8 Soll-Pakete | ✅ | Alle Pakete als Java-Packages vorhanden |
| Migration `cli.AsvValidatorApplication``adapter.in.cli` | ✅ | Nur Package und Imports angepasst |
| Migration `cli.ValidationResultPrinter``adapter.out.reporting` | ✅ | Nur Package und Imports angepasst |
| `domain.model.*` bleibt unverändert | ✅ | Korrekt — kein Umzug nötig |
| Migration `parser.*``adapter.out.parsing` | ✅ | 5 Klassen verschoben |
| Migration `validation.*``application` (vorläufig) | ✅ | 2 Klassen + 3 Unterpaketgruppen |
| Alle `package`-Deklarationen und `import`-Statements angepasst | ✅ | Kein verbleibender Verweis auf Ist-Pakete |
| Tests entsprechend mitverschoben | ✅ | 17 Testklassen verschoben und angepasst |
| Build und Tests grün | ✅ | 147 Tests, BUILD SUCCESS |
| package-info.java pro Paket-Wurzel | ✅ | 8 Dateien angelegt |
| Keine inhaltlichen Umstellungen (Exit-Codes, Charset, …) | ✅ | Kein Scope-Out angefasst |
| Keine neuen Klassen außer package-info.java | ✅ | |
| Keine gelöschten Klassen | ✅ | |
| Kein Refactoring von Methoden | ✅ | |
**Wurde der Scope eingehalten?** Ja, vollständig.
**Wurden Dinge außerhalb des Scopes gemacht?** Nein.
## 4. Abnahmekriterien
| Abnahmekriterium | Erfüllt? | Nachweis |
|---|---|---|
| Alle Soll-Pakete existieren als Java-Packages | ✅ | `git status` zeigt alle Verzeichnisse |
| Kein Code verloren gegangen | ✅ | Nur `RM`-Einträge (renamed+modified) in `git status`, keine `D`-Einträge |
| `mvn clean verify` grün | ✅ | `Tests run: 147, Failures: 0, Errors: 0, Skipped: 0` |
| Jede neue Paket-Wurzel hat `package-info.java` | ✅ | 8 Dateien, alle mit deutscher Kurzbeschreibung |
| Abschlussbericht enthält Vorher-Nachher-Tabelle | ✅ | Abschnitt 2.2 und 2.3 |
| Keine neuen Features | ✅ | Reine Verschiebungsoperation |
## 5. Build- und Teststatus
- `mvn clean verify`: ✅ grün
- Anzahl Tests: 147 (davon 0 neu hinzugefügt — nur verschoben)
- Coverage (JaCoCo): nicht explizit geprüft; JaCoCo-Report wird weiterhin erzeugt
- Warnungen beim Build: Nur die bekannte javac-Annotationsverarbeitungs-Warnung (aus AP02 bekannt, kein Handlungsbedarf in AP03)
## 6. Rest-Risiken und offene Punkte
1. **Provisorische Lage von `validation.*`-Klassen unter `application`:** `DefaultStructureValidator`, `DefaultFieldValidator` und ihre Interfaces liegen jetzt unter `application`. AP09 entscheidet, ob sie dort bleiben oder in ein separates Preview-Paket wandern (M3+).
2. **`AsvValidatorApplication` noch monolithisch:** Die Klasse enthält weiterhin Bootstrap-Logik, CLI-Logik, Dateisystemzugriff und Log4j2-Direct-Import. Zerlegung folgt in AP06.
3. **`DefaultStructureValidatorTestAdditional` ohne `@Test`-Methoden:** Bereits aus AP01 bekannt; kein AP03-Thema, bleibt als Rest-Risiko bestehen (AP10 vorgesehen).
4. **Log4j2-Direktimport in `AsvValidatorApplication`:** Verletzt die Architekturkonvention (Log4j2 nur in `adapter.out.logging` und `bootstrap`). Wird in AP04/AP06 behoben; in AP03 bewusst nicht angefasst (Scope OUT).
## 7. Empfehlungen für Folge-Arbeitspakete
- **AP04 (Logging-Infrastruktur):** SLF4J-Fassade einführen; `AsvValidatorApplication` nutzt noch `LogManager` direkt — das muss auf SLF4J umgestellt werden. Das `adapter.out.logging`-Paket ist bereit.
- **AP06 (Bootstrap/CLI):** `AsvValidatorApplication` aufteilen. Das `bootstrap`-Paket ist angelegt und wartet auf seine Bootstrap-Klasse. `adapter.in.cli` erhält dann nur noch den dünnen CLI-Runner.
- **AP07 (Dateisystem-Adapter):** `adapter.out.filesystem` ist angelegt und bereit für Datei-Lese-/Schreibzugriff.
- **AP09 (Preview-Einfrieren):** Die Validation-Klassen unter `application.structure` und `application.field` sind M3+-Vorbau und sollen dort eingefroren werden. Die Entscheidung, ob sie im `application`-Paket bleiben oder in ein separates Preview-Paket wandern, liegt bei AP09.
## 8. Reviewer-Checkliste
- [x] Alle im Arbeitspaket genannten Scope-IN-Punkte sind nachweislich umgesetzt (Abschnitt 2 und 3)
- [x] Keine Scope-OUT-Punkte wurden angefasst (keine Logikänderungen, keine neuen Features)
- [x] Abnahmekriterien sind mit konkreten Nachweisen belegt (Abschnitt 4)
- [x] `mvn clean verify` ist grün (147 Tests, BUILD SUCCESS)
- [ ] Der Commit für dieses AP hat eine sprechende Message (`M1-AP03: Hexagonale Paketstruktur angelegt, Ist-Code migriert`) — _Commit liegt beim Menschen_
- [x] Keine Regeln der Grunddokumente (Spec, Fachliche, Technik) wurden verletzt
- [x] Rest-Risiken sind ehrlich dokumentiert (Abschnitt 6)

View File

@@ -1,18 +1,19 @@
package de.gecheckt.asv.cli; package de.gecheckt.asv.adapter.in.cli;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.parser.DefaultInputFileParser; import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException; import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.parser.InputFileParser; import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
import de.gecheckt.asv.parser.SegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.validation.DefaultInputFileValidator; import de.gecheckt.asv.application.DefaultInputFileValidator;
import de.gecheckt.asv.validation.InputFileValidator; import de.gecheckt.asv.application.InputFileValidator;
import de.gecheckt.asv.validation.field.DefaultFieldValidator; import de.gecheckt.asv.application.field.DefaultFieldValidator;
import de.gecheckt.asv.validation.field.FieldValidator; import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.structure.DefaultStructureValidator; import de.gecheckt.asv.application.structure.DefaultStructureValidator;
import de.gecheckt.asv.validation.structure.StructureValidator; import de.gecheckt.asv.application.structure.StructureValidator;
import de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinter;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;

View File

@@ -0,0 +1,7 @@
/**
* Eingehender CLI-Adapter des ASV-Format-Validators.
* Enthält den Haupteinstiegspunkt {@code AsvValidatorApplication}, der
* Kommandozeilenargumente entgegennimmt und die Verarbeitungskette anstößt.
* Wird in AP06 in Bootstrap-Klasse und dünnen CLI-Runner aufgeteilt.
*/
package de.gecheckt.asv.adapter.in.cli;

View File

@@ -0,0 +1,7 @@
/**
* Ausgehender Dateisystem-Adapter des ASV-Format-Validators.
* Verantwortlich für den lesenden und schreibenden Zugriff auf das Dateisystem,
* insbesondere für Eingabedateien und Ausgabedateien (Berichte, Logs).
* Wird ab AP07 mit Inhalt befüllt.
*/
package de.gecheckt.asv.adapter.out.filesystem;

View File

@@ -0,0 +1,8 @@
/**
* Ausgehender Logging-Adapter des ASV-Format-Validators.
* Enthält Log4j2-spezifische Konfiguration und Initialisierung.
* Log4j2-Typen dürfen projektweiter Konvention gemäß nur in diesem Paket
* und im {@code bootstrap}-Paket direkt verwendet werden.
* Wird ab AP04 mit Inhalt befüllt.
*/
package de.gecheckt.asv.adapter.out.logging;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import de.gecheckt.asv.domain.model.Field; import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import de.gecheckt.asv.domain.model.Field; import de.gecheckt.asv.domain.model.Field;
import java.util.ArrayList; import java.util.ArrayList;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
/** /**
* Exception thrown when an input file cannot be parsed due to format or content issues. * Exception thrown when an input file cannot be parsed due to format or content issues.

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import de.gecheckt.asv.domain.model.Field; import de.gecheckt.asv.domain.model.Field;
import java.util.List; import java.util.List;

View File

@@ -0,0 +1,7 @@
/**
* Ausgehender Parser-Adapter des ASV-Format-Validators.
* Enthält die Implementierung des EDIFACT-Zeilenparsers, der den Rohtext
* einer ASV-Eingabedatei in das Domänenmodell ({@code InputFile}) überführt.
* Trennzeichen-Logik basiert vorläufig auf '+' (UNA-Segment noch nicht ausgewertet).
*/
package de.gecheckt.asv.adapter.out.parsing;

View File

@@ -1,7 +1,7 @@
package de.gecheckt.asv.cli; package de.gecheckt.asv.adapter.out.reporting;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Printer-Klasse zum Ausgeben von ValidationResult-Objekten auf der Konsole. * Printer-Klasse zum Ausgeben von ValidationResult-Objekten auf der Konsole.

View File

@@ -0,0 +1,6 @@
/**
* Ausgehender Reporting-Adapter des ASV-Format-Validators.
* Enthält die Darstellungslogik für Validierungsergebnisse ({@code ValidationResultPrinter}).
* Gibt Prüfbefunde formatiert auf der Konsole aus; Dateiausgabe folgt in AP07.
*/
package de.gecheckt.asv.adapter.out.reporting;

View File

@@ -1,13 +1,13 @@
package de.gecheckt.asv.validation; package de.gecheckt.asv.application;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.field.FieldValidator; import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.structure.StructureValidator; import de.gecheckt.asv.application.structure.StructureValidator;
/** /**
* Standardimplementierung von InputFileValidator, die mehrere spezialisierte Validatoren orchestriert. * Standardimplementierung von InputFileValidator, die mehrere spezialisierte Validatoren orchestriert.

View File

@@ -1,7 +1,7 @@
package de.gecheckt.asv.validation; package de.gecheckt.asv.application;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Interface für die Orchestrierung der Validierung einer ASV-Eingabedatei. * Interface für die Orchestrierung der Validierung einer ASV-Eingabedatei.

View File

@@ -1,13 +1,13 @@
package de.gecheckt.asv.validation.field; package de.gecheckt.asv.application.field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.gecheckt.asv.domain.model.Field; import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
/** /**
* Default implementation of FieldValidator that checks general field rules. * Default implementation of FieldValidator that checks general field rules.

View File

@@ -1,7 +1,7 @@
package de.gecheckt.asv.validation.field; package de.gecheckt.asv.application.field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Interface für die Validierung von Feldern in einer ASV-Eingabedatei. * Interface für die Validierung von Feldern in einer ASV-Eingabedatei.

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.model; package de.gecheckt.asv.application.model;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.model; package de.gecheckt.asv.application.model;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.model; package de.gecheckt.asv.application.model;
/** /**
* Repräsentiert die Schweregrade von Validierungsergebnissen. * Repräsentiert die Schweregrade von Validierungsergebnissen.

View File

@@ -0,0 +1,8 @@
/**
* Anwendungsschicht des ASV-Format-Validators.
* Orchestriert die Validierung von ASV-Eingabedateien durch Koordination
* spezialisierter Validatoren (Struktur- und Feldvalidierung).
* Enthält vorläufig auch Validierungsmodell, Feld- und Strukturvalidatoren
* bis zur finalen Einordnung in AP09.
*/
package de.gecheckt.asv.application;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
@@ -8,9 +8,9 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
/** /**
* Standardimplementierung des StructureValidator, die allgemeine Strukturregeln prüft. * Standardimplementierung des StructureValidator, die allgemeine Strukturregeln prüft.

View File

@@ -1,7 +1,7 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Interface für die Validierung der strukturellen Integrität einer ASV-Eingabedatei. * Interface für die Validierung der strukturellen Integrität einer ASV-Eingabedatei.

View File

@@ -0,0 +1,8 @@
/**
* Bootstrap-Paket des ASV-Format-Validators.
* Verantwortlich für die manuelle Constructor Injection aller Komponenten
* sowie die Initialisierung der Infrastruktur (Logging, Encoding).
* Darf als einziges Paket neben {@code adapter.out.logging} Log4j2-Typen direkt verwenden.
* Wird ab AP06 mit der Bootstrap-Klasse befüllt.
*/
package de.gecheckt.asv.bootstrap;

View File

@@ -0,0 +1,7 @@
/**
* Fachliches Kernmodell des ASV-Format-Validators.
* Enthält die unveränderlichen Domänenobjekte (Records) der ASV-Dateistruktur:
* {@code InputFile}, {@code Message}, {@code Segment} und {@code Field}.
* Diese Klassen sind frei von Infrastruktur- und Framework-Abhängigkeiten.
*/
package de.gecheckt.asv.domain;

View File

@@ -1,15 +1,16 @@
package de.gecheckt.asv.cli; package de.gecheckt.asv.adapter.in.cli;
import de.gecheckt.asv.domain.model.Field; import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.InputFileParseException; import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.parser.InputFileParser; import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
import de.gecheckt.asv.validation.InputFileValidator; import de.gecheckt.asv.application.InputFileValidator;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
import de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;

View File

@@ -1,7 +1,8 @@
package de.gecheckt.asv.cli; package de.gecheckt.asv.adapter.in.cli;
import de.gecheckt.asv.parser.InputFileParser; import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
import de.gecheckt.asv.validation.InputFileValidator; import de.gecheckt.asv.application.InputFileValidator;
import de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.parser; package de.gecheckt.asv.adapter.out.parsing;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;

View File

@@ -1,8 +1,8 @@
package de.gecheckt.asv.cli; package de.gecheckt.asv.adapter.out.reporting;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation; package de.gecheckt.asv.application;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -8,11 +8,11 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.field.FieldValidator; import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
import de.gecheckt.asv.validation.structure.StructureValidator; import de.gecheckt.asv.application.structure.StructureValidator;
class DefaultInputFileValidatorTest { class DefaultInputFileValidatorTest {

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.field; package de.gecheckt.asv.application.field;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -11,9 +11,9 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity; import de.gecheckt.asv.application.model.ValidationSeverity;
class DefaultFieldValidatorTest { class DefaultFieldValidatorTest {

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.model; package de.gecheckt.asv.application.model;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.model; package de.gecheckt.asv.application.model;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Testfälle für die Validierung der Mindestpräsenz des FHL-Segments in ASVFEH-Nachrichten. * Testfälle für die Validierung der Mindestpräsenz des FHL-Segments in ASVFEH-Nachrichten.

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Tests für die Rechnungsbetrag-Regel bei ASVREC mit Rechnungskennzeichen "1": * Tests für die Rechnungsbetrag-Regel bei ASVREC mit Rechnungskennzeichen "1":

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Tests für die Rechnungskennzeichen-Regel in ASVREC-Nachrichten: * Tests für die Rechnungskennzeichen-Regel in ASVREC-Nachrichten:

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Tests für die Kardinalitätsregel in ASVREC-Nachrichten: * Tests für die Kardinalitätsregel in ASVREC-Nachrichten:

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
/** /**
* Tests für die Reihenfolgeregel der Pflichtsegmente in ASVREC-Nachrichten: * Tests für die Reihenfolgeregel der Pflichtsegmente in ASVREC-Nachrichten:

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
class DefaultStructureValidatorAsvrecSegmentsTest { class DefaultStructureValidatorAsvrecSegmentsTest {

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -15,12 +15,12 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.DefaultInputFileParser; import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException; import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.parser.SegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
class DefaultStructureValidatorTest { class DefaultStructureValidatorTest {

View File

@@ -1,4 +1,4 @@
package de.gecheckt.asv.validation.structure; package de.gecheckt.asv.application.structure;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@@ -14,12 +14,12 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile; import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message; import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment; import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.DefaultInputFileParser; import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException; import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.parser.SegmentLineTokenizer; import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.validation.model.ValidationError; import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult; import de.gecheckt.asv.application.model.ValidationResult;
class DefaultStructureValidatorTestAdditional { class DefaultStructureValidatorTestAdditional {