URL-Verbindung direkt im Fachcode
Netzwerkzugriff und Auswertung sind eng gekoppelt; Tests können schwer isoliert werden.
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.
Netzwerkzugriff und Auswertung sind eng gekoppelt; Tests können schwer isoliert werden.
Java HttpClient ist ein Adapter; der Service hängt nur von einem kleinen TextTransport-Port ab.
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% |
| HTTP-Transport | 1 | 2 | 18 | 26 | 25% |
| Use-Case und Test | 1 | 2 | 11 | 30 | 7% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
HTTP-Client- und Testabhängigkeiten werden 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>20httpclienttesting-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>http-client-legacy</artifactId>
<packaging>jar</packaging>
<name>HTTP Client 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>20httpclienttesting-pair</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>http-client-modern</artifactId>
<packaging>jar</packaging>
<name>HTTP Client 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>Direkter Clientzugriff wird hinter einem Port gekapselt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyHttpClient.java | TextTransport.java JavaHttpTransport.java | Direktvergleich Semantische Ähnlichkeit: 25% |
package at.aydin.lab.http.legacy;
// Design Pattern: Adapter – kapselt HttpURLConnection hinter einer kleinen Client-API.
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
public final class LegacyHttpClient {
public String get(String url) throws IOException {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
try (InputStream in = connection.getInputStream()) {
return new String(in.readAllBytes(), StandardCharsets.UTF_8);
} finally {
connection.disconnect();
}
}
}package at.aydin.lab.http.modern;
import java.net.URI;
// Design Pattern: Port
// Zweck: HTTP-Transport wird für Tests und alternative Implementierungen austauschbar.
@FunctionalInterface
public interface TextTransport {
String get(URI uri) throws Exception;
}package at.aydin.lab.http.modern;
import java.net.*;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
// Design Pattern: Adapter
// Zweck: Adaptiert java.net.http.HttpClient an den fachlichen TextTransport-Port.
public final class JavaHttpTransport implements TextTransport {
private final HttpClient client = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(5)).build();
public String get(URI uri) throws Exception {
HttpRequest request = HttpRequest.newBuilder(uri).timeout(Duration.ofSeconds(10)).GET().build();
return client.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)).body();
}
}Netzwerkabhängiger Test wird durch testbaren Service mit Fake/Stub-Transport ersetzt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyHttpClientTest.java | PageTitleService.java PageTitleServiceTest.java | Direktvergleich Semantische Ähnlichkeit: 7% |
package at.aydin.lab.http.legacy;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertThrows;
class LegacyHttpClientTest {
@Test
void rejectsMalformedUrl() {
assertThrows(Exception.class, () -> new LegacyHttpClient().get("not a url"));
}
}package at.aydin.lab.http.modern;
import java.net.URI;
import java.util.regex.*;
public final class PageTitleService {
private static final Pattern TITLE = Pattern.compile("<title>(.*?)</title>", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
private final TextTransport transport;
public PageTitleService(TextTransport transport) {
this.transport = transport;
}
public String title(URI uri) throws Exception {
Matcher m = TITLE.matcher(transport.get(uri));
return m.find() ? m.group(1).trim() : "";
}
}package at.aydin.lab.http.modern;
import org.junit.jupiter.api.Test;
import java.net.URI;
import static org.junit.jupiter.api.Assertions.assertEquals;
class PageTitleServiceTest {
@Test
void testsWithoutNetwork() throws Exception {
TextTransport fake = uri -> "<html><title>Testseite</title></html>";
assertEquals("Testseite", new PageTitleService(fake).title(URI.create("https://example.invalid")));
}
}