Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .sdkmanrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=17.0.17.fx-zulu
java=25.0.5.0+8-tem
37 changes: 14 additions & 23 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,24 @@
# Stages:
# 1. Builder Stage: Compiles the application and resolves dependencies. Produces
# JAR files that can be deployed.
# 1a. Install dependencies
# 1a. Drop root
# 1b. Build the application
# 2. Runner Stage: Creates a lightweight image that runs the application using the JRE.

FROM ubuntu:noble-20251013 AS builder
# Keep the JDK in sync with .sdkmanrc, which pins the same version for
# local development.
FROM eclipse-temurin:25.0.4.1_1-jdk-noble AS builder
WORKDIR /app
# sdkman requires bash
SHELL ["/bin/bash", "-c"]
ARG GRADLE_BUILD_ARGS="-PdisableSigning=true"

# Stage 1a: Install dependencies
# Install necessary tools, then drop root. The base image ships a
# pre-created "ubuntu" user (uid 1000, the same one the runner stage
# below renames to "engine") — reuse it so Gradle doesn't run as root,
# which ignores POSIX permission bits and breaks tests that depend on
# them (e.g. Log4jMigrationsTest's read-only-file assertion).
RUN apt-get update\
&& apt-get install -y zip curl\
&& rm -rf /var/lib/apt/lists/* \
&& chown ubuntu:ubuntu /app
# Stage 1a: Drop root. The base image ships a pre-created "ubuntu" user
# (uid 1000, the same one the runner stage below renames to "engine")
# — reuse it so Gradle doesn't run as root, which ignores POSIX
# permission bits and breaks tests that depend on them (e.g.
# Log4jMigrationsTest's read-only-file assertion).
RUN chown ubuntu:ubuntu /app
USER ubuntu

COPY --chown=ubuntu:ubuntu .sdkmanrc .
RUN curl -s "https://get.sdkman.io?ci=true" | bash \
&& source "$HOME/.sdkman/bin/sdkman-init.sh" && sdk env install

# Stage 1b: Build the application
# Copy the entire source tree (excluding .dockerignore files), and build
# (file encoding is pinned to UTF-8 in gradle.properties)
Expand All @@ -41,8 +33,7 @@ COPY --chown=ubuntu:ubuntu . .
RUN mkdir -p /home/ubuntu/.gradle
RUN --mount=type=cache,target=/home/ubuntu/.gradle/caches,sharing=locked,uid=1000,gid=1000 \
--mount=type=cache,target=/home/ubuntu/.gradle/wrapper,sharing=locked,uid=1000,gid=1000 \
source "$HOME/.sdkman/bin/sdkman-init.sh" \
&& ./gradlew --no-daemon build :smoketest:installHarnessDist ${GRADLE_BUILD_ARGS}
./gradlew --no-daemon build :smoketest:installHarnessDist ${GRADLE_BUILD_ARGS}

# Stage 1c: Present artifacts for export if not running within docker
FROM scratch AS build-output-export
Expand All @@ -53,7 +44,7 @@ COPY --from=builder /app/donkey/build/test-results /app/donkey/build/test-result
COPY --from=builder /app/server/build/test-results /app/server/build/test-results/

# Stage 1d: Smoke Test Harness
FROM eclipse-temurin:21.0.9_10-jre-noble AS smoketest-harness
FROM eclipse-temurin:25.0.4.1_1-jre-noble AS smoketest-harness

COPY --from=builder /app/server/setup/server-lib /opt/engine/server-lib
COPY --from=builder /app/server/setup/extensions /opt/engine/extensions
Expand All @@ -72,7 +63,7 @@ ENTRYPOINT ["/bin/bash", "/harness/run-harness.sh"]
#
##########################################

FROM eclipse-temurin:21.0.9_10-jdk-noble AS jdk-run
FROM eclipse-temurin:25.0.4.1_1-jdk-noble AS jdk-run

RUN groupadd engine \
&& usermod -l engine ubuntu \
Expand Down Expand Up @@ -104,7 +95,7 @@ CMD ["./oieserver"]
#
##########################################

FROM eclipse-temurin:21.0.9_10-jre-alpine AS jre-run
FROM eclipse-temurin:25.0.4.1_1-jre-alpine AS jre-run

# Alpine does not include bash by default, so we install it
RUN apk add --no-cache bash
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ The **Open Integration Engine Project** is an open-source initiative committed t

## Building from Source

The build is driven by Gradle through the committed wrapper; the only prerequisite is JDK 17 (see [.sdkmanrc](.sdkmanrc)):
The build is driven by Gradle through the committed wrapper; the only prerequisite is JDK 25 (see [.sdkmanrc](.sdkmanrc)):

```bash
./gradlew build # full build + tests; distribution lands in server/setup
Expand Down
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ subprojects {

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
languageVersion = JavaLanguageVersion.of(25)
}
}

Expand All @@ -178,6 +178,7 @@ subprojects {
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
options.debug = true
options.release = 21
}
// Match Ant's javac invocation: -sourcepath defaults to srcdir, and
// annotation processors are discovered on the compile classpath
Expand Down Expand Up @@ -275,7 +276,7 @@ subprojects {

if (rootProject.coverageEnabled) {
apply plugin: 'jacoco'
jacoco { toolVersion = '0.8.8' }
jacoco { toolVersion = '0.8.16' }
tasks.withType(Test).configureEach { finalizedBy tasks.named('jacocoTestReport') }
tasks.named('jacocoTestReport') {
reports.xml.required = true
Expand Down
32 changes: 32 additions & 0 deletions ci/Dockerfile.rebase-alpine
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# syntax=docker/dockerfile:1.19.0
# SPDX-License-Identifier: MPL-2.0
# SPDX-FileCopyrightText: 2026 Mitch Gaffigan

###############################################################################
# Rebases the already-assembled server image onto a different alpine JRE.
###############################################################################
ARG OIE_IMAGE=oie-ci-server:local-alpine-temurin25
ARG JRE_IMAGE

FROM ${OIE_IMAGE} AS source
FROM ${JRE_IMAGE}

# Mirrors the jre-run stage of the root Dockerfile; keep the two in step.
RUN apk add --no-cache bash
RUN addgroup -S engine \
&& adduser -S -g engine engine \
&& mkdir -p /opt/engine/appdata \
&& chown -R engine:engine /opt/engine

WORKDIR /opt/engine

COPY --from=source --chown=engine:engine /opt/engine /opt/engine

VOLUME /opt/engine/appdata
VOLUME /opt/engine/custom-extensions

EXPOSE 8443

USER engine
ENTRYPOINT ["./configure-from-env"]
CMD ["./oieserver"]
8 changes: 4 additions & 4 deletions ci/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ A fixture case runs in every configuration by default. To limit it, add a
`configurations` file at the case root with one configuration name per line:

```text
alpine-temurin21-postgres
ubuntu-temurin21-postgres
alpine-temurin123-postgres
ubuntu-temurin123-postgres
```

### Parse Batch
Expand All @@ -96,7 +96,7 @@ messages/

Add a Compose file at `ci/configurations/<name>.compose.yml`. Configuration names
normally follow `<os>-<jvm>-<database>`, such as
`alpine-temurin21-postgres`.
`alpine-temurin123-postgres`.

The Compose file must:

Expand Down Expand Up @@ -127,7 +127,7 @@ ci/runtests.sh
Run one configuration:

```sh
ci/runtests.sh alpine-temurin21-derby
ci/runtests.sh alpine-temurin25-derby
```

To iterate against an already-running server, pass that server's admin password.
Expand Down
7 changes: 6 additions & 1 deletion ci/configurations/alpine-temurin21-derby.compose.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
services:
oie:
image: ${OIE_IMAGE}
build:
context: ..
dockerfile: Dockerfile.rebase-alpine
args:
OIE_IMAGE: ${OIE_IMAGE}
JRE_IMAGE: eclipse-temurin:21.0.9_10-jre-alpine
ports:
- "8443:8443"
healthcheck:
Expand Down
13 changes: 13 additions & 0 deletions ci/configurations/ubuntu-temurin25-derby.compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
services:
oie:
image: ${OIE_IMAGE}
ports:
- "8443:8443"
healthcheck:
test:
- CMD-SHELL
- bash -lc 'exec 3<>/dev/tcp/127.0.0.1/8443'
interval: 3s
timeout: 5s
retries: 30
start_period: 40s
3 changes: 3 additions & 0 deletions ci/run-configuration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ export HOST_UID="$(id -u)"
export HOST_GID="$(id -g)"
mkdir -p "$WORKSPACE/ci/test-results"

# To access the manually restored images (remove if we move to ghcr)
export BUILDX_BUILDER="${BUILDX_BUILDER:-$(docker context show)}"

compose=(docker compose -f "$1" -f ci/harness.compose.yml -p "oie-ci-${OIE_CONFIGURATION//[^a-z0-9-]/-}-$$")

cleanup() {
Expand Down
4 changes: 2 additions & 2 deletions ci/runtests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ set -euo pipefail

cd "$(dirname "${BASH_SOURCE[0]}")/.."

ALPINE_IMAGE="oie-ci-server:local-alpine-temurin21"
UBUNTU_IMAGE="oie-ci-server:local-ubuntu-temurin21"
ALPINE_IMAGE="oie-ci-server:local-alpine-temurin25"
UBUNTU_IMAGE="oie-ci-server:local-ubuntu-temurin25"

if [[ $# -gt 1 ]]; then
echo "Usage: $0 [configuration]" >&2
Expand Down
3 changes: 1 addition & 2 deletions client/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ tasks.register('devClient', JavaExec) {
workingDir = projectDir
classpath = sourceSets.main.runtimeClasspath
args 'https://localhost:8443', '0.0.0', 'admin', 'admin'
jvmArgs '-Dcom.sun.webkit.useHTTP2Loader=false',
'--add-modules=java.sql.rowset,javafx.controls,javafx.fxml',
jvmArgs '--add-modules=java.sql.rowset',
'--add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED',
'--add-exports=java.base/sun.security.provider=ALL-UNNAMED',
'--add-opens=java.base/java.lang=ALL-UNNAMED',
Expand Down
Binary file removed client/lib/openjfx.jar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ public void loadContent() {
content.append("This product includes software developed by the JDOM Project (http://www.jdom.org/).\n\n");
content.append("This product includes software developed by xerial.org (Taro L. Saito) (https://github.com/xerial/sqlite-jdbc).\n\n");
content.append("This product includes the SwingLabs SwingX library, copyright (c) 2005-2006 Sun Microsystems, Inc., licensed under the LGPL version 2.1 (http://www.gnu.org/licenses/lgpl-2.1.html).\n\n");
content.append("This product includes libraries from OpenJFX, which is licensed under the GNU General Public License version 2, with the Classpath Exception (http://openjdk.java.net/legal/gplv2+ce.html). The source code for OpenJFX is available at: http://jdk.java.net/openjfx/\n\n");

aboutContent.setText(content.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ public class BrandingConstants {
// The URL that is opened when clicking "Help" button in Administrator
public static String HELP_URL_LOCATION = "https://github.com/OpenIntegrationEngine/engine/discussions";

// The URL that is opened when clicking "System Requirements" button in the error dialog when an unsupported Java version is detected
public static final String SYSTEM_REQUIREMENTS_URL = "https://docs.openintegrationengine.org/engine/getting_started.html#system-requirements";

// The "More info" in Server settings "Provide usage statistics"
public static final String PRIVACY_URL = "https://github.com/openintegrationengine";
public static final String PRIVACY_TOOLTIP = "Privacy Information";
Expand Down

This file was deleted.

4 changes: 0 additions & 4 deletions client/src/main/java/com/mirth/connect/client/ui/Frame.java
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,6 @@
import com.mirth.connect.util.JavaScriptSharedUtil;
import com.mirth.connect.util.MigrationUtil;

import javafx.application.Platform;

/**
* The main content frame for the Mirth Client Application. Extends JXFrame and sets up all content.
*/
Expand Down Expand Up @@ -256,8 +254,6 @@ public class Frame extends JXFrame {
private static final int REFRESH_BLOCK_SIZE = 100;

public Frame() {
Platform.setImplicitExit(false);

// Load RSyntaxTextArea language support
LanguageSupportFactory.get().addLanguageSupport(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT, MirthJavaScriptLanguageSupport.class.getName());

Expand Down
26 changes: 0 additions & 26 deletions client/src/main/java/com/mirth/connect/client/ui/Mirth.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,12 @@
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.Desktop;
import java.io.IOException;
import java.util.prefs.Preferences;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
Expand Down Expand Up @@ -255,13 +253,6 @@ public static void initUIManager() {
* String[]
*/
public static void main(String[] args) {
var missingPrerequisite = ClientPrerequisites.getMissing();
if (missingPrerequisite != null) {
showUnsupportedJreDialog(missingPrerequisite);
System.exit(1);
return;
}

CommandLineOptions opts = new CommandLineOptions(args);

if (StringUtils.isNotBlank(opts.getProtocols())) {
Expand All @@ -276,23 +267,6 @@ public static void main(String[] args) {
start(opts.getServer(), opts.getVersion(), opts.getUsername(), opts.getPassword());
}

private static void showUnsupportedJreDialog(String missingPrerequisite) {
try {
var message = String.format(
"%s Client requires %s%nPlease review the system requirements and try again.",
BrandingConstants.PRODUCT_NAME, missingPrerequisite);
var options = new Object[] { "View System Requirements", "Exit" };
var result = JOptionPane.showOptionDialog(
null, message, "Unsupported Java Runtime", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, options, options[0]);

if (result == 0) {
Desktop.getDesktop().browse(java.net.URI.create(BrandingConstants.SYSTEM_REQUIREMENTS_URL));
}
} catch (Throwable t) {
System.err.println(String.format("Missing prerequisite: %s", missingPrerequisite));
}
}

private static void start(final String server, final String version, final String username, final String password) {
// disable the velocity logging
Logger velocityLogger = LogManager.getLogger(RuntimeConstants.DEFAULT_RUNTIME_LOG_NAME);
Expand Down
Loading
Loading