IM 7.2.0 → 7.3.0 — Internal/Framework Details Part 2 (§20+)

Appendix — Internal / IM Framework Details (Part 2: §20+)

Parent doc: upgrade-migration-guide-to-im-7-3-0.md
Confluence mirror: IM 7.2 → 7.3.0 — Appendix — Internal / IM Framework Details (Part 2: §20+)

Internal-only — IM framework developer reference. Customer integrators can skip this section.


20. Vavr 0.9.3 → 1.0.0

Impact: MEDIUM-HIGH | Type: API

20.1 Migration Path: 0.9.3 → 0.10.x → 0.11.0 → 1.0.0

Research reveals the upgrade path is smoother than the major version suggests:

  • 0.10.0 is "fully backward compatible to 0.9.3" per Vavr documentation.

  • 0.10.5: Full JPMS support, replaced synchronized with reentrant locks (virtual thread friendly).

  • 0.11.0: Only removal is experimental Task API. New additions: Either/Validation.cond(), Value.mapTo(), Try.toEither(Throwable -> L).

  • 1.0.0 is "a version bump and nothing more" — drop-in replacement for 0.11.0.

  • 1.0.1: Fixes HashMap serialization bug across JVM restarts (enums using Object.hashCode()).

Area

Change

Impact for IM

Try

API fully compatible — Try.of(), .getOrElseThrow(), .toEither()

LOW

Either

API fully compatible

LOW

Option

API fully compatible

LOW

Match/Case

API.$(), API.Case(), API.Match() — signatures unchanged

LOW

Tuple

Tuple2._1, Tuple2._2 field access — unchanged

LOW

Collections

No breaking changes for IM patterns

LOW

Package

Remains io.vavr.*

LOW

20.2 IM Usage Patterns (from codebase scan)

Vavr is used extensively:

  • Converter classes: Try.of(() -> ...).getOrElseThrow() (StringToDecimal, StringToInteger, etc.)

  • Connection handling: Try.of() with fallback

  • MapperConfigurationService: Option with Match/Case pattern matching

  • EventsRepository: static io.vavr.API.$, Case, Match imports

  • API actions: Tuple2 in DMMassEdit, MPLCalculate, MPLIntegrateItems

  • Security: Tuple2<RequestMatcher, AuthenticationManager> in authentication resolver

IM Impact (Applied in Branch)

  • No Vavr-specific code changes visible in the diff — the upgrade appears API-compatible for IM's usage patterns.

  • Risk: Vavr 1.0.0 may have subtle behavioral changes. Thorough testing of all converter classes and Match/Case patterns is critical.


21. JSqlParser 1.1 → 5.3

Impact: HIGH | Type: Complete API rewrite

21.1 Package Relocations / Removals

Old Class

New / Status

Notes

net.sf.jsqlparser.statement.select.Select

Merged into PlainSelect

Select no longer wraps PlainSelect

net.sf.jsqlparser.statement.select.SelectExpressionItem

SelectItem

Consolidated

net.sf.jsqlparser.statement.select.SubSelect

Removed

Use PlainSelect

net.sf.jsqlparser.statement.select.AllTableColumns

Changed

Different API

net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor

Removed

Use ExpressionVisitorAdapter

net.sf.jsqlparser.expression.operators.relational.MultiExpressionList

Changed

Use ExpressionList / ParenthesedExpressionList

net.sf.jsqlparser.expression.Parenthesis

Changed

Use ParenthesedExpressionList

net.sf.jsqlparser.util.deparser.ExpressionDeParser

Constructor changed

SelectDeParser no longer requires ExpressionDeParser

StatementVisitor (interface)

StatementVisitorAdapter

Default implementations

Many individual visit() methods

Removed from visitor

Consolidated into adapter pattern

21.2 Visitor Pattern Overhaul

JSqlParser 5.x completely rewrote the visitor pattern:

  • ExpressionVisitorExpressionVisitorAdapter with default no-op implementations

  • StatementVisitorStatementVisitorAdapter

  • Many specific statement visit methods removed (e.g., visit(Alter), visit(Commit), visit(CreateTable), visit(Delete), visit(Drop), visit(Execute), visit(Insert), visit(Merge), visit(Replace), visit(Truncate), visit(Update), visit(Upsert))

  • ExpressionDeParser constructor simplified — no longer requires SelectVisitor

IM Impact (Applied in Branch)

SQLSelectUtils.java — Completely refactored:

