M1-AP03: hexagonale Paketstruktur, Ist-Code migriert
This commit is contained in:
160
docs/arbeitspakete/m1/berichte/AP03-bericht.md
Normal file
160
docs/arbeitspakete/m1/berichte/AP03-bericht.md
Normal 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)
|
||||
Reference in New Issue
Block a user