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

@@ -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.parser.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException;
import de.gecheckt.asv.parser.InputFileParser;
import de.gecheckt.asv.parser.SegmentLineTokenizer;
import de.gecheckt.asv.validation.DefaultInputFileValidator;
import de.gecheckt.asv.validation.InputFileValidator;
import de.gecheckt.asv.validation.field.DefaultFieldValidator;
import de.gecheckt.asv.validation.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.structure.DefaultStructureValidator;
import de.gecheckt.asv.validation.structure.StructureValidator;
import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.application.DefaultInputFileValidator;
import de.gecheckt.asv.application.InputFileValidator;
import de.gecheckt.asv.application.field.DefaultFieldValidator;
import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.structure.DefaultStructureValidator;
import de.gecheckt.asv.application.structure.StructureValidator;
import de.gecheckt.asv.adapter.out.reporting.ValidationResultPrinter;
import java.io.IOException;
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.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 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.

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;

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 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.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.List;
import java.util.Objects;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.structure.StructureValidator;
import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.structure.StructureValidator;
/**
* 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.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.List;
import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationSeverity;
/**
* 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.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.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.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.

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.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.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationSeverity;
/**
* 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.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.InputFileParseException;
import de.gecheckt.asv.parser.InputFileParser;
import de.gecheckt.asv.validation.InputFileValidator;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
import de.gecheckt.asv.application.InputFileValidator;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
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.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.validation.InputFileValidator;
import de.gecheckt.asv.adapter.out.parsing.InputFileParser;
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.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 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 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.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationSeverity;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
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.*;
@@ -8,11 +8,11 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.validation.field.FieldValidator;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.validation.structure.StructureValidator;
import de.gecheckt.asv.application.field.FieldValidator;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationSeverity;
import de.gecheckt.asv.application.structure.StructureValidator;
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.*;
@@ -11,9 +11,9 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.validation.model.ValidationSeverity;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationSeverity;
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 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 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.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.*;
@@ -12,8 +12,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
/**
* 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.*;
@@ -11,8 +11,8 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
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.*;
@@ -15,12 +15,12 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException;
import de.gecheckt.asv.parser.SegmentLineTokenizer;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
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.*;
@@ -14,12 +14,12 @@ import de.gecheckt.asv.domain.model.Field;
import de.gecheckt.asv.domain.model.InputFile;
import de.gecheckt.asv.domain.model.Message;
import de.gecheckt.asv.domain.model.Segment;
import de.gecheckt.asv.parser.DefaultInputFileParser;
import de.gecheckt.asv.parser.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.parser.InputFileParseException;
import de.gecheckt.asv.parser.SegmentLineTokenizer;
import de.gecheckt.asv.validation.model.ValidationError;
import de.gecheckt.asv.validation.model.ValidationResult;
import de.gecheckt.asv.adapter.out.parsing.DefaultInputFileParser;
import de.gecheckt.asv.adapter.out.parsing.DefaultSegmentLineTokenizer;
import de.gecheckt.asv.adapter.out.parsing.InputFileParseException;
import de.gecheckt.asv.adapter.out.parsing.SegmentLineTokenizer;
import de.gecheckt.asv.application.model.ValidationError;
import de.gecheckt.asv.application.model.ValidationResult;
class DefaultStructureValidatorTestAdditional {