Java
// Old (JSqlParser 1.1)
if (statement instanceof Select) {
    Select selectStatement = (Select) statement;
    PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody();
    ExpressionDeParser expressionDeParser = new ExpressionDeParser();
    StringBuilder stringBuffer = new StringBuilder();
    expressionDeParser.setBuffer(stringBuffer);
    SelectDeParser deParser = new SelectDeParser(expressionDeParser, stringBuffer);
    expressionDeParser.setSelectVisitor(deParser);
    ...
}

// New (JSqlParser 5.3)
if (statement instanceof PlainSelect plainSelect) {
    StringBuilder stringBuffer = new StringBuilder();
    SelectDeParser deParser = new SelectDeParser(stringBuffer);
    plainSelect.setSelectItems(countSelectItem());
    return plainSelect.toString();
}

ISqlExpressionDeParser.java — Major rewrite:

  • Removed 30+ individual visit() method overrides for statement types.

  • Migrated to StatementVisitorAdapter / ExpressionVisitorAdapter pattern.

  • RowConstructor generic signatures changed.

  • Unsupported expression detection refactored — strips proxy/mock suffixes from class names.

  • All JSqlParser package relocations applied.


22. Apache POI 4.1.2 → 5.5.1

Impact: HIGH | Type: API, Behavior

22.1 Breaking Changes

Change

Impact

OLE2NotOfficeXmlFileException removed/relocated

Cannot use try-catch pattern for XLS/XLSX detection

Stream closed on constructor failure in POI 5.x

new XSSFWorkbook(input) closes the input stream on failure — fallback to HSSFWorkbook(input) impossible

Cell.CELL_TYPE_* integer constants removed

Must use CellType enum (CellType.STRING, CellType.NUMERIC, etc.)

Cell.setCellType() removed

Use setCellValue() or similar specific methods

Alignment/fill constants replaced

CellStyle.ALIGN_CENTERHorizontalAlignment.CENTER, CellStyle.SOLID_FOREGROUNDFillPatternType.SOLID_FOREGROUND

poi-ooxml-schemas renamed to poi-ooxml-lite / poi-ooxml-full

Artifact change

com.monitorjbl.xlsx.StreamingReadercom.github.pjfanning.xlsx.StreamingReader

Package relocation (monitorjbl abandoned, pjfanning is maintained fork)

com.monitorjbl.xlsx.impl.StreamingCellcom.github.pjfanning.xlsx.impl.StreamingCell

Package relocation

FileMagic class introduced for format detection

New API for detecting XLS vs XLSX

22.2 Excel Format Detection Pattern Change

Before (POI 4.x):

Java
public Workbook resolveWorkbookType(InputStream input) throws IOException {
    try {
        return new XSSFWorkbook(input);
    } catch (OLE2NotOfficeXmlFileException e) {
        return new HSSFWorkbook(input);
    }
}

After (POI 5.x):

Java
public Workbook resolveWorkbookType(InputStream input) throws IOException {
    InputStream buffered = FileMagic.prepareToCheckMagic(input);
    FileMagic magic = FileMagic.valueOf(buffered);
    if (magic == FileMagic.OOXML) {
        return new XSSFWorkbook(buffered);
    }
    return new HSSFWorkbook(buffered);
}

IM Impact (Applied in Branch)

  • PfxExcelFormat.resolveWorkbookType() — Completely rewritten using FileMagic.

  • All StreamingReader imports changed (com.monitorjblcom.github.pjfanning) across 6 files:

    • PfxExcelPreviewParser.java

    • PfxExcelStreamingUnmarshal.java

    • XlsxDataloadPreviewParser.java

    • ValidateFileProcessor.java

    • DataloadFileProcessor.java

    • IoListFiles.java

  • OLE2NotOfficeXmlFileException import removed, replaced with FileMagic.


23. Fabric8 Kubernetes Client 6.13.4 → 7.6.1

Impact: MEDIUM | Type: API

Key Breaking Changes in 7.x

  • Default HTTP client changed from OkHttp to Vert.x. To keep OkHttp behavior, add kubernetes-httpclient-okhttp and exclude Vert.x.

  • Config#getKubeconfigFilename() renamed to getKubeconfigFilenames() (returns collection).

  • Default Pod readiness wait timeout changed from 5s to 0s. Use withReadyWaitTimeout(5000) to restore.

  • Removed: kubernetes-model artifact, openshift-server-mock module, SupportTestingClient interface, Config.errorMessages.

  • Client builder API: KubernetesClientBuilder method signatures changed.

  • Configuration: Some configuration methods renamed/removed.

  • Resource API: Resource interface methods changed.

  • BouncyCastle no longer needed for Kubernetes client.

IM Impact

  • Used in pricefx-integration module for Kubernetes operations (ConfigMapWatcherTaskSource.java, ContextWatcherAutoConfiguration.java). Uses kubernetesClient.configMaps().inNamespace().withLabel().list() pattern.

  • Version bumped in POM. HTTP client change and API renames need validation.


