SimpleMin Dokumentation
SimpleMin ist eine globale, modulare Konfigurationsbibliothek, die mit Erweiterbarkeit, Stabilität und Flexibilität entwickelt wurde. Mit SimpleMin kannst du Konfigurationsdateien mit einer eigenen, menschenlesbaren Syntax erstellen, laden und speichern.
Die Bibliothek bietet fortschrittliche Features wie benutzerdefinierte Type Handler, detaillierte Fehlerdiagnose, Schema-Validierung, immutable Konfigurationsobjekte, einen erweiterten Ausdrucksparser, Hot Reloading und eine Fluent API für den bequemen Code-basierten Aufbau von Konfigurationen.
Installation
Füge folgendes Repository zu deiner pom.xml hinzu:
/* === DOC START ===
Repository Definition für Maven. Dieses Repository liefert die beta-Version von SimpleMin.
=== DOC END === */
<repository>
<id>syntaxjason-repo</id>
<url>https://repo.syntaxjason.de/beta/</url>
</repository>
Und dann die folgende Dependency:
/* === DOC START ===
Dependency Definition für SimpleMin. Diese Version ist beta.1.
=== DOC END === */
<dependency>
<groupId>de.syntaxjason</groupId>
<artifactId>simplemin</artifactId>
<version>beta.1</version>
</dependency>
Füge folgendes Repository zu deiner build.gradle hinzu:
/* === DOC START ===
Repository Definition für Gradle. Dieses Repository liefert die beta-Version von SimpleMin.
=== DOC END === */
repositories {
maven {
url "https://repo.syntaxjason.de/beta/"
}
}
Und dann die folgende Dependency:
/* === DOC START ===
Dependency Definition für SimpleMin in Gradle.
=== DOC END === */
dependencies {
implementation 'de.syntaxjason:simplemin:beta.1'
}
Features
- Custom Type Handler / Converter Registry: Ermöglicht die Registrierung von benutzerdefinierten Konvertern, um spezielle Typen automatisch in SimpleMin-Werte umzuwandeln und zurück.
- Erweiterte Fehlerdiagnose & Debugging: Detaillierte Fehlermeldungen mit Zeilen- und Spaltenangaben, Kontext-Snippets und einem Debug-Modus zur besseren Analyse von Parsing-Fehlern.
- Schema-Validierung & Default-Werte: Validiert Konfigurationsdateien anhand definierter Schemas und füllt fehlende Werte automatisch mit voreingestellten Defaults.
- Immutable Konfigurationsobjekte & Thread-Sicherheit: Nach dem Laden kann die Konfiguration in unveränderliche, thread-sichere Objekte umgewandelt werden.
- Erweiterter Ausdrucksparser: Unterstützt komplexe arithmetische Ausdrücke inklusive Klammern, Multiplikation, Division und mehr.
- Hot Reloading & Dynamische Aktualisierung: Mit Java NIO WatchService werden Dateiänderungen automatisch erkannt, wodurch die Konfiguration im laufenden Betrieb neu geladen wird.
- Fluent API / Builder Pattern: Eine intuitive, chainable API (SimpleMinBuilder und SimpleMinArrayBuilder) zum programmgesteuerten Erstellen von Konfigurationen.
- onLoad / onSave Hooks: Ermöglichen es, das Laden und Speichern der Konfiguration individuell anzupassen, indem man diese Methoden überschreibt.
Beispiele
SimpleMinDocument Beispiel
/* === DOC START ===
Dieses Beispiel zeigt, wie man ein SimpleMinDocument erstellt und konfiguriert.
Die onLoad() Methode wird überschrieben, um das root-Objekt zu setzen.
Die onSave() Methode ruft die Standard-Implementierung auf.
=== DOC END === */
SimpleMinDocument doc = new SimpleMinDocument("config.spm") {
@Override
protected void onLoad() throws IOException {
// Setzt das root-Objekt auf ein leeres SimpleMinObject
setRoot(new SimpleMinObject());
}
@Override
protected void onSave() throws IOException {
// Nutzt die Standardimplementierung zum atomaren Speichern
super.onSave();
}
};
doc.load();
doc.setVariable("global_var", new SimpleMinPrimitive("Hello World"));
doc.startHotReloading();
doc.save();
SimpleMinObject Beispiel
/* === DOC START ===
Erstellt ein SimpleMinObject und fügt einige Schlüssel-Wert-Paare hinzu.
=== DOC END === */
SimpleMinObject config = new SimpleMinObject();
config.put("server", new SimpleMinPrimitive("MyMinecraftServer"));
config.put("max_players", new SimpleMinPrimitive(100));
SimpleMinArray Beispiel
/* === DOC START ===
Erstellt ein SimpleMinArray und fügt zwei Elemente (Spielernamen) hinzu.
=== DOC END === */
SimpleMinArray players = new SimpleMinArray();
players.add(new SimpleMinPrimitive("Steve"));
players.add(new SimpleMinPrimitive("Alex"));
SimpleMinPrimitive Beispiel
/* === DOC START ===
Erstellt ein SimpleMinPrimitive mit einem numerischen Wert und gibt diesen aus.
=== DOC END === */
SimpleMinPrimitive coins = new SimpleMinPrimitive(100);
System.out.println(coins.getValue());
Fluent API Beispiel
/* === DOC START ===
Dieses Beispiel demonstriert die Verwendung der Fluent API, um ein verschachteltes Konfigurationsobjekt zu erstellen.
=== DOC END === */
SimpleMinObject config = SimpleMinBuilder.create()
.add("host", "example.com")
.add("port", 8080)
.addObject("database", db -> db
.add("username", "dbuser")
.add("password", "secret")
.add("timeout", 5000)
)
.addArray("servers", arr -> arr
.add("server1")
.add("server2")
.addObject(obj -> obj
.add("name", "server3")
.add("ip", "192.168.1.3")
)
)
.build();
System.out.println(config.serialize(0));
Erweiterung & Entwickler
Entwickler können SimpleMin einfach erweitern – ohne den Kerncode zu verändern. Nachfolgend sind Beispiele aufgeführt, die zeigen, wie zusätzliche Funktionalitäten integriert werden können.
Custom Type Handler / Converter Registry
/* === DOC START ===
Registriere einen benutzerdefinierten Converter für die Klasse Beispiel.
Mit diesem Converter kann ein Objekt der Klasse Beispiel aus einem SimpleMinValue erzeugt werden.
=== DOC END === */
SimpleMinConverterRegistry.registerConverter(Beispiel.class, new BeispielConverter());
/* === DOC START ===
Rufe den Converter ab und konvertiere ein SimpleMinValue in ein Beispiel-Objekt.
=== DOC END === */
SimpleMinConverter<Beispiel> converter = SimpleMinConverterRegistry.getConverter(Beispiel.class);
Beispiel obj = converter.fromSimpleMin(simpleMinValue);
Schema-Validierung & Merge
/* === DOC START ===
Dieses Beispiel demonstriert, wie ein Schema zur Validierung einer Konfiguration eingesetzt wird.
- SimpleMinSchema definiert erwartete Felder und deren Default-Werte.
- SimpleMinValidator.validate() prüft die Konfiguration.
- schema.toSimpleMinObject() erstellt ein Default-Objekt, welches per merge() mit der Benutzereingabe kombiniert wird.
=== DOC END === */
SimpleMinSchema schema = new SimpleMinSchema();
schema.addField(new SimpleMinField("host", String.class, true, new SimpleMinPrimitive("localhost")));
schema.addField(new SimpleMinField("port", Integer.class, true, new SimpleMinPrimitive(8080)));
// 'configObject' ist das vom Benutzer geladene SimpleMinObject
List errors = SimpleMinValidator.validate(configObject, schema);
if (!errors.isEmpty()) {
errors.forEach(System.out::println);
} else {
// Erstelle ein Default-Objekt basierend auf dem Schema
SimpleMinObject defaults = schema.toSimpleMinObject();
// Merge die Benutzereingabe in das Default-Objekt
defaults.merge(configObject);
// Das Ergebnis ist ein vollständiges, validiertes Konfigurationsobjekt
configObject = defaults;
}
Immutable Objekte & Thread-Sicherheit
/* === DOC START ===
Konvertiert ein SimpleMinObject in ein unveränderliches, thread-sicheres Objekt.
=== DOC END === */
ImmutableSimpleMinObject immutableConfig = configObject.toImmutable();
Erweiterter Ausdrucksparser
/* === DOC START ===
Evaluiert einen komplexen arithmetischen Ausdruck mit Klammern und Operatoren.
=== DOC END === */
ExtendedExpressionEvaluator evaluator = new ExtendedExpressionEvaluator();
double result = evaluator.evaluate("10 + (5 * 2) - 3");
Fluent API / Builder Pattern
/* === DOC START ===
Erstellt ein verschachteltes Konfigurationsobjekt mithilfe der Fluent API.
=== DOC END === */
SimpleMinObject config = SimpleMinBuilder.create()
.add("host", "example.com")
.add("port", 8080)
.addObject("database", db -> db
.add("username", "dbuser")
.add("password", "secret")
)
.addArray("servers", arr -> arr
.add("server1")
.add("server2")
)
.build();
System.out.println(config.serialize(0));
Weitere Anpassungen können durch das Überschreiben der onLoad() und onSave() Methoden in der SimpleMinDocument Klasse vorgenommen werden.
API Dokumentation
- SimpleMinDocument: Verwaltet das Laden, Speichern, Hot Reloading und Merge-Funktionalitäten der Konfiguration. Enthält Hooks wie
onLoad()undonSave(). - SimpleMinObject: Repräsentiert ein Konfigurationsobjekt. Unterstützt Merging und die Umwandlung in immutable Objekte.
- SimpleMinArray: Repräsentiert ein Array in der Konfiguration und kann ebenfalls in immutable Versionen konvertiert werden.
- SimpleMinPrimitive: Repräsentiert einfache, primitive Werte wie Zahlen, Strings oder Booleans.
- ExtendedExpressionEvaluator: Unterstützt komplexe arithmetische Ausdrücke mit Operatoren und Klammern.
- SimpleMinFileWatcher: Nutzt Java NIO, um Dateiänderungen für Hot Reloading zu überwachen.
- SimpleMinConverter & ConverterRegistry: Ermöglicht die Registrierung von benutzerdefinierten Konvertern für spezielle Typen.
- Fluent API / Builder Pattern: Erleichtert das Erstellen von Konfigurationen mithilfe von SimpleMinBuilder und SimpleMinArrayBuilder.
- SpigotUtils: Enthält Hilfsfunktionen zur Konvertierung von Bukkit-Objekten in SimpleMin-Objekte (für Spigot-Projekte).
Interaktiver Playground
Experimentiere mit SimpleMin direkt im Browser: