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

  • Vorhaben 2020

    03.01.2020

    Genau wie letztes Jahr habe ich auch dieses Jahr wieder ein "Listche" verfasst, um mir all die interessanten Vorhaben zu notieren, die ich mit mittlerem zeitlichen Horizont anzugehen gedenke.

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • 38c3 - Nachlese

    Nach dem ersten Teil von mir als interessant eingestufter Vorträge des Chaos Communication Congress 2024 hier nun die Nachlese

    Weiterlesen...
  • 38c3 - Empfehlungen

    Nach dem So - wie auch im letzten Jahr: Meine Empfehlungen für Vorträge vom Chaos Communication Congress 2024 - vulgo: 38c3:

    Weiterlesen...

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.