TransformerFactory ohne Hardening
Stylesheet wird pro Aufruf verarbeitet; externe Ressourcen können je nach Factory-Konfiguration erreichbar sein.
Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.
Stylesheet wird pro Aufruf verarbeitet; externe Ressourcen können je nach Factory-Konfiguration erreichbar sein.
Templates werden einmal kompiliert und externe DTD-/Stylesheet-Zugriffe werden eingeschränkt.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 34 | 100% |
| XML- und XSLT-Testressourcen | 2 | 2 | 2 | 2 | 100% |
| Transformer und Test | 2 | 2 | 27 | 41 | 33% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
XSLT- und Testkonfiguration wird verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 100% |
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>31xslt-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>xslt-legacy</artifactId>
<packaging>jar</packaging>
<name>XSLT Legacy</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project><?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.aydin.academy</groupId>
<artifactId>31xslt-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>xslt-modern</artifactId>
<packaging>jar</packaging>
<name>XSLT Modern</name>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>Gleiche Ressourcen zeigen ausschließlich Sicherheits-/API-Änderungen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| catalog.xml title.xsl | catalog.xml title.xsl | Direktvergleich Semantische Ähnlichkeit: 100% |
<catalog><book><title>Java</title></book></catalog><?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="text"/><xsl:template match="/"><xsl:value-of select="catalog/book/title"/></xsl:template></xsl:stylesheet><catalog><book><title>Java</title></book></catalog><?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="text"/><xsl:template match="/"><xsl:value-of select="catalog/book/title"/></xsl:template></xsl:stylesheet>Ungehärtete Transformation wird sicher konfigurierter Template-Wiederverwendung gegenübergestellt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyXsltTransformer.java LegacyXsltTransformerTest.java | SecureXsltTemplate.java SecureXsltTemplateTest.java | Direktvergleich Semantische Ähnlichkeit: 33% |
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();
}
}package at.aydin.lab.xslt.legacy;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class LegacyXsltTransformerTest {
@Test
void transforms() throws Exception {
try (var x = getClass().getResourceAsStream("/catalog.xml"); var s = getClass().getResourceAsStream("/title.xsl")) {
assertEquals("Java", new LegacyXsltTransformer().transform(x, s));
}
}
}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();
}
}package at.aydin.lab.xslt.modern;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SecureXsltTemplateTest {
@Test
void reusesCompiledTemplate() throws Exception {
try (var s = getClass().getResourceAsStream("/title.xsl")) {
var t = new SecureXsltTemplate(s);
try (var x = getClass().getResourceAsStream("/catalog.xml")) {
assertEquals("Java", t.transform(x));
}
}
}
}