7.1 KiB
model
| model |
|---|
| sonnet |
AP06 – Bootstrap und CLI-Adapter
Meilenstein: M1 Vorgänger: AP05 ✅ erforderlich Nachfolger: AP07, AP09 Grundlage:
docs/specs/technik-und-architektur.mdv5, §§ „CLI-Zuschnitt", „Laufzeit- und Betriebsmodell", „Gültigkeitsentscheidung und Exit-Codes", „Zeichensätze" Entscheidungsprotokoll:docs/arbeitspakete/m1/E00-entscheidungsprotokoll.md(E-05 fat JAR)
Ziel
Die bestehende AsvValidatorApplication wird in zwei klar getrennte Verantwortlichkeiten zerlegt:
- Bootstrap (
de.gecheckt.asv.bootstrap.Main) — verdrahtet alle Komponenten manuell per Constructor Injection, ist der einzigepublic static void main - CLI-Adapter (
de.gecheckt.asv.adapter.in.cli.CliRunner) — nimmt CLI-Argumente entgegen, ruft Application-Schicht auf, übersetzt Ergebnis in Exit-Code
Zusätzlich werden Exit-Codes spec-konform auf 0/1/2 umgestellt, ISO-8859-15 als Eingabe-Encoding eingeführt, und das Uber-JAR via maven-shade-plugin gebaut.
Voraussetzungen
- AP03, AP04, AP05
Scope IN
Bootstrap (de.gecheckt.asv.bootstrap.Main)
public static void main(String[] args)- Verdrahtet manuell per Constructor Injection:
LoggingConfiguratorCliRunner- Application-Service (in M1 noch Dummy-Pfad — Datei lesen, leeren
ValidationReportzurückgeben)
- Ruft
CliRunner.run(args)auf und gibt den Exit-Code anSystem.exitweiter - Log4j2-Typen dürfen nur hier und in
adapter.out.loggingsichtbar sein
CLI-Adapter (de.gecheckt.asv.adapter.in.cli.CliRunner)
- Methode
int run(String[] args) - Akzeptiert genau ein Positionsargument: Pfad zur Eingabedatei
- Bei 0 oder ≥ 2 Argumenten → Exit-Code
2, kurze deutsche Fehlermeldung auf STDERR (vollständiger Minimalbericht kommt in AP08) - Bei nicht existierender, nicht lesbarer oder nicht regulärer Eingabedatei → Exit-Code
2 - Bei erfolgreichem Lauf ohne Spec-Fehler → Exit-Code
0 - Bei erfolgreichem Lauf mit Spec-Fehlern → Exit-Code
1
Exit-Code-Konstanten
Konstanten nur noch in einer Klasse (z.B. ExitCode im Paket adapter.in.cli):
public final class ExitCode {
public static final int VALID = 0;
public static final int INVALID = 1;
public static final int OPERATIONAL_ERROR = 2;
private ExitCode() {}
}
Die alten Konstanten (EXIT_CODE_INVALID_ARGUMENTS=1, EXIT_CODE_FILE_ERROR=2, EXIT_CODE_VALIDATION_ERRORS=3) werden gelöscht.
Verdrahtung mit Befundmodell (AP05)
CliRunnernutztValidationReport.computeVerdict()zur Exit-Code-Ableitung- Im Bedienfehlerfall:
ValidationReport.operationalError(...)→ Exit-Code2 - Der eigentliche M1-Dummy-Pfad: Datei wird gelesen (ISO-8859-15), Bytes gezählt, leerer
ValidationReportmitfileNameundtimestampzurückgegeben. Keine echte Validierung in M1.
Zeichensatz-Korrektur
Beim Einlesen der Eingabedatei wird ISO-8859-15 verwendet:
// Korrekt:
Charset iso = Charset.forName("ISO-8859-15");
// NICHT: StandardCharsets.UTF_8
// NICHT: Charset.defaultCharset()
JDK-21-Verfügbarkeit per Test belegen: Eine Datei mit Byte 0xA4 ergibt beim Einlesen das Euro-Zeichen €, weil 0xA4 in ISO-8859-15 auf Euro-Zeichen liegt.
Uber-JAR via maven-shade-plugin
maven-jar-plugin-Platzhalter aus AP02 ersetzen durch maven-shade-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version><!-- aktuell stabil --></version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation=
"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>de.gecheckt.asv.bootstrap.Main</mainClass>
</transformer>
<!-- Log4j2 PluginCache zusammenführen -->
<transformer implementation=
"org.apache.maven.plugins.shade.resource.Log4j2PluginsCacheFileTransformer"/>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
java -jar target/asv-format-validator-*.jar <datei> muss ohne -cp funktionieren.
.gitignore — logs/ ergänzen
logs/ zum .gitignore hinzufügen (gemäß E-04 aus Entscheidungsprotokoll). Der statische Dateipfad aus AP04 wird nach AP07 durch dynamische Logdatei ersetzt.
Scope OUT
- Berichtdatei und Log-Datei im Eingabeverzeichnis (AP07)
- Vollständiger Minimalbericht bei Exit-Code
2(AP08) - Entkopplung der Altlogik (AP09)
- Architekturtest (AP10)
Schritte
de.gecheckt.asv.bootstrap.MainanlegenCliRunnerinadapter.in.clianlegenExitCode-Konstantenklasse anlegenAsvValidatorApplicationschrittweise entkernen: Code wandert nachCliRunnerundMain- Einlese-Encoding auf
Charset.forName("ISO-8859-15")umstellen maven-shade-plugininpom.xmleinbinden,maven-jar-plugin-Platzhalter entfernenlogs/in.gitignoreergänzen- Alle Tests die auf
AsvValidatorApplicationdirekt zeigen aufCliRunnerumziehen mvn clean package— erzeugtes JAR mitjava -jar target/asv-format-validator-*.jar <testdatei>manuell prüfenmvn clean verifygrün bekommen- Abschlussbericht schreiben
Abnahmekriterien
de.gecheckt.asv.bootstrap.Mainexistiert und istMain-Classdes Uber-JARCliRunnerist der einzige Ort mit CLI-Argument-Parsing- Exit-Codes
0,1,2sind definiert und spec-konform eingesetzt, kein Exit-Code3mehr erreichbar - Test: Aufruf ohne Argument → Exit-Code
2 - Test: Aufruf mit nicht existierender Datei → Exit-Code
2 - Test: Aufruf mit leerer, lesbarer Datei → Exit-Code
0 - Einlese-Encoding ist ISO-8859-15 (per Test belegt: Byte
0xA4→€) java -jar target/asv-format-validator-*.jar <datei>startet ohne-cplogs/in.gitignore- Keine Log4j2-Typen außerhalb von
bootstrapundadapter.out.logging mvn clean verifygrün- Abschlussbericht unter
docs/arbeitspakete/m1/berichte/AP06-bericht.md
Rest-Risiken und offene Punkte
- Der Dummy-Pfad (Datei lesen, leerer Report) ist bewusst dünn. Echte Parser-/Validator-Einbindung kommt in M3+.
- Nicht versuchen, in AP06 schon die alte Parser-/Validator-Kette mit dem neuen Modell zu verknüpfen — das ist AP09-Scope.
maven-shade-pluginmit Log4j2 benötigt denLog4j2PluginsCacheFileTransformer, sonst werden Log4j2-Plugins nicht korrekt geladen.
Bericht
docs/arbeitspakete/m1/berichte/AP06-bericht.md nach docs/arbeitspakete/m1/templates/ap-bericht.md.