24. Jersey (JAX-RS) / Codegen Plugin

Impact: HIGH | Type: API (generated code)

Jersey Version Management

  • Versions now managed by Spring Boot BOM — no explicit version declarations.

  • jakarta.jws-api dependency removed.

  • jersey-media-jaxb added as explicit dependency.

Codegen Plugin 4.0.0 → 5.0.0

invokeAPI() method signature changed from 10 to 13 parameters:

Parameter

Old

New

operation


String operation (NEW)

path

String path

String path

method

String method

String method

queryParams

List<Pair>

List<Pair>

body

Object

Object

headerParams

Map<String, String>

Map<String, String>

cookieParams


Map<String, String> cookieParams (NEW)

formParams

Map<String, Object>

Map<String, Object>

accept

String

String

contentType

String

String

authNames

String[]

String[]

returnType

GenericType<T>

GenericType<T>

isBodyNullable


boolean isBodyNullable (NEW)

Other Codegen Changes

  • library=jersey2 configuration removed from plugin config (now default).

  • javax.annotationjakarta.annotation replacer plugin deleted — codegen generates Jakarta natively.

  • API spec updated to api-2026-03-19-sorted.json.

IM Impact (Applied in Branch)

  • All invokeAPI() calls in PriceFxApiClient and test expectations updated to 13-parameter signature.

  • setContentLengthForEmptyPost() helper method removed (no longer needed).

  • javax.ws.rs.core.GenericType moved to string-based Groovy sandbox whitelist (not on compile classpath anymore).

  • New classes added to Groovy sandbox: CustomInstantDeserializer, OAuth, OAuthFlow.


25. Mockito 3.11.2 → 5.21.0

Impact: MEDIUM | Type: Testing API

Breaking Changes

Change

Version

mockito-inline merged into mockito-core

5.0

Java 11+ required

5.0

Stricter stubbing by default — UnnecessaryStubbingException for unused stubs

5.0

@Mock annotation requires MockitoAnnotations.openMocks() or extension

5.0

Inline mock maker is the default

5.0

Mockito.framework().clearInlineMock(obj) — new API

5.0

IM Impact (Applied in Branch)

  • mockito-core added as explicit test dependency in pricefx-client.

  • MockitoAnnotations import added in some tests.


27. WireMock 3.9.1 → 3.13.2

Impact: MEDIUM | Type: Testing, Artifact

Artifact Change

  • Old: org.wiremock:wiremock and org.wiremock:wiremock-jetty12 (separate artifacts).

  • New: org.wiremock:wiremock-standalone (single artifact, embeds Jetty).

IM Impact (Applied in Branch)

  • All modules changed from wiremock/wiremock-jetty12 to wiremock-standalone.

  • im-commons-utils and im-commons-tests exclusions for wiremock-jetty12 removed.

  • Various test assertions updated.


28. Jolokia 1.6.2 → 2.5.0

Impact: MEDIUM | Type: API rewrite, artifact rename

Major version bump (1.x → 2.x) with API rewrite. Artifact changed: jolokia-corejolokia-support-springboot3 for native Spring Boot 3 integration. The /jolokia actuator endpoint stays available; downstream JMX scrapers and monitoring tools may need adjustment for the new agent configuration format and response shape.


29. Eclipse JGit 6.7.0 → 7.5.0

Impact: LOW | Type: API

Major version bump. IM uses JGit only transitively via im-git-server-git-logic — no direct IM code change required.


30. Flyway 9.x → 11.x

Impact: LOW for IM (transitive only) | Type: Major version bump via Spring Boot BOM

Crosses Flyway 10 (Java 17+ baseline) and 11 (group-id org.flywaydborg.flyway, database-specific modules now required: flyway-database-postgresql, flyway-database-mysql, etc.). IM has no direct Flyway dependency. Customers running their own Flyway migrations alongside IM must add the matching flyway-database-* module and verify Java 17+ baseline.


31. AspectJ 1.9.7 → 1.9.25.1

Impact: MEDIUM (build only) | Type: Maven plugin vendor change

Plugin migrated from abandoned org.codehaus.mojo:aspectj-maven-plugin:1.14.0 to the maintained fork dev.aspectj:aspectj-maven-plugin:1.14 for Java 21 compatibility. Group-id and version changed in parent POM and pricefx-client/pom.xml. Forks of the IM build must update their plugin coordinates accordingly.


32. AWS SDK 2.15.50 → 2.42.13

Impact: MEDIUM | Type: API improvements

