Modul 31 · Migration Deep Dive · Stufe 3 Application Layer

XSLT

Transformer pro Aufruf mit Defaults wird nachvollziehbar in vorkompilierte Templates mit Secure Processing überführt. Die Akte zeigt nicht nur das Ziel, sondern die tatsächlichen Dateien, APIs, Dependencies, Codebelege, Tests, Risiken und Cutover-Schritte.

FlyweightFactory
1 → 1Produktionsdateien
14 → 25Java-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 LegacyXsltTransformerclass SecureXsltTemplateFeldnamen, 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

  • Transformationsergebnis bleibt semantisch identisch.
  • Externe Stylesheets/Dokumente sind standardmäßig gesperrt.
  • Templates-Nutzung ist threadsicher.

Hauptrisiko und Testfokus

external access, thread safety and cache invalidation

external resource denial, concurrency and invalid stylesheet 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
LegacyXsltTransformer.javaSecureXsltTemplate.javaTransformer pro Aufruf wird sichere vorkompilierte Templates-Fassade.

Legacy-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
LegacyXsltTransformer.javaclass LegacyXsltTransformerString transform(InputStream xml, InputStream xsl)Factory – erzeugt Transformer über die standardisierte TransformerFactory.14

Modern-Quellinventar

DateiTypAnnotationenöffentliche APIPatternZeilen
SecureXsltTemplate.javaclass SecureXsltTemplateString transform(InputStream xml)Flyweight25

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
LegacyXsltTransformer.java
Modern
SecureXsltTemplate.java

Migrationsbedeutung: Transformer pro Aufruf wird sichere vorkompilierte Templates-Fassade.

Legacy-Code

projects/31-xslt/legacy/src/main/java/at/aydin/lab/xslt/legacy/LegacyXsltTransformer.java

package at.aydin.lab.xslt.legacy;

// Design Pattern: Factory – erzeugt Transformer über die standardisierte TransformerFactory.
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import java.io.*;

public final class LegacyXsltTransformer {
    public String transform(InputStream xml, InputStream xsl) throws Exception {
        StringWriter out = new StringWriter();
        TransformerFactory.newInstance().newTransformer(new StreamSource(xsl)).transform(new StreamSource(xml), new StreamResult(out));
        return out.toString();
    }
}

Modern-Code

projects/31-xslt/modern/src/main/java/at/aydin/lab/xslt/modern/SecureXsltTemplate.java

package at.aydin.lab.xslt.modern;

import javax.xml.XMLConstants;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import java.io.*;

// Design Pattern: Flyweight
// Zweck: Thread-sichere Templates werden einmal kompiliert und für viele Transformationen wiederverwendet.
public final class SecureXsltTemplate {
    private final Templates templates;
    public SecureXsltTemplate(InputStream xsl) throws Exception {
        TransformerFactory f = TransformerFactory.newInstance();
        f.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        f.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
        f.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
        templates = f.newTemplates(new StreamSource(xsl));
    }

    public String transform(InputStream xml) throws Exception {
        StringWriter out = new StringWriter();
        templates.newTransformer().transform(new StreamSource(xml), new StreamResult(out));
        return out.toString();
    }
}
Technischen Unified Diff öffnen
--- LegacyXsltTransformer.java
+++ SecureXsltTemplate.java
@@ -1,14 +1,25 @@
-package at.aydin.lab.xslt.legacy;
+package at.aydin.lab.xslt.modern;
 
-// Design Pattern: Factory – erzeugt Transformer über die standardisierte TransformerFactory.
+import javax.xml.XMLConstants;
 import javax.xml.transform.*;
 import javax.xml.transform.stream.*;
 import java.io.*;
 
-public final class LegacyXsltTransformer {
-    public String transform(InputStream xml, InputStream xsl) throws Exception {
+// Design Pattern: Flyweight
+// Zweck: Thread-sichere Templates werden einmal kompiliert und für viele Transformationen wiederverwendet.
+public final class SecureXsltTemplate {
+    private final Templates templates;
+    public SecureXsltTemplate(InputStream xsl) throws Exception {
+        TransformerFactory f = TransformerFactory.newInstance();
+        f.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+        f.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+        f.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
+        templates = f.newTemplates(new StreamSource(xsl));
+    }
+
+    public String transform(InputStream xml) throws Exception {
         StringWriter out = new StringWriter();
-        TransformerFactory.newInstance().newTransformer(new StreamSource(xsl)).transform(new StreamSource(xml), new StreamResult(out));
+        templates.newTransformer().transform(new StreamSource(xml), new StreamResult(out));
         return out.toString();
     }
 }

Umsetzungsplan mit Qualitäts-Gates

  1. Arbeitspaket 1
    Legacy-Ausgaben mit repräsentativen XML/XSLT-Paaren sichern. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  2. Arbeitspaket 2
    TransformerFactory Security-Features explizit setzen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  3. Arbeitspaket 3
    Stylesheet einmal zu Templates kompilieren. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  4. Arbeitspaket 4
    Pro Aufruf einen Transformer aus Templates erzeugen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  5. Arbeitspaket 5
    Concurrency-, Cache- und invalides Stylesheet testen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.
  6. Arbeitspaket 6
    Legacy Transformer nach Output-Diff und Security-Test entfernen. Nachweis: Commit/PR, automatisierter Test und aktualisierte Betriebsdokumentation.

Konkreter Test- und Abnahmekatalog

IDEbenePrüfungerforderlicher Nachweis
31-XSLT-A01Integration/ContractOutput-Diff enthält nur genehmigte Unterschiede.Automatisierter Test und CI-Protokoll
31-XSLT-A02Integration/ContractExterner Datei-/Netzzugriff ist blockiert.Automatisierter Test und CI-Protokoll
31-XSLT-A03Integration/ContractParalleltests beeinflussen sich nicht.Automatisierter Test und CI-Protokoll
31-XSLT-A04Integration/ContractUngültiges Stylesheet scheitert früh.Automatisierter Test und CI-Protokoll
31-XSLT-A05Integration/ContractCache-Strategie hat definierte Invalidierung.Automatisierter Test und CI-Protokoll
31-XSLT-T01UnitFachlogik ohne Container oder externen Dienst testen.Unit-Test
31-XSLT-T02RegressionLegacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen.Vergleichsreport
31-XSLT-T03NegativeFehlerhafte, leere und grenzwertige Eingaben prüfen.Negativtest
31-XSLT-T04OperationsStart, Health, Shutdown und Konfigurationsfehler prüfen.Deployment-/Startprotokoll
31-XSLT-T05SecurityXXE, externe Entitäten und malformed XML negativ testen.Security-Test
31-XSLT-F01Fokusexternal resource denial, concurrency and invalid stylesheet testsModulspezifischer Testreport

Risikoregister des Moduls

RisikoAuswirkungGegenmaßnahmeGate
external access, thread safety and cache invalidationNIEDRIGexternal resource denial, concurrency and invalid stylesheet testsvor Cutover

Konfiguration und Ressourcen

Keine zusätzlichen Ressourcen.

Rollback und Koexistenz

Die Fassade kann bei Problemen wieder pro Aufruf kompilieren; Security-Konfiguration darf dabei nicht zurückgenommen werden.

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