Skip to content

MansenC/HydraJavaAdapter

Repository files navigation

Hydra Java Adapter

Dies ist der Java Adapter für mein Projekt namens Hydra. Die Aufgabe dieses Projektes ist es, die Kompilierung sowie die Ausführung von Java-Sourcedateien zu übernehmen. Der Adapter analysiert die kompilierten Klassen und baut über sie eine Struktur auf, die an das Frontend gesendet und von diesem verwendet werden kann.

Beispiel

Angenommen der Nutzer hat in einem Projekt eine Source-Datei namens Mango.java, die wie folgt strukturiert ist:

public class Mango {
    private String color = "#FF0000";

    public void makeGreen() {
        color = "#00FF00";
    }
}

Der Nutzer hat dann im Frontend die Möglichkeit, eine neue Instanz dieser Mango zu erstellen. Diese wird dann in einem Fenster mit einem Bild einer Mango angezeigt, die durch den angegebenen Farbwert rot gefärbt ist. Sollte der Nutzer nun über das Frontend die Methode makeGreen aufrufen, wird sich der Wert von color dementsprechend ändern und die Mango ist ab dann grün gefärbt.

Prozessablauf

Der Adapter startet mit einer Kompilierung der Source-Dateien. Diese werden zu einer Jar zusammengefügt, welche über einen Classloader geladen wird. Anschließend wird mit Reflection über den JarAnalyzer die Struktur der Klassen aufgebaut, welche über das Datenobjekt namens ObjectData repräsentiert wird.

Mit Hilfe des ObjectPools können Instanzen dieser Klassen erstellt werden, die im Kern eine echte Instanz der vom Nutzer erstellten Klasse beinhalten. Diese werden dann durch die Klasse RuntimeObjectInstance gemanaged. Anschließend können über den ObjectPool verschiedene Modifikationen in diesen Instanzen unternommen werden, wie Methoden aufzurufen. Änderungen in den Klassen werden in einem sogenannten ChangeScope gesammelt, damit diese korrekt modifiziert werden. Jede Instanz hat einen TrackingRecord, welcher Referenzen auf andere runtime instances haben kann, wodurch Veränderungen in diesen Referenzen ebenso festgestellt werden können.

Type System

Besonders ist auch ein eigenes Type System, welches verwendet wird, um Unterstützung für generische Klassen herzustellen. Dieses nutzt einen AST der Source-Dateien, um einen exakten Typ für generische Typen aufzubauen. Zu finden ist dieses System unter jars/ast mit der zentralen Klasse ClassOrGenericType.

Arbeitsethos

Priorität lege ich sehr auf die Lesbarkeit des Codes, weshalb ich einen Linter mit durchaus strengen Regeln verwende. Dokumentation ist für mich ebenso sehr wichtig, weshalb vor allem in Dateien und Änderungen nach 2022 vermehrt viele Kommentare und Javadoc zu finden sind. Anschließend ist es mir wichtig, dass sämtliche Änderungen und Features korrekt funktonieren, weshalb zu jedem zentralen System automatisierte Tests vorhanden sind. Zuletzt folgt das korrekte Design von Datenstrukturen, welche mir eine möglichst simple und optimale Umsetzung verschiedener Algorithmen erlauben. Viele der Strukturen, wie sie in diesem Projekt existieren, befinden sich im Zustand ihrer Erstimplementierung, da kein refactoring nötig war.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages