Modul 30 · Migration Deep Dive · Stufe 3 Application Layer

XML Parser

DOM lädt vollständigen Objektbaum wird nachvollziehbar in StAX verarbeitet Streaming-Events überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

ParserIterator
1 → 1Produktionsdateien
17 → 28Java-Zeilen
1 → 1Testdateien
0 / 0Dependencies entfernt / neu
NIEDRIGRisiko · Score 0

Was sich konkret ändert

DimensionLegacyModernMigrationskonsequenz
Programmiermodellimperativ / ohne Framework-Annotationenexplizite Java-AbstraktionenAnnotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen.
Abhängigkeiten1 direkte Dependencies1 direkte Dependencies0 neu, 0 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen.
Öffentliche API1 erkannte Methoden1 erkannte MethodenMethoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag.
Datenmodellclass DomOrderReaderclass StaxOrderReaderFeldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet.
FehlerverhaltenLegacy-Exceptions und Rückgabewerteexplizitere Fach-/Framework-FehlerabbildungFehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden.
TestsBestands- und Golden-Master-TestsUnit-, Slice-, Contract- und IntegrationstestsDer Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt.
BetriebLegacy-Start/Lifecyclemodernes Packaging, Health und externe KonfigurationGolden-Master-Dokumente und negative XXE-/Malformed-Tests sind obligatorisch.
RollbackLegacy-Artefakt bleibt unverändertModern-Artefakt getrennt deploybarKein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein.

Fachlicher Vertrag: unverändert zu erhalten

  • Extrahierte Fachwerte bleiben identisch.
  • Externe Entitäten und DTD-Zugriffe sind deaktiviert.
  • Speicherverbrauch skaliert mit Streaming statt Dokumentgröße.

Hauptrisiko und Testfokus

XXE, entity expansion and malformed XML

XXE-negative, namespace, large input and error-position tests

Die Modernisierung gilt erst als abgeschlossen, wenn der fachliche Vertrag automatisiert belegt ist.

Verbindliches Code- und Rollenmapping

Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.

Legacy-Rolle / DateiModern-Rolle / DateiBedeutung
DomOrderReader.javaStaxOrderReader.javaVollständiger DOM-Baum wird Streaming Reader.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
DomOrderReader.javaclass DomOrderReaderdouble total(InputStream in)Parser17

Modern-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
StaxOrderReader.javaclass StaxOrderReaderdouble total(InputStream inputStream)Iterator28

Dependency- und Laufzeitmigration

StatusDependencyVersionScopePrüfung
BEIBEHALTENorg.junit.jupiter:junit-jupiterBOM/Parent → BOM/Parenttest → testGemeinsame Dependency; Version und Scope im effektiven POM prüfen.
Direkte POM-Daten ersetzen keinen erfolgreichen Online-Build mit transitiver SBOM- und CVE-Prüfung.

Vorher-/Nachher-Codebelege

Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.

Legacy
DomOrderReader.java
Modern
StaxOrderReader.java

Migrationsbedeutung: Vollständiger DOM-Baum wird Streaming Reader.

Legacy-Code

projects/30-xml-parsers/legacy/src/main/java/at/aydin/lab/xmlparser/legacy/DomOrderReader.java

package at.aydin.lab.xmlparser.legacy;

import javax.xml.parsers.*;
import java.io.*;

// Design Pattern: Parser
// Zweck: DOM bietet komfortablen Objektbaum, lädt aber das komplette Dokument.
public final class DomOrderReader {
    public double total(InputStream in) throws Exception {
        var f = DocumentBuilderFactory.newInstance();
        f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        var nodes = f.newDocumentBuilder().parse(in).getElementsByTagName("total");
        double sum = 0;
        for (int i = 0; i < nodes.getLength(); i++) sum += Double.parseDouble(nodes.item(i).getTextContent());
        return sum;
    }
}

Modern-Code

projects/30-xml-parsers/modern/src/main/java/at/aydin/lab/xmlparser/modern/StaxOrderReader.java

package at.aydin.lab.xmlparser.modern;

import java.io.InputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;

// Design Pattern: Iterator
// Zweck: Pull-Parsing verarbeitet große Dokumente ereignisweise mit konstantem Speicherbedarf.
public final class StaxOrderReader {
    public double total(InputStream inputStream) throws Exception {
        XMLInputFactory factory = XMLInputFactory.newFactory();
        factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
        factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);

        XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
        double sum = 0;
        while (reader.hasNext()) {
            boolean totalElement = reader.next() == XMLStreamConstants.START_ELEMENT
                    && reader.getLocalName().equals("total");
            if (totalElement) {
                sum += Double.parseDouble(reader.getElementText());
            }
        }
        reader.close();
        return sum;
    }
}
Technischen Unified Diff öffnen
--- DomOrderReader.java
+++ StaxOrderReader.java
@@ -1,17 +1,28 @@
-package at.aydin.lab.xmlparser.legacy;
+package at.aydin.lab.xmlparser.modern;
 
-import javax.xml.parsers.*;
-import java.io.*;
+import java.io.InputStream;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
 
-// Design Pattern: Parser
-// Zweck: DOM bietet komfortablen Objektbaum, lädt aber das komplette Dokument.
-public final class DomOrderReader {
-    public double total(InputStream in) throws Exception {
-        var f = DocumentBuilderFactory.newInstance();
-        f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-        var nodes = f.newDocumentBuilder().parse(in).getElementsByTagName("total");
+// Design Pattern: Iterator
+// Zweck: Pull-Parsing verarbeitet große Dokumente ereignisweise mit konstantem Speicherbedarf.
+public final class StaxOrderReader {
+    public double total(InputStream inputStream) throws Exception {
+        XMLInputFactory factory = XMLInputFactory.newFactory();
+        factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
+        factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
+
+        XMLStreamReader reader = factory.createXMLStreamReader(inputStream);
         double sum = 0;
-        for (int i = 0; i < nodes.getLength(); i++) sum += Double.parseDouble(nodes.item(i).getTextContent());
+        while (reader.hasNext()) {
+            boolean totalElement = reader.next() == XMLStreamConstants.START_ELEMENT
+                    && reader.getLocalName().equals("total");
+            if (totalElement) {
+                sum += Double.parseDouble(reader.getElementText());
+            }
+        }
+        reader.close();
         return sum;
     }
 }

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    DOM-Ausgabe für repräsentative XMLs als Golden Master sichern. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    StaxOrderReader mit Namespace- und Encoding-Regeln implementieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    Secure Processing/External Access explizit konfigurieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    Malformed-, große Datei- und XXE-Fälle testen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Event-/Elementreihenfolge und Missing-Element-Regeln dokumentieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    DOM-Pfad nach Ergebnis- und Lastvergleich entfernen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
30-XML-PARSERS-A01Integration/ContractGolden-Master-Werte stimmen.Automatisierter Test und CI-Protokoll
30-XML-PARSERS-A02Integration/ContractXXE-/DTD-Test bleibt blockiert.Automatisierter Test und CI-Protokoll
30-XML-PARSERS-A03Integration/ContractGroße Datei überschreitet definiertes Speicherlimit nicht.Automatisierter Test und CI-Protokoll
30-XML-PARSERS-A04Integration/ContractMalformed XML enthält brauchbare Position.Automatisierter Test und CI-Protokoll
30-XML-PARSERS-A05Integration/ContractNamespaces werden korrekt behandelt.Automatisierter Test und CI-Protokoll
30-XML-PARSERS-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
30-XML-PARSERS-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
30-XML-PARSERS-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
30-XML-PARSERS-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
30-XML-PARSERS-T05SecurityXXE, externe Entitäten und malformed XML negativ testen.Security-Test
30-XML-PARSERS-F01FokusXXE-negative, namespace, large input and error-position testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
XXE, entity expansion and malformed XMLNIEDRIGXXE-negative, namespace, large input and error-position testsvor Cutover

Konfiguration und Ressourcen

Keine zusätzlichen Ressourcen.

Rollback und Koexistenz

Parser-Fassade kann DOM oder StAX anhand Feature Flag wählen; das fachliche Ergebnisobjekt bleibt identisch.

Abbruchkriterien

  • Fachlicher Golden-Master weicht ab.
  • Daten-, Nachrichten- oder API-Kompatibilität ist ungeklärt.
  • Fehlerquote, Latenz oder Ressourcenverbrauch überschreiten das vereinbarte Limit.
  • Monitoring oder Rückfallpfad ist nicht funktionsfähig.

Definition of Done

Direkte Arbeitslinks

⌂ Cockpit