aboutsummaryrefslogtreecommitdiff
path: root/src/wasm/java/eu
Commit message (Collapse)AuthorAgeFilesLines
* Das Jahr der Urheberschaft ist das der Datei, nicht das des VerzeichnissesMatthias Andreas Benkard18 hours2-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Jede eigene Datei trug bislang den Vermerk "2020" — das Jahr, in dem das Verzeichnis angelegt wurde. Von den neunundachtzig eigenen Dateien sind aber vierundachtzig erst 2026 entstanden. Der Vermerk sagte damit nicht, wann das Werk geschaffen wurde, sondern wann jemand zum ersten Mal etwas eincheckte; das ist nicht dasselbe, und für die Schutzfristberechnung ist es die falsche Angabe. Erhoben wird das Jahr nunmehr je Datei aus der Entstehungs- und der letzten Änderungsbuchung. Neunundsiebzig Dateien tragen "2026". Fünf reichen wirklich bis 2020 zurück und werden bis heute fortgeschrieben (.gitignore, README.md, pom.xml, AendGgner.java, logging.properties); sie tragen "2020-2026". Eine einzige Datei ist seit 2020 unberührt geblieben, .mvn/maven.config, und behält ihren Vermerk unverändert — sie war die einzige, bei der er von Anfang an stimmte. Die Zuordnungsdatei wird entsprechend geschieden. Der Block, der maven.config mit den drei übrigen kommentarlosen eigenen Dateien zusammenfasste, wird geteilt, weil deren Jahre auseinanderfallen; die abgeleiteten Textfassungen und die Herkunftsnachweise tragen 2026. Damit der Bau die Berichtigung nicht sogleich wieder zunichte macht, tritt im Kopfzeilenvordruck des Formatierers der Platzhalter "$YEAR" an die Stelle des festen Jahres. Er nimmt hin, was in der Datei steht, statt allen Java-Dateien dasselbe Jahr aufzunötigen. Geprüft: 350 Tests, REUSE 188/188, spotless:check ohne Beanstandung und spotless:apply ohne Änderung. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I876adf0a4ce63c198e0e549d7c976310e2a3a3ee
* Ein Gesetz tritt nicht notwendig auf einen Schlag in KraftMatthias Andreas Benkard19 hours1-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Das Dritte UWG-Änderungsgesetz lässt seinen Artikel 1 Nummer 2 Buchstabe c am 19. Juni 2026 wirksam werden und alles Übrige erst am 27. September; das Infektionsschutz-Änderungsgesetz von 2020 ändert dasselbe Stammgesetz in zwei Artikeln zu zwei Zeitpunkten. Wer alle Befehle zugleich anwendet, erhält dort eine Fassung, die an keinem einzigen Tag gegolten hat. Genau das tat ÄndGgner bisher, und zwar schweigend — die auffälligste Stelle, an der ein Werkzeug, das nie stillschweigend verwerfen will, doch etwas verschwieg. Der Schlussartikel wird jetzt gelesen. Die Artikelwahl erfasst ihn nicht, denn er trägt weder Änderungsformel noch Stammgesetz; maßgeblich ist der erste Artikel hinter dem letzten ändernden, damit in einem Gesetzblatt mit mehreren Gesetzen jedes seine eigene Schlussvorschrift bekommt. Erkannt werden die Grundregel, der Vorbehalt zugunsten späterer Absätze, die abweichende Anordnung für Artikel, Nummern, Buchstaben und Doppelbuchstaben sowie die Rückwirkung („mit Wirkung vom“). Nennt der Wortlaut kein Datum, sondern die Verkündung, so wird keines erfunden: Der Verkündungstag steht nicht im Gesetzestext. Zugeordnet wird über die Herkunft des Befehls — Artikel und Gliederungspfad —, und es gewinnt die besonderste Anordnung. Mit --stichtag (im Vordruck: „Stichtag“) ergibt sich die an jenem Tag geltende Fassung; was noch nicht galt, bleibt unangewandt und steht für sich, nicht unter den Gründen des Scheiterns. Ohne Stichtag bleibt es beim vollen Bestand, aber die Staffelung wird gerügt. Geprüft: 348 Tests (339 + 6 Einheitstests des Lesers + 3 Belegfälle), REUSE 180/180. UWG 1/19 Befehle am 19. Juni gegen 19/19 am 27. September, GEG 115 gegen 116, IfSG 65 gegen 75 — jeweils ohne Zuwachs an manuellen Resten. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I887f233c72a4e49b69f9ede3154dcadd704fb0c3
* Der Browser bekommt den Notausgang, den die Befehlszeile schon hatteMatthias Andreas Benkard32 hours1-4/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Die Browserfassung galt als die vollwertige zweite Fassung des Erzeugnisses. Zwei Angaben der Befehlszeile fehlten ihr aber: die Beschränkung auf einen einzelnen Artikel und die Ausgabe des maschinell gelesenen Textes. Die erste war im Vordruck nicht vorgesehen, obwohl Arbeiter und Rechenwerk den Wert längst durchreichten — das Formular sandte an ihrer Stelle hart einen leeren Wert. Die zweite war überhaupt nicht erreichbar. Das Fehlende wiegt ungleich. Die Artikelangabe erspart Mühe; die Textausgabe dagegen ist der einzige Weg, einem unerklärlich unangewandten Befehl auf den Grund zu gehen. Wer im Browser arbeitete, stand vor einem Ergebnis, das er nicht nachprüfen konnte, und war auf die Befehlszeile verwiesen — also gerade auf das, was die Browserfassung entbehrlich machen sollte. Die Textgewinnung wandert deshalb aus der Befehlszeilenklasse in den gemeinsamen Kern (Pipeline.extrahiereText); beide Fassungen nehmen fortan denselben Weg. Der Vordruck erhält das Feld „Anzuwendender Artikel“ und das Ankreuzfeld „Statt der Synopse nur den maschinell gelesenen Text der Änderungsdokumente ausgeben“; das Ergebnis kommt wie die Synopse als Verweis zum Öffnen und Sichern. Nebenbei verträgt die Umsetzung nach Wahrheitswerten nun ein nicht gesetztes Feld, das als „undefined“ herüberkommt. Das Handbuch zählt die Absätze des § 14 wieder fortlaufend — es führte (6) und (7) zweimal — und stellt die Angaben des Vordrucks den Schaltern des § 6 Absatz 2 gegenüber. Eine neue Prüfung hält die Ausgabe des Notausgangs gegen den Text, den der Parser bekommt: Führte sie einen anderen vor, so wiese sie in die Irre. Der Prüfbestand umfasst hiernach 335 Prüfungen, sämtlich grün; REUSE meldet 174/174. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I2a9aee042b6454f8d591bc415a5c6f1c1e7b40b6
* Der Formatierer setzt die Kopfzeilen, nicht die HandMatthias Andreas Benkard2 days2-14/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Achtundfünfzig Java-Dateien brauchen dieselben zwei Zeilen, und jede künftige braucht sie ebenfalls. Von Hand gesetzt, hielte das keinen Monat: Die eine Datei, die man vergisst, ist genau die, an der es später auffällt. Spotless führt daher fortan einen „licenseHeader“ mit dem Wortlaut, den die übrigen Dateien schon tragen. Der voreingestellte Trenner für Java ist das Schlüsselwort „package“; die Kopfzeilen treten also über die Paketangabe, und Spotless prüft und ergänzt sie bei jedem Lauf. Dabei hat sich ergeben, dass „src/wasm/java“ der Formatprüfung bislang verborgen war. Das Verzeichnis tritt dem Quellbaum erst im Profil „wasm“ bei, und zwar durch das Build-Helper-Plugin; im gewöhnlichen Bau sah Spotless es nie. Die Quellverzeichnisse sind deshalb ausdrücklich benannt („src/*/java/**/*.java“), was zugleich die doppelte Erfassung unter dem Profil vermeidet. Als Folge sind „BrowserMain“ und „InflaterErsatz“ erstmals umformatiert worden. Es geht dabei allein um das Satzbild — ein umbrochener Kommentarsatz und vier Annotationen, die nunmehr je auf eigener Zeile stehen; am Sinn ändert sich nichts. Sie stehen hier bewusst neben den Kopfzeilen und nicht in einem eigenen Commit, denn beides folgt aus derselben Einstellung und wäre getrennt nicht nachvollziehbar. Der Lauf von „spotless:apply“ hält achtundfünfzig Dateien sauber. Dreihundertfünfundzwanzig Testfälle bestehen unverändert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I3a41b93108ad13ed16f78385d6272e5c10a255a1
* Die Web-App rechnet im Browser statt auf dem ServerMatthias Andreas Benkard10 days2-0/+301
Bisher lief die Weboberfläche auf einem JDK-HttpServer: Uploads landeten als temporäre Dateien auf dem Server, die Synopse entstand dort. Das kostete Betrieb (systemd, Reverse Proxy, Rate-Limiting, Timeouts) und verlangte ein Datenschutzversprechen, das nur zusicherbar, nicht nachprüfbar war — gerade Entwurfstexte verließen den Rechner der Nutzer:innen. Neu übersetzt `./mvnw -Pwasm package` dieselbe Pipeline mit GraalVM Web Image (`native-image --tool:svm-wasm`) nach WebAssembly, PDFBox eingeschlossen. Ausgeliefert werden nur noch statische Dateien; gerechnet wird im Browser. Die erzeugte Synopse ist byteweise identisch mit der der Befehlszeile (SHA-256 verglichen für IfSG 48/27/21 und BayJG 151/3/54). Die Befehlszeile bleibt unberührt: `./mvnw package` erzeugt unverändert das JAR, alle Optionen und Meldungstexte sind gleich, das Wasm-Profil ist rein additiv und verlangt Oracle GraalVM 25.1+ (die CE hat kein Web Image). Portabilitätsschnitt (nützt beiden Fassungen): * `Quelle` (Name + Bytes) ersetzt `Path` in der Pipeline; nur die Befehlszeile kennt noch ein Dateisystem. Der Name trägt genau den bisherigen `getFileName()`-Text, damit Warnungen und Quellenzeile wortgleich bleiben. * `DateiTyp` erkennt PDF/XML/Klartext an den Signaturbytes. Tika entfällt — eine schwergewichtige Abhängigkeit samt ServiceLoader- und XML-Konfiguration weniger, was der Wasm-Übersetzung unmittelbar zugutekommt. Vier Eigenheiten von Web Image, die der Quelltext jeweils an Ort und Stelle vermerkt: * `java.util.zip.Inflater` ist nicht angebunden (GR-65205), ohne Inflate ist kein PDF lesbar. `InflaterErsatz` substituiert ihn durch jzlib. * Typisierte JS-Felder lassen sich nicht nach `byte[]` umsetzen („byteArrayHub is not defined“); der Dateiinhalt wandert als Base64. * JULs Standardformatter ruft `StackWalker`, den es dort nicht gibt. * Im Worker fehlt `document.currentScript`, worauf die Laufzeit das Wasm-Modul neben `worker.js` sucht; die VM wird deshalb mit ausdrücklichem Pfad ein zweites Mal gestartet. Die Reachability-Metadaten stammen aus einem Lauf des Tracing-Agents über die Pipeline; die PDFBox- und FontBox-Ressourcen sind als Globs ergänzt, sonst scheitern PDFs an „Could not find referenced cmap stream Identity-H“. Entfallen: WebMain, UploadHandler, StaticHandler, Multipart und die systemd-Unit. Die nginx-Vorlage liefert jetzt statische Dateien aus, und die Datenschutzseite sagt, was nun stimmt: Die Dateien verlassen den Rechner nicht. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Change-Id: I38faf2ac0f764d601f080d4276babe4747773683