22.Mai | Chronos: Ressourcen-Management
Im vorherigen Artikel habe ich das neue Entitäten-System von Chronos thematisiert. Heute möchte ich Euch das neue Ressourcen-System vorstellen. Ich habe es grundlegend überarbeitet, um es benutzerfreundlicher und mehr erweiterbar zu machen. Das alte System unterstützte lediglich nur XML und war nicht erweiterbar. Das ändert sich nun ab der neuen Version. Standardmäßig wird JSON und XML unterstützt – es können aber neue Formate wie MySQL oder YAML erstellt werden.
Ressource anlegen
Als erstes benötigen wir eine Ressource. Dies kann eigentlich alles sein: Ein Bild, eine Zeichenkette oder eine Musikdatei. wir entscheiden uns für ein beliebiges Bild, taufen es test.png und speichern es in dem Ordner res/images/. Wir entscheiden uns in diesem Beispiel, die Ressource in einer XML-Datei zu handhaben, die wir my-resources.xml nennen. Eine einfachste Form sähe wie folgt aus:
|
1 2 3 4 |
<?xml version="1.0" encoding="UTF-8" ?> <resources xmlns="http://dev.my-reality.de/chronos/resources"> <resource type="image" id="test">res/images/test.png</resource> </resources> |
Diese Datei definiert jetzt, welche Ressourcen es überhaupt gibt und von welchem Typ diese ist. Chronos unterstützt bisher aber nur zwei Typen: string, welcher eine Zeichenkette repräsentiert und vector, welcher einen Vektor in einem Raum definiert. Würden wir diese obige Datei von Chronos einlesen wollen, würde uns Chronos mitteilen, dass der Typ image nicht aufgelöst werden kann. Um das Problem zu lösen, müssen wir uns einen sogannten RessourceLoader schreiben.
Im folgenden Beispiel entscheide ich mich für einen Loader, der mir Image-Objekte der Grafikbibliothek Slick2D serstellen kann:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@ResourceType("image") public class ImageLoader extends AbstractResourceLoader<Image> { @Override public Image create(ResourceDefinition definition) throws ResourceException { String path = definition.getValue(); Image image = null; try { image = new Image(path); } catch (SlickException e) { throw new ResourceException(e); } return image; } } |
In Zeile 1 registrieren wir den Loader mithilfe einer Annotation. Fehlt diese, ist Chronos nicht im Stande, diesen zu finden. Es gibt aber auch die Möglichkeit, in der chronos.xml Datei Loader zu registrieren, was aber ein anderes Thema ist. Der Name in der Annotation entspricht dem Namen, der auch als Typ in der XML-Datei verwendet wird. Dieser kann komplett variieren.
In Zeile 6 ”holen” wir uns den Inhalt der Ressourcen-Definition (in unserem Falle wird es res/images/test.png sein). Anschließend versuchen wir, ein neues Bild zu erstellen. Schlägt dies fehl (siehe Zeile 12), sollten wir eine Exception werfen. Diese sollte immer dann geworfen werden, wenn etwas mit der Definition nicht in Ordnung ist oder eine Ressource nicht gefunden werden kann.
Ressource verwenden
Nun schreiben wir uns ein kleines Programm, um unsere Ressource zu laden und verwenden zu können:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Laden der Ressource ResourceManager manager = ResourceManager.getInstance(); try { manager.load(new XMLSource("my-resources.xml")); } catch (ResourceException e) { e.printStackTrace(); } // Verwenden der Ressource Image image = manager.getResource("test", Image.class); if (image != null) { // Mache etwas mit image } |
That’s it! Wir laden zuerst unsere Ressource in den Manager (Zeile 4) und können diese anschließend in Zeile 10 mithilfe der ID (in unserem Falle “test”) abgreifen.
Fazit
Wir haben gesehen, dass wir im obigen Beispiel die Klasse XMLSource verwendet haben. Betrachtet man die load-Methode des Managers genauer, erwartet er eine Implementierung des Interfaces DataSource . Chronos bietet ebenfalls noch die Klasse JSONSource an, mit deren Hilfe wir unsere Ressource auch in einer .json-Datei definieren können.
Ressourcen-Management in Chronos kann noch weit komplexer sein. Man kann seine Ressourcen gruppieren und beispielsweise das Attribut deferred="true" setzen, um Ressourcen nachträglich laden zu können, sobald diese gebraucht werden. Das vorgestellte System ist Teil der neuen Version 0.8, welche noch nicht fertig ist. Wer den Fortschritt von Chronos beobachten möchte, kann dies getrost auf der offiziellen Webseite nachschauen.