#!/usr/bin/env bash # Regenerates output/. Needs JDK 25 and a JDK 28 early-access build (default location below; see output/00-environment.txt). # Early-access builds change weekly: expect these transcripts to need regenerating, and re-read the post's status callout. set -uo pipefail cd "$(dirname "$0")/.." J28=${JDK28:-/tmp/tools/jdk28}; J25=${JDK25:-/tmp/tools/jdk-25.0.4.1+1}; OUT=$PWD/output; W=/tmp/jdk28-preview-work; rm -rf "$W"; mkdir -p "$W" "$OUT" q() { grep -v -E '^Picked up'; } ver() { "$1/bin/java" -version 2>&1 | q | sed -n '1p;3p'; } { echo "# 00-environment"; echo "--- JDK 28 early-access:"; ver "$J28"; echo "--- JDK 25:"; ver "$J25"; } > "$OUT/00-environment.txt" { echo "# 01-value-classes: ValueClasses.java on JDK 28 with --enable-preview" "$J28/bin/javac" --enable-preview --release 28 -d "$W" src/ValueClasses.java 2>&1 | q | grep -v '^Note:' "$J28/bin/java" --enable-preview -cp "$W" ValueClasses 2>&1 | q echo "--- IntegerIdentity.java: same source, three runs" "$J25/bin/javac" -d "$W/i25" src/IntegerIdentity.java 2>&1 | q; "$J28/bin/javac" --enable-preview --release 28 -d "$W/i28" src/IntegerIdentity.java 2>&1 | q | grep -v '^Note:' echo "JDK 25: $("$J25/bin/java" -cp "$W/i25" IntegerIdentity 2>&1 | q)" echo "JDK 28, no preview: $("$J28/bin/java" -cp "$W/i25" IntegerIdentity 2>&1 | q)" echo "JDK 28, --enable-preview: $("$J28/bin/java" --enable-preview -cp "$W/i28" IntegerIdentity 2>&1 | q)" } > "$OUT/01-value-classes.txt" { echo "# 02-forgot-the-preview-flag" echo "--- javac ValueClasses.java (no --enable-preview):"; "$J28/bin/javac" -d "$W/n" src/ValueClasses.java 2>&1 | q | head -4 echo "--- java ValueClasses (compiled with the flag, run without):"; "$J28/bin/java" -cp "$W" ValueClasses 2>&1 | q | head -2 } > "$OUT/02-forgot-the-preview-flag.txt" "$J28/bin/javac" --enable-preview --release 28 -d "$W/s" src/StrictFieldProbe.java 2>&1 | q >/dev/null { echo "# 03-strict-init-flags (javap -v -p, field flags only)" for c in 'StrictFieldProbe$Money' 'StrictFieldProbe$Legacy'; do echo "--- $c"; "$J28/bin/javap" -v -p -cp "$W/s" "$c" 2>&1 | q | grep -A2 -E '^ (final )?long cents;' | grep -E 'cents|flags' ; done } > "$OUT/03-strict-init-flags.txt" { echo "# 04-pem-encodings (JEP 542): PemRoundTrip.java" echo "--- JDK 28, no flags:"; "$J28/bin/javac" -d "$W/p28" src/PemRoundTrip.java 2>&1 | q; "$J28/bin/java" -cp "$W/p28" PemRoundTrip 2>&1 | q echo "--- JDK 25, no flags:"; "$J25/bin/javac" -d "$W/p25" src/PemRoundTrip.java 2>&1 | q | head -3 echo "--- JDK 25, --enable-preview:"; "$J25/bin/javac" --enable-preview --release 25 -d "$W/p25" src/PemRoundTrip.java 2>&1 | q | grep -v '^Note:'; "$J25/bin/java" --enable-preview -cp "$W/p25" PemRoundTrip 2>&1 | q } > "$OUT/04-pem-encodings.txt" { echo "# 05-json-incubator (JEP 540): JsonDemo.java on JDK 28" echo "--- module and API surface:"; "$J28/bin/java" --describe-module jdk.incubator.json 2>&1 | q | head -3 "$J28/bin/javap" --module jdk.incubator.json -public jdk.incubator.json.Json 2>&1 | q | grep -E 'parse|toDisplay' echo "--- without --add-modules:"; "$J28/bin/javac" -d "$W/j" src/JsonDemo.java 2>&1 | q | head -2 echo "--- with --add-modules jdk.incubator.json:" "$J28/bin/javac" --add-modules jdk.incubator.json -d "$W/j" src/JsonDemo.java 2>&1 | q | grep -v -E '^(Note:|warning:|1 warning)' "$J28/bin/java" --add-modules jdk.incubator.json -cp "$W/j" JsonDemo 2>&1 | q | grep -v '^WARNING' } > "$OUT/05-json-incubator.txt" { echo "# 06-shenandoah (JEP 535: generational mode by default)" echo "--- JDK 28 EA build, -XX:+UseShenandoahGC:"; "$J28/bin/java" -XX:+UseShenandoahGC -Xlog:gc=info -version 2>&1 | q | head -2 echo "--- JDK 25 Temurin, -XX:+UseShenandoahGC -Xlog:gc*:"; "$J25/bin/java" -XX:+UseShenandoahGC -Xlog:gc*=info -version 2>&1 | q | grep -E 'Using Shenandoah|Mode:' } > "$OUT/06-shenandoah.txt" cat > "$OUT/07-jep-status.txt" <<'EOT' # 07-jep-status (quoted from published articles on 2026-09-28; NOT produced by running code; status changes weekly) InfoQ, "JDK 27 and JDK 28: What We Know So Far" (https://www.infoq.com/news/2026/08/java-27-so-far/), August 2026: Targeted to JDK 28: JEP 541 Deprecate the macOS/x64 Port for Removal; JEP 540 Simple JSON API (Incubator); JEP 539 Strict Field Initialization in the JVM (Preview); JEP 535 Shenandoah GC: Generational Mode by Default; JEP 401 Value Objects (Preview) Proposed to target: JEP 542 PEM Encodings of Cryptographic Objects "Scheduled for a GA release in March 2027" Inside.java, 2026-09-20 (https://inside.java/2026/09/20/jep401-target-jdk28/): "JEP targeted to JDK 28: 401: Value Objects (Preview)" EOT ls -1 "$OUT"