Fachlicher Vertrag: unverändert zu erhalten
- Transformationsergebnis bleibt semantisch identisch.
- Externe Stylesheets/Dokumente sind standardmäßig gesperrt.
- Templates-Nutzung ist threadsicher.
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.
| Dimension | Legacy | Modern | Migrationskonsequenz |
|---|---|---|---|
| Programmiermodell | imperativ / ohne Framework-Annotationen | explizite Java-Abstraktionen | Annotationen und Containerfunktionen werden nur dort eingesetzt, wo sie eine konkrete technische Verantwortung übernehmen. |
| Abhängigkeiten | 1 direkte Dependencies | 1 direkte Dependencies | 0 neu, 0 entfernt; Versionen und transitive Auswirkungen im erfolgreichen Online-Build prüfen. |
| Öffentliche API | 1 erkannte Methoden | 1 erkannte Methoden | Methoden werden nach fachlicher Rolle gemappt; reine Bootstrap- und Framework-Methoden sind kein fachlicher Vertrag. |
| Datenmodell | class LegacyXsltTransformer | class SecureXsltTemplate | Feldnamen, IDs, Null-Semantik, Gleichheit und Serialisierungsform werden separat regressionstestet. |
| Fehlerverhalten | Legacy-Exceptions und Rückgabewerte | explizitere Fach-/Framework-Fehlerabbildung | Fehler dürfen nicht nur technisch übersetzt werden; Status, Ursache, Retrybarkeit und Client-Vertrag müssen erhalten oder versioniert werden. |
| Tests | Bestands- und Golden-Master-Tests | Unit-, Slice-, Contract- und Integrationstests | Der Modern-Pfad wird zuerst gegen denselben fachlichen Vektor geprüft und danach um neue technische Risiken ergänzt. |
| Betrieb | Legacy-Start/Lifecycle | modernes Packaging, Health und externe Konfiguration | Golden-Master-Dokumente und negative XXE-/Malformed-Tests sind obligatorisch. |
| Rollback | Legacy-Artefakt bleibt unverändert | Modern-Artefakt getrennt deploybar | Kein Rollback über Datenverlust: Schema, Nachrichten und verschlüsselte Daten müssen rückwärtslesbar oder durch Dual-Read abgesichert sein. |
external access, thread safety and cache invalidation
external resource denial, concurrency and invalid stylesheet tests
Die Zuordnung ist semantisch: Eine Legacy-Klasse kann in mehrere moderne Rollen zerlegt werden.
| Legacy-Rolle / Datei | Modern-Rolle / Datei | Bedeutung |
|---|---|---|
| LegacyXsltTransformer.java | SecureXsltTemplate.java | Transformer pro Aufruf wird sichere vorkompilierte Templates-Fassade. |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| LegacyXsltTransformer.java | class LegacyXsltTransformer | — | String transform(InputStream xml, InputStream xsl) | Factory – erzeugt Transformer über die standardisierte TransformerFactory. | 14 |
| Datei | Typ | Annotationen | öffentliche API | Pattern | Zeilen |
|---|---|---|---|---|---|
| SecureXsltTemplate.java | class SecureXsltTemplate | — | String transform(InputStream xml) | Flyweight | 25 |
| Status | Dependency | Version | Scope | Prüfung |
|---|---|---|---|---|
| BEIBEHALTEN | org.junit.jupiter:junit-jupiter | BOM/Parent → BOM/Parent | test → test | Gemeinsame Dependency; Version und Scope im effektiven POM prüfen. |
Die folgenden Ausschnitte stammen direkt aus den enthaltenen Projekten. Dadurch ist sichtbar, welche Verantwortung tatsächlich verschoben wurde.
Migrationsbedeutung: Transformer pro Aufruf wird sichere vorkompilierte Templates-Fassade.
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();
}
}
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();
}
}
--- 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();
}
}
| ID | Ebene | Prüfung | erforderlicher Nachweis |
|---|---|---|---|
| 31-XSLT-A01 | Integration/Contract | Output-Diff enthält nur genehmigte Unterschiede. | Automatisierter Test und CI-Protokoll |
| 31-XSLT-A02 | Integration/Contract | Externer Datei-/Netzzugriff ist blockiert. | Automatisierter Test und CI-Protokoll |
| 31-XSLT-A03 | Integration/Contract | Paralleltests beeinflussen sich nicht. | Automatisierter Test und CI-Protokoll |
| 31-XSLT-A04 | Integration/Contract | Ungültiges Stylesheet scheitert früh. | Automatisierter Test und CI-Protokoll |
| 31-XSLT-A05 | Integration/Contract | Cache-Strategie hat definierte Invalidierung. | Automatisierter Test und CI-Protokoll |
| 31-XSLT-T01 | Unit | Fachlogik ohne Container oder externen Dienst testen. | Unit-Test |
| 31-XSLT-T02 | Regression | Legacy- und Modern-Ergebnis für denselben Golden-Master-Vektor vergleichen. | Vergleichsreport |
| 31-XSLT-T03 | Negative | Fehlerhafte, leere und grenzwertige Eingaben prüfen. | Negativtest |
| 31-XSLT-T04 | Operations | Start, Health, Shutdown und Konfigurationsfehler prüfen. | Deployment-/Startprotokoll |
| 31-XSLT-T05 | Security | XXE, externe Entitäten und malformed XML negativ testen. | Security-Test |
| 31-XSLT-F01 | Fokus | external resource denial, concurrency and invalid stylesheet tests | Modulspezifischer Testreport |
| Risiko | Auswirkung | Gegenmaßnahme | Gate |
|---|---|---|---|
| external access, thread safety and cache invalidation | NIEDRIG | external resource denial, concurrency and invalid stylesheet tests | vor Cutover |
Keine zusätzlichen Ressourcen.
Die Fassade kann bei Problemen wieder pro Aufruf kompilieren; Security-Konfiguration darf dabei nicht zurückgenommen werden.