Key Changes

  • 2.30.0+: Multipart upload calls ContentStreamProvider::newStream() twice — breaks code assuming single call.

  • 2.30.1+: Content-length error with explicit contentLength in multipart PUT via transfer manager.

  • 2.21.16+: Presigned URL signature changed with endpointOverride + HTTP address (breaks MinIO).

  • S3 client improvements (chunked upload, multipart).

  • Credential provider patterns updated.

IM Impact (Applied in Branch)

  • PfxS3IT test assertion fixed for chunked S3 upload behavior change.


35. Lombok 1.18.30 → 1.18.44

Impact: LOW-MEDIUM | Type: Compilation, Behavior

  • Java 21 compatibility. Requires --add-opens JVM arguments for annotation processing (added to maven-compiler-plugin).

  • BREAKING (1.18.38+): Lombok stopped automatically copying Jackson annotations (@JsonProperty, @JsonIgnore, etc.) from fields to generated accessors. If IM relies on this, restore with lombok.copyJacksonAnnotationsToAccessors = true in lombok.config.


36. Logstash Logback Encoder / Logback / SLF4J

Impact: MEDIUM | Type: Configuration

Changes (verified against git diff v7.2.0..v7.3.0)

  • integration-logging/src/main/resources/logback-spring.xml was rewritten (was a 6-line shell that included three external appender XMLs; now ~109 lines with appender configuration inlined and conditional blocks for cloud-logging / logstash / debug). New <contextListener> for the audit prop listener and <springProperty> bindings for LOGSTASH_ENABLED, CLOUD_LOGGING, LOGBACK_DEBUG.

  • integration-apps/integration-runner-app/src/main/resources/logback.xml is new in v7.3.0 (105 lines) — runner-specific logback config.

  • integration-logging/src/main/resources/logback-cloud.xml is new in v7.3.0 — cloud-logging appender pulled out of the previous shell include.

  • integration-logging/src/main/resources/net/pricefx/integration/logging/logstash-appender.xml: gained defaultValue="5 minutes" on KEEP_ALIVE_DURATION (safety for unset config).

  • Conditional blocks (<if>) require the janino dependency, added to the integration-logging module.

  • logback-classic explicit dependency removed from integration-api (now managed by Spring Boot).

  • XML resource filtering explicitly disabled for *.xml files in integration-apps/integration-runner-app to prevent Maven from mangling logback config.


37. Build Tooling Changes

Maven Plugins Updated

Plugin

Old Version

New Version

Notes

maven-compiler-plugin

3.13.0

3.15.0

<fork>true</fork> added, --add-opens flags

maven-resources-plugin

3.0.2

3.4.0


maven-surefire-plugin

2.22.2

3.5.4

Major — uses JUnit Platform by default

maven-failsafe-plugin

2.22.2

3.5.4

Major — uses JUnit Platform by default

maven-source-plugin

3.2.x

3.4.0

Centralized in parent POM

maven-dependency-plugin

3.3.0

3.10.0


maven-checkstyle-plugin

3.0.0

3.6.0


checkstyle (engine)

8.12

10.24.0

Major — new rules, Java 17+ syntax

jacoco-maven-plugin

0.8.10

0.8.14


gmavenplus-plugin

1.13.1

4.2.1

Major — requires explicit goals and targetBytecode

sonar-maven-plugin

3.7.0.1746

5.5.0.6356


cyclonedx-maven-plugin

2.7.1

2.9.1


wagon-webdav-jackrabbit

3.2.0

3.5.3


aspectj-maven-plugin

1.14.0 (codehaus)

1.14 (dev.aspectj)

Group change

Surefire/Failsafe 2.x → 3.x Impact

  • Uses JUnit Platform by default for test discovery.

  • junit-platform-launcher dependency added.

  • --fail-at-end added to CI test commands.

GmavenPlus 1.x → 4.x Impact

  • <targetBytecode>21</targetBytecode> configuration required.

  • Goals must be explicitly listed in executions.

Checkstyle 8.12 → 10.24.0 Impact

  • Many new rules enabled by default.

  • Java 17+ syntax support.

  • May flag new violations in existing code.

38. Migration Tools

Camel Upgrade Recipes (OpenRewrite)

Apache provides automated migration recipes:

Bash
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=org.apache.camel.upgrade:camel-upgrade-recipes:LATEST \
  -DactiveRecipes=org.apache.camel.upgrade.CamelMigrationRecipe

This assists with (but does NOT fully automate) Camel property renames, DSL changes, and component migrations. Manual review is required.

Spring Boot Properties Migrator

Add temporarily during migration to get runtime warnings about deprecated properties:

XML
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

Remove after migration is verified.