#!/bin/sh set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" echo "=== Building j3270 Terminal Emulator ===" # 1. Locate Java toolchain JAVAC_BIN="" JAR_BIN="" if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/javac" ] && [ -x "$JAVA_HOME/bin/jar" ]; then JAVAC_BIN="$JAVA_HOME/bin/javac" JAR_BIN="$JAVA_HOME/bin/jar" elif command -v javac >/dev/null 2>&1 && command -v jar >/dev/null 2>&1; then JAVAC_BIN="$(command -v javac)" JAR_BIN="$(command -v jar)" else # Check common SDKMAN / macOS / Linux JDK locations for h in "$HOME/.sdkman/candidates/java/current" \ /usr/lib/jvm/java-21-openjdk* \ /usr/lib/jvm/java-17-openjdk* \ /usr/lib/jvm/java-11-openjdk* \ /usr/lib/jvm/default-java \ /Library/Java/JavaVirtualMachines/*/Contents/Home; do if [ -d "$h" ] && [ -x "$h/bin/javac" ] && [ -x "$h/bin/jar" ]; then export JAVA_HOME="$h" JAVAC_BIN="$JAVA_HOME/bin/javac" JAR_BIN="$JAVA_HOME/bin/jar" break fi done fi if [ -z "$JAVAC_BIN" ] || [ -z "$JAR_BIN" ]; then echo "ERROR: Java development tools (javac, jar) could not be found." echo "Please install JDK 11+ or set JAVA_HOME." exit 1 fi echo "Using Java compiler: $JAVAC_BIN" echo "Using JAR utility: $JAR_BIN" BUILD_DIR="$SCRIPT_DIR/build" rm -rf "$BUILD_DIR/lib3270j" "$BUILD_DIR/j3270" "$BUILD_DIR/MANIFEST.MF" mkdir -p "$BUILD_DIR/lib3270j" "$BUILD_DIR/j3270" # 2. Compile lib3270j echo "Compiling lib3270j..." find "$SCRIPT_DIR/lib3270j/src/main/java" -name "*.java" > "$BUILD_DIR/lib_sources.txt" if [ ! -s "$BUILD_DIR/lib_sources.txt" ]; then echo "ERROR: No sources found in lib3270j/src/main/java" exit 1 fi "$JAVAC_BIN" -d "$BUILD_DIR/lib3270j" @"$BUILD_DIR/lib_sources.txt" # 3. Compile j3270 echo "Compiling j3270 application..." find "$SCRIPT_DIR/j3270/src/main/java" -name "*.java" > "$BUILD_DIR/app_sources.txt" if [ ! -s "$BUILD_DIR/app_sources.txt" ]; then echo "ERROR: No sources found in j3270/src/main/java" exit 1 fi "$JAVAC_BIN" -cp "$BUILD_DIR/lib3270j" -d "$BUILD_DIR/j3270" @"$BUILD_DIR/app_sources.txt" # Clean up temporary source lists rm -f "$BUILD_DIR/lib_sources.txt" "$BUILD_DIR/app_sources.txt" # Copy any resources if present if [ -d "$SCRIPT_DIR/j3270/src/main/resources" ]; then cp -r "$SCRIPT_DIR/j3270/src/main/resources/"* "$BUILD_DIR/j3270/" 2>/dev/null || true fi if [ -d "$SCRIPT_DIR/lib3270j/src/main/resources" ]; then cp -r "$SCRIPT_DIR/lib3270j/src/main/resources/"* "$BUILD_DIR/lib3270j/" 2>/dev/null || true fi # 4. Package executable JAR echo "Packaging j3270.jar..." printf "Manifest-Version: 1.0\nMain-Class: haus.nightmare.j3270.J3270App\nImplementation-Title: j3270\nImplementation-Version: 0.1.0\nCreated-By: j3270 build_all.sh\n\n" > "$BUILD_DIR/MANIFEST.MF" "$JAR_BIN" cvfm "$BUILD_DIR/j3270.jar" "$BUILD_DIR/MANIFEST.MF" \ -C "$BUILD_DIR/lib3270j" . \ -C "$BUILD_DIR/j3270" . > /dev/null echo "=== Build Complete ===" echo "Executable JAR created: $BUILD_DIR/j3270.jar" ls -lh "$BUILD_DIR/j3270.jar" # 5. Compile and run tests if requested if [ "$1" = "test" ] || [ "$1" = "check" ]; then echo "=== Running Tests ===" TEST_BUILD_DIR="$BUILD_DIR/test-classes" mkdir -p "$TEST_BUILD_DIR" JUNIT_CP=$(find "$HOME/.gradle/caches/modules-2/files-2.1/" -name "*.jar" 2>/dev/null | grep -E "junit|opentest|apiguardian" | tr "\n" ":" || true) FULL_CP="$BUILD_DIR/lib3270j:$BUILD_DIR/j3270:$JUNIT_CP" find "$SCRIPT_DIR/lib3270j/src/test/java" -name "*.java" > "$BUILD_DIR/test_sources.txt" 2>/dev/null || true if [ -d "$SCRIPT_DIR/j3270/src/test/java" ]; then find "$SCRIPT_DIR/j3270/src/test/java" -name "*.java" >> "$BUILD_DIR/test_sources.txt" 2>/dev/null || true fi if [ -s "$BUILD_DIR/test_sources.txt" ] && [ -n "$JUNIT_CP" ]; then echo "Compiling tests..." "$JAVAC_BIN" -cp "$FULL_CP" -d "$TEST_BUILD_DIR" @"$BUILD_DIR/test_sources.txt" rm -f "$BUILD_DIR/test_sources.txt" echo "Executing tests with JUnit Platform..." cat << 'EOF' > "$BUILD_DIR/TestRunner.java" import org.junit.platform.launcher.*; import org.junit.platform.launcher.core.*; import org.junit.platform.launcher.listeners.*; import org.junit.platform.engine.discovery.*; import static org.junit.platform.engine.discovery.DiscoverySelectors.*; import java.io.PrintWriter; public class TestRunner { public static void main(String[] args) { LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() .selectors( selectPackage("haus.nightmare.lib3270j.graphics"), selectPackage("haus.nightmare.lib3270j.datastream"), selectPackage("haus.nightmare.lib3270j.screen"), selectPackage("haus.nightmare.lib3270j.protocol") ) .build(); Launcher launcher = LauncherFactory.create(); SummaryGeneratingListener listener = new SummaryGeneratingListener(); launcher.registerTestExecutionListeners(listener); launcher.execute(request); TestExecutionSummary summary = listener.getSummary(); summary.printTo(new PrintWriter(System.out)); summary.printFailuresTo(new PrintWriter(System.err)); if (summary.getTotalFailureCount() > 0) { System.exit(1); } } } EOF "$JAVAC_BIN" -cp "$FULL_CP:$TEST_BUILD_DIR" -d "$BUILD_DIR" "$BUILD_DIR/TestRunner.java" JAVA_BIN_EXEC="${JAVA_HOME:+$JAVA_HOME/bin/java}" JAVA_BIN_EXEC="${JAVA_BIN_EXEC:-java}" "$JAVA_BIN_EXEC" -cp "$FULL_CP:$TEST_BUILD_DIR:$BUILD_DIR" TestRunner fi fi