ethersyncj - Java Bindings für Ethersync

vorhergehende Artikel in: Java Linux Komponenten
23.11.2024

Ich wurde über einen Post auf Mastodon auf ein Projekt aufmerksam, das mir so interessant erschien, dass ich daraus meine neueste Fingerübung machte...

Dieses Projekt definiert und implementiert ein Protokoll, das es erlaubt, an einem Rechner kollaborativ zu mehreren Personen an einem Textdokument zu arbeiten. Änderungen, die einer der Mitarbeitenden durchführt, werden damit sofort an alle anderen Editoren übertragen und dort transparent eingearbeitet, sodass alle Nutzer immer über einen aktuellen Gesamtüberblick über alle zusammengefassten Änderungen verfügen. Das Projekt stellt den Quelltext für den Server und die bereits existierenden Plugins für nvim und (geplant) VS Code auf Github als OpenSource unter AGPLv3+ zur Verfügung.

Meine Idee - nachdem ich mir die Dokumentation des Protokolls angesehen hatte - war, dass ich die in Java (Swing) vorhandene Komponente JTextArea zum Editieren von Text eigentlich recht einfach um Unterstützung dieses Protokolls erweitern könnte.

Wie sich herausstellte, war das doch nicht so einfach - ich öffnete daher ein Issue im Projekt und durch die sich daraus entspinnende überaus schnelle, ausführliche und kompetente Diskussion konnte ich die diversen Stolpersteine umschiffen - ich baute das schnell hingerotzte Skript danach noch ein wenig um und nach einem drastischen Refactoring war ich in der Lage, das Projekt unter dem Namen ethersyncj ebenfalls als OpenSource unter AGPLv3+ zur Verfügung zu stellen.

Die Stolpersteine waren im einzelnen im (fehlenden) Verständnis des Protokolls begründet: Unter anderem hatte ich übersehen, dass das verwendete Protokoll \r\n als Zeilenende erwartete und das Ende jeder Botschaft als Zeilenende erwartet wurde. Aber auch Java selbst wartete mit einigen Überraschumgen für mich auf: Die Tatsache, dass Java erst seit Version 16 Unix Domain Sockets nativ unterstützt gehörte genauso dazu wie der Fakt, dass `java.io.File.ToURI` keine korrekten file-URIs erzeugt: das Ergebnis dieses Aufrauf sieht zum Beispiel so ais: file:/tmp/some.file - möchte man eine korrekte URI erzeugen, muss man statt dessen `java.nio.file.Path.ToUri` benutzen, die für den gleichen Input mehr Slashes erzeugt: file:///tmp/some.file - Das führte natürlich zu einem sofortigen Update meiner Regeln für ArchUnit und damit auch zu einem größeren Refactoring meiner gesamten Codebase...

Außerdem - und das war dann doch wieder eine Diskrepanz im Protokoll - erzeugte ich die IDs, die in jeder Botschaft mitgesendet werden müssen als zufällige UUIDs, die ich in über eine BigInteger-Instamz in eine Zahl wandelte. Diese Zahl hatte eine Breite von 128 Bit, womit die Rust-Implementierung des Servers nicht umgehen konnte.

Ich werde noch einige weitere Arbeiten daran vornehmen - eine weitere Idee ist, den SQL-Editor in der sQLshell - unter Umständen als Plugin - ebenfalls in die Lage versetzen, dieses Protokoll zu unterstützen.

Aktuell findet man in der Dokumentation einige UML-Diagramme, die bei der Benutzung der Lösung und beim Verständnis der Implementierung helfen sollten - der Bequemlichkeit halber habe ich sie hier nochmals wiedergegeben:

Kommunikation

Erzeugung/Benutzung

Klassendiagramm

Aktualisierung vom 23. November 2024

Ich habe mich inzwischen entschieden, das Projekt nicht weiter zu verfolgen - einerseits habe ich es nicht geschafft, die Implementierung so robust und fehlerfrei zu entwickeln, dass sie tatsächlich end-Nutzertauglich gewesen wäre - andererseits aber passt die Idee (oder passte: ist ja ein OpenSource Projekt und entwickelt sich ständig weiter) nicht zu Java an sich, da die Positionen in Zeilen- und Spaltenkoordinaten angegeben werden und Java in den diversen Textkomponenten dises Konzept nicht kennt: Für Java gibt es lediglich das Konzept Text und die (lineare) Position des Zeichens darin - zweisimensional wird der Text erst im jeweiligen View. Daher existiert im Model das Konzept von Zeilen und Spalten konsequenterweise auch nicht.

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Ticketsysteme sind lebende Wesen

    29.03.2020

    Hier zunächst wieder eine Triggerwarnung: Dieser Artikel wird meine Meinung abbilden. es kann sein, dass sie dem einen oder anderen nicht gefällt - das ist mir aber egal. Und wenn hier irgendwelche Schneeflocken mitlesen, dann sind die selber schuld.

    Weiterlesen...

Neueste Artikel

  • Weitere Experimente mit dem Clifford-Attractor

    Ich berichtete hier bereits über Experimente mit dem Clifford-Attractor, allerdings war ich noch Experimente unter geringfügig geänderten Parametern schuldig...

    Weiterlesen
  • Neues Feature in meinem Static Site Generator: externe URLs

    Es wurde wieder einmal Zeit für ein neues Feature in meinem Static Site Generator mittels dessen ich ja auch meine Heimatseite im Zwischennetz gestalte und verwalte...

    Weiterlesen
  • Eine Bestandsaufnahme

    Es kamen mehrere Faktoren zusammen: die Tatsache, dass ich nicht mehr ganz so kürzlich die 50 überschritten habe hatte ebenso darauf Einfluss wie das heutige trübe Wetter und auch der Fakt, dass ich bereits beinahe alle Wochenendpflichten erledigt habe. Der letzte Stein des Anstoßes war dann aber, dass sich heute zum 125. Mal der Geburtstag von Erich Fromm jährt.

    Weiterlesen

jürgen key

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen Codeberg-Repositories findet man hier.