From bec3db89f2a47265b15af9bc3396a43c9e7dc9e5 Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 2 Feb 2026 17:23:36 -0500 Subject: [PATCH 1/2] BREAKING CHANGE: update spring boot version 4.0.2 and java version 21 --- .github/workflows/main.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- README.md | 6 ++--- build.gradle | 7 +++--- dependencyMgmt.gradle | 7 ++++-- ecs-core/build.gradle | 5 +--- .../infra/config/LoggerEcsInitializer.java | 6 +++++ ecs-imperative/build.gradle | 2 ++ .../filter/ImperativeLogsHandler.java | 3 ++- .../ImperativeLogsHandlerTest.java | 4 +++- ecs-reactive/build.gradle | 2 ++ .../filter/ReactiveLogsHandler.java | 23 +++++++++++++++---- gradle.properties | 2 +- main.gradle | 8 ++++++- 14 files changed, 58 insertions(+), 25 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7dfc2bb..bf66889 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,11 +51,11 @@ jobs: if: ${{ env.COMPONENT_VERSION == '' }} run: echo "COMPONENT_VERSION=${{ steps.short_sha.outputs.version_tag }}-SNAPSHOT" >> $GITHUB_ENV - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: temurin - java-version: 17 + java-version: 21 - name: Grant execute permission for gradlew run: chmod +x ./gradlew diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d9e264a..9fb4ed3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,11 +52,11 @@ jobs: name: Release Bot email: release-bot@bancolombia.com.co - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 17 + java-version: 21 - name: Grant execute permission for gradlew run: chmod +x gradlew diff --git a/README.md b/README.md index d60cf93..e3c5538 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The library is composed of four main modules: ## **Prerequisites** -**Java:** Version 17 or higher. +**Java:** Version 21 or higher. **Gradle:** For dependency management. ## Getting Started @@ -71,8 +71,8 @@ subprojects { compileJava.dependsOn validateStructure java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } //build.dependsOn 'pitest' diff --git a/build.gradle b/build.gradle index b7258ac..180f946 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,7 @@ buildscript { ext { - cleanArchitectureVersion = '3.20.15' - springBootVersion = '3.5.5' - springCoreVersion = '6.2.11' + cleanArchitectureVersion = '4.0.4' + springBootVersion = '4.0.2' sonarVersion = '6.0.1.5171' jacocoVersion = '0.8.12' pitestVersion = '1.15.0' @@ -13,6 +12,8 @@ buildscript { log4jVersion = '2.24.3' commonslang3= '3.18.0' nettyVersion = '4.1.127.Final' + logbackVersion = '1.5.19' + tomcatEmbedCoreVersion = "10.1.47" } } diff --git a/dependencyMgmt.gradle b/dependencyMgmt.gradle index 74be5a0..5faf2c2 100644 --- a/dependencyMgmt.gradle +++ b/dependencyMgmt.gradle @@ -16,8 +16,11 @@ configurations.configureEach { if (details.requested.group == 'io.netty' && details.requested.name == 'netty-codec-http') { details.useVersion("${nettyVersion}") } - if (details.requested.group == 'org.springframework' && details.requested.name == 'spring-core') { - details.useVersion("${springCoreVersion}") + if (details.requested.group == 'ch.qos.logback') { + details.useVersion("${logbackVersion}") + } + if (details.requested.group == 'org.apache.tomcat.embed' && details.requested.name == 'tomcat-embed-core') { + details.useVersion("${tomcatEmbedCoreVersion}") } } } \ No newline at end of file diff --git a/ecs-core/build.gradle b/ecs-core/build.gradle index 9216c38..82477f3 100644 --- a/ecs-core/build.gradle +++ b/ecs-core/build.gradle @@ -5,10 +5,7 @@ dependencies { implementation "org.apache.logging.log4j:log4j-core:${log4jVersion}" // Spring configuration - implementation("org.springframework.boot:spring-boot-autoconfigure:${springBootVersion}") { - // Exclude to minimize transitive dependencies if not needed - exclude group: 'org.springframework.boot', module: 'spring-boot-starter' - } + implementation("org.springframework.boot:spring-boot") } ext { diff --git a/ecs-core/src/main/java/co/com/bancolombia/ecs/infra/config/LoggerEcsInitializer.java b/ecs-core/src/main/java/co/com/bancolombia/ecs/infra/config/LoggerEcsInitializer.java index 4b806c3..ac8c080 100644 --- a/ecs-core/src/main/java/co/com/bancolombia/ecs/infra/config/LoggerEcsInitializer.java +++ b/ecs-core/src/main/java/co/com/bancolombia/ecs/infra/config/LoggerEcsInitializer.java @@ -1,6 +1,7 @@ package co.com.bancolombia.ecs.infra.config; import co.com.bancolombia.ecs.helpers.SamplingHelper; +import lombok.extern.log4j.Log4j2; import org.springframework.context.annotation.Configuration; import java.util.Arrays; @@ -8,12 +9,17 @@ import java.util.stream.Collectors; @Configuration +@Log4j2 public class LoggerEcsInitializer { private static final String START_CODE_40X = "40"; private static final String START_CODE_20X = "20"; + private static final String VERSION_MESSAGE = "This application is built with Spring Boot {} and requires Java {}"; + private static final String SB_VERSION = "4.0.2"; + private static final String JAVA_VERSION = "21"; public LoggerEcsInitializer(SamplingConfig samplingConfig) { + log.info(VERSION_MESSAGE, SB_VERSION, JAVA_VERSION); Map rulesMap = buildRulesMap(samplingConfig); SamplingHelper.init(rulesMap); } diff --git a/ecs-imperative/build.gradle b/ecs-imperative/build.gradle index c3d4bc1..f00750f 100644 --- a/ecs-imperative/build.gradle +++ b/ecs-imperative/build.gradle @@ -16,6 +16,8 @@ dependencies { } testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}" + + implementation "com.fasterxml.jackson.core:jackson-databind" } ext { diff --git a/ecs-imperative/src/main/java/co/com/bancolombia/ecs/application/filter/ImperativeLogsHandler.java b/ecs-imperative/src/main/java/co/com/bancolombia/ecs/application/filter/ImperativeLogsHandler.java index 7e84b64..c1f73dc 100644 --- a/ecs-imperative/src/main/java/co/com/bancolombia/ecs/application/filter/ImperativeLogsHandler.java +++ b/ecs-imperative/src/main/java/co/com/bancolombia/ecs/application/filter/ImperativeLogsHandler.java @@ -29,6 +29,7 @@ @Order(Ordered.HIGHEST_PRECEDENCE) public class ImperativeLogsHandler extends OncePerRequestFilter { + private static final int MAX_PAYLOAD_SIZE = 1024 * 1024; private static final Set CONSUMER_ACRONYMS = Set.of("consumer-acronym", "code", "channel"); private static final String HANDLED_EXCEPTION_PROPERTY = "handledException"; private static final int MIN_REQUEST_ERROR_CODE = 400; @@ -69,7 +70,7 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull Ht return; } - var wrappedRequest = new ContentCachingRequestWrapper(request); + var wrappedRequest = new ContentCachingRequestWrapper(request, MAX_PAYLOAD_SIZE); var wrappedResponse = new ContentCachingResponseWrapper(response); try { diff --git a/ecs-imperative/src/test/java/co/com/bancolombia/ecs/application/ImperativeLogsHandlerTest.java b/ecs-imperative/src/test/java/co/com/bancolombia/ecs/application/ImperativeLogsHandlerTest.java index c3080f4..5f0df40 100644 --- a/ecs-imperative/src/test/java/co/com/bancolombia/ecs/application/ImperativeLogsHandlerTest.java +++ b/ecs-imperative/src/test/java/co/com/bancolombia/ecs/application/ImperativeLogsHandlerTest.java @@ -55,11 +55,13 @@ class ImperativeLogsHandlerTest { private ContentCachingRequestWrapper wrappedRequest; private ContentCachingResponseWrapper wrappedResponse; + private static final int MAX_PAYLOAD_SIZE = 1024 * 1024; + @BeforeEach void setUp() { mockRequest = new MockHttpServletRequest(); mockResponse = new MockHttpServletResponse(); - wrappedRequest = new ContentCachingRequestWrapper(mockRequest); + wrappedRequest = new ContentCachingRequestWrapper(mockRequest, MAX_PAYLOAD_SIZE); wrappedResponse = new ContentCachingResponseWrapper(mockResponse); imperativeLogsHandler = new ImperativeLogsHandler(ecsPropertiesConfig); } diff --git a/ecs-reactive/build.gradle b/ecs-reactive/build.gradle index f08efa4..f0da969 100644 --- a/ecs-reactive/build.gradle +++ b/ecs-reactive/build.gradle @@ -18,6 +18,8 @@ dependencies { // Reactor project implementation "io.projectreactor:reactor-core:${reactorVersion}" testImplementation "io.projectreactor:reactor-test:${reactorVersion}" + + implementation "com.fasterxml.jackson.core:jackson-databind" } ext { diff --git a/ecs-reactive/src/main/java/co/com/bancolombia/ecs/application/filter/ReactiveLogsHandler.java b/ecs-reactive/src/main/java/co/com/bancolombia/ecs/application/filter/ReactiveLogsHandler.java index 0be8093..51f9046 100644 --- a/ecs-reactive/src/main/java/co/com/bancolombia/ecs/application/filter/ReactiveLogsHandler.java +++ b/ecs-reactive/src/main/java/co/com/bancolombia/ecs/application/filter/ReactiveLogsHandler.java @@ -21,9 +21,11 @@ import reactor.core.scheduler.Schedulers; import reactor.util.annotation.NonNull; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; @Order(Ordered.HIGHEST_PRECEDENCE) public class ReactiveLogsHandler implements WebFilter { @@ -162,11 +164,22 @@ private void setRequestParameters(RequestLoggingDecorator decoratedRequest, LogR requestInfo.setMethod(decoratedRequest.getMethod().name()); requestInfo.setUrl(decoratedRequest.getURI().getPath()); - Map headers = DataSanitizer.sanitizeHeaders(decoratedRequest.getHeaders().entrySet(), - ecsPropertiesConfig.getAllowRequestHeaders()); - setConsumer(requestInfo, headers); - requestInfo.setMessageId(headers.get(MESSAGE_ID)); - requestInfo.setHeaders(headers); + Set>> headers = + decoratedRequest.getHeaders() + .toSingleValueMap() + .entrySet() + .stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + e -> List.of(e.getValue()) + )) + .entrySet(); + + Map sanitizeHeaders = DataSanitizer.sanitizeHeaders(headers, + ecsPropertiesConfig.getAllowRequestHeaders()); + setConsumer(requestInfo, sanitizeHeaders); + requestInfo.setMessageId(sanitizeHeaders.get(MESSAGE_ID)); + requestInfo.setHeaders(sanitizeHeaders); } private HttpStatus resolveHttpStatus(Throwable ex) { diff --git a/gradle.properties b/gradle.properties index d77ee66..ad710a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,5 +6,5 @@ metrics=true language=java org.gradle.parallel=true systemProp.sonar.gradle.skipCompile=true -version=1.0.1 +version=2.0.0 onlyUpdater=true \ No newline at end of file diff --git a/main.gradle b/main.gradle index c6a6ee2..f9398de 100644 --- a/main.gradle +++ b/main.gradle @@ -36,6 +36,11 @@ subprojects { } } developers { + developer { + id "avendanodanny" + name "Danny Farid AvendaƱo Ojeda" + email "dannyfuv@gmail.com" + } developer { id "RicharLeon" name "Richar Daniel Diaz Leon" @@ -118,7 +123,8 @@ subprojects { java { withJavadocJar() withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } javadoc { From 5b7058ff7ab960b6b6daa5eb1ae21a3511f185a4 Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 16 Feb 2026 11:15:23 -0500 Subject: [PATCH 2/2] update workflow for unused secrets from PRs --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bf66889..6c6023c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -22,6 +22,7 @@ jobs: steps: - name: Generate a token + if: github.event_name == 'push' id: generate_token uses: tibdex/github-app-token@v2 with: