Files
mdg-filius/tools/java-oracle/run.sh
T
julian.kiedaischandClaude Opus 5.5 698a775c37 feat(fls): export the editor model's files
exportProject.ts, step X3: the files of a PC or notebook from the model's
virtual file system under Java's root. A file's type follows from its kind:
text by a known extension (else "text"), an image or binary data by its
media type. Images and binary data are Base64 as FILIUS's
Base64.encodeBytes (iHarder 2.x) writes it: a line break after every 76
characters, also after the last full line. Without that, all 31 images of
the corpus came back with other content. A new oracle tool, Base64Cases,
has Java encode 19 lengths around the line length; javaBase64 matches all.
A router or home router keeps the files its constructor makes.

Checked by Java: every corpus file, imported, exported and written, loads
with the files of the original, byte for byte, up to named departures of
the model: files in its order (directories first, then by name), with the
type of their kind rather than the one the file named (Java itself names
them unevenly), and no router files beyond the constructor's (www.conf,
16 times). The synthetic model adds nested directories, text with and
without a known extension, a PNG, a JPEG, binary data with and without a
media type and 57 bytes, one Base64 line exactly. 10 mutation probes, each
loaded by Java, were all caught.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 09:11:39 +00:00

109 lines
5.6 KiB
Bash
Executable File

#!/bin/sh
# Reads every .fls under corpus/ with Java FILIUS itself and writes
# corpus/corpus.java.json. Java is the arbiter for the file format (plan §13, M2).
# Needs a JDK (17+), Maven and xvfb-run: FILIUS opens its main window while
# loading (Information.reset → JMainFrame), so it needs a display, not headless.
set -eu
here="$(cd "$(dirname "$0")" && pwd)"
root="$(cd "$here/../.." && pwd)"
commit=6640354
upstream="$here/.upstream"
if [ ! -d "$upstream/.git" ]; then
git clone -q https://gitlab.com/filius1/filius.git "$upstream"
fi
if [ "$(git -C "$upstream" rev-parse --short=7 HEAD)" != "$commit" ]; then
git -C "$upstream" fetch -q origin
git -C "$upstream" checkout -q "$commit"
rm -rf "$upstream/target"
fi
if [ ! -f "$upstream/target/filius.jar" ]; then
(cd "$upstream" && mvn -q -DskipTests package dependency:copy-dependencies -DoutputDirectory=target/lib)
fi
classpath="$upstream/target/filius.jar:$upstream/target/lib/*"
mkdir -p "$here/.build"
javac -encoding UTF-8 -d "$here/.build" -cp "$classpath" "$here/src/FlsOracle.java" "$here/src/GetterDefaults.java" "$here/src/IpCheckCases.java" "$here/src/DnsHostsCases.java" "$here/src/EmailFileCases.java" "$here/src/BeansDump.java" "$here/src/Base64Cases.java"
# FILIUS writes its settings below $HOME; keep them out of the real one.
mkdir -p "$here/.build/home"
# Removed first: a crashed run must not leave the previous result standing.
rm -f "$root/corpus/corpus.java.json"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" FlsOracle \
"$root/corpus" "$root/corpus/corpus.java.json" 2>&1 | grep -v 'logback\|^$' || true
test -s "$root/corpus/corpus.java.json"
# Getter defaults and static constants for the XMLEncoder references (packages/fls/src/javaDefaults.json).
defaults="$root/packages/fls/src/javaDefaults.json"
rm -f "$defaults"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" GetterDefaults "$defaults" \
filius.gui.netzwerksicht.JSidebarButton#iconTextGap \
filius.gui.netzwerksicht.JSidebarButton#verticalTextPosition \
filius.gui.netzwerksicht.JSidebarButton#displayedMnemonicIndex \
filius.gui.netzwerksicht.JSidebarButton#debugGraphicsOptions \
filius.gui.netzwerksicht.JSidebarButton#enabled \
java.lang.ThreadGroup#maxPriority \
filius.hardware.knoten.Rechner#maxLayerOfOperation \
filius.hardware.knoten.Notebook#maxLayerOfOperation \
filius.hardware.knoten.Vermittlungsrechner#maxLayerOfOperation \
filius.hardware.knoten.Gateway#maxLayerOfOperation \
filius.software.clientserver.ServerBaustein#port \
filius.software.dhcp.DHCPServer#port \
filius.software.dns.DNSServer#port \
filius.software.rip.RIPServer#port \
filius.software.www.WebServer#port \
javax.swing.SwingConstants::CENTER \
filius.software.clientserver.ServerBaustein#aktiv \
filius.software.clientserver.ClientBaustein#zielPort \
filius.software.clientserver.ClientBaustein#zielIPAdresse \
filius.software.dns.DNSServer#aktiv \
filius.software.www.WebServer#aktiv \
filius.software.www.WebServer#useVHost \
filius.software.dateiaustausch.PeerToPeerAnwendung#maxTeilnehmerZahl \
2>&1 | grep -v 'logback\|^$' || true
test -s "$defaults"
# IP.ipCheck on hand-picked cases (packages/fls/src/javaIp.ts).
cases="$root/packages/fls/test/ip-check.cases.txt"
ipcheck="$root/packages/fls/test/ip-check.java.json"
rm -f "$ipcheck"
HOME="$here/.build/home" java -cp "$classpath:$here/.build" IpCheckCases "$cases" "$ipcheck" 2>&1 | grep -v 'logback\|^$' || true
test -s "$ipcheck"
# Base64.encodeBytes around its line length (packages/fls/src/exportProject.ts, javaBase64).
base64="$root/packages/fls/test/base64.java.json"
rm -f "$base64"
HOME="$here/.build/home" java -cp "$classpath:$here/.build" Base64Cases "$base64" 0 1 2 3 55 56 57 58 59 113 114 115 116 171 172 2000 2001 2002 2052 2>&1 | grep -v 'logback\|^$' || true
test -s "$base64"
# DNSServer's own reading of /dns/hosts on hand-picked files (packages/fls/src/dnsHosts.ts).
cases="$root/packages/fls/test/dns-hosts.cases.txt"
dnshosts="$root/packages/fls/test/dns-hosts.java.json"
rm -f "$dnshosts"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" DnsHostsCases "$cases" "$dnshosts" 2>&1 | grep -v 'logback\|^$' || true
test -s "$dnshosts"
# EmailServer.kontenLaden and EmailAnwendung.laden on hand-picked account files (packages/fls/src/javaEmail.ts).
for kind in server client; do
cases="$root/packages/fls/test/email-$kind.cases.txt"
output="$root/packages/fls/test/email-$kind.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" EmailFileCases "$kind" "$cases" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# What XMLDecoder makes of the files packages/fls/src/javaBeansWriter.ts writes.
beans="$root/packages/fls/test/beans"
rm -f "$beans/beans.java.json"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" BeansDump "$beans" "$beans/beans.java.json" 2>&1 | grep -v 'logback\|^$' || true
test -s "$beans/beans.java.json"
# What Java loads from the files packages/fls writes: Java's view written
# again (topologyWriter.test.ts, UPDATE_WRITTEN=1) and the editor model
# exported (exportProject.test.ts, UPDATE_EXPORTED=1). The files are not
# checked in, their SHA-256 is.
for written in "$root/packages/fls/test/written" "$root/packages/fls/test/exported"; do
if [ -d "$written" ]; then
rm -f "$written.java.json"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" FlsOracle "$written" "$written.java.json" --sha256 2>&1 | grep -v 'logback\|^$' || true
test -s "$written.java.json"
fi
done