ethersyncj - Java Bindings für Ethersync

vorhergehende Artikel in: Java Linux Komponenten
01.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

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


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